//+------------------------------------------------------------------+ //| HardLevels.mq4 | //+------------------------------------------------------------------+ #property copyright "mqlservice.co.uk" #property link "http://mqlservice.co.uk/" // For detailed description please visit MQL Scripts section at http://mqlservice.co.uk/ #property indicator_chart_window #define EndBar 2 //---- input parameters extern int TimeFrame=0; extern int TolerancePips=3; extern int Hits=15; extern int StartBar=300; extern int LookBack=300; extern int AppliedPrice=0; extern int AppliedPriceExtra=1; extern bool UseFiltering=true; extern int FilterStrength=3; extern color LineColor=Blue; extern int LineWidth=1; extern string note0="Applied price 0-CLOSE | 1-OPEN | 2-HIGH | 3-LOW |"; extern string note1=" | 4-MEDIAN | 5-TYPICAL | 6-WEIGHTED |"; extern string note2 = "Time Frame 0=current time frame"; extern string note3 = "1=M1, 5=M5, 15=M15, 30=M30"; extern string note4 = "60=H1, 240=H4, 1440=D1"; extern string note5 = "10080=W1, 43200=MN1"; extern bool Force4DigitBrokers = true; //---- Symbol parameters string _symbol; double _point; int _digits; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { Print("HardLevels Ver.3"); Print("Copyright © 2009/06/02 MQL Service UK http://mqlservice.co.uk/"); _symbol=Symbol(); _digits = MarketInfo(_symbol, MODE_DIGITS); if(_digits == 0) _digits = 4; _point = MarketInfo(_symbol, MODE_POINT); if(NormalizeDouble(_point, _digits) == 0.0) _point = Point; if(Force4DigitBrokers) if(_digits==3||_digits>4) _point *= 10; switch(AppliedPrice){ case 1 : break; case 2 : break; case 3 : break; case 4 : break; case 5 : break; case 6 : break; default : AppliedPrice=PRICE_CLOSE; break; } switch(TimeFrame) { case 1 : break; case 5 : break; case 15 : break; case 30 : break; case 60 : break; case 240 : break; case 1440 : break; case 10080 : break; case 43200 : break; default : TimeFrame=Period(); break; } if(StartBar<1) StartBar=Bars-1; if(StartBar<0) StartBar=1; if(FilterStrength<1) FilterStrength=1; if(Hits<1) Hits=1; if(LookBack<Hits) LookBack=Hits; if(!UseFiltering) FilterStrength=0; return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- string name1="Hard Line "+FilterStrength+" "+TimeFrame; string name2; for(int i=ObjectsTotal(); i>=0; i--){ name2=ObjectName(i); if(StringSubstr(name2,0,StringLen(name1))==name1) ObjectDelete(name2); } //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { if(Bars<LookBack) return(0); int i, j, count; int start=StartBar; if(start>Bars-1) start=Bars-1; string name; double level; static datetime t=0; if(t<Time[0]) t=Time[0]; else return(0); for(i=0; i<start+1; i++) if(ObjectFind("Hard Line "+FilterStrength+" "+TimeFrame+" "+TimeToStr(Time[i]))>-1) ObjectDelete("Hard Line "+FilterStrength+" "+TimeFrame+" "+TimeToStr(Time[i])); double HL[]; if(ArraySize(HL)!=start+1) ArrayResize(HL,start+1); ArrayInitialize(HL,0); //---- main loop for(i=EndBar; i<start; i++){ count=1; level=CP(i, false); for(j=i; j<i+LookBack; j++){ if(MathAbs(CP(i, false)-CP(j, false))<=TolerancePips*_point){ count++; level +=CP(j, false); } else if(AppliedPriceExtra!=AppliedPrice) if(MathAbs(CP(i, false)-CP(j, true))<=TolerancePips*_point){ count++; level +=CP(j, true); } if(count>=Hits){ HL[i]=NormalizeDouble(level/count,Digits); break; } } } if(UseFiltering){ double A[]; int c[]; ArrayResize(A,start+1); ArrayInitialize(A,0); ArrayResize(c,start+1); ArrayInitialize(c,0); for(i=start-2; i>=EndBar; i--){ if(HL[i]>0){ c[i]++; A[i]=HL[i]; for(j=start-1; j>=0; j--){ if(i==j) continue; if(HL[j]>0) if(NormalizeDouble(MathAbs(HL[i]-HL[j]),Digits)<=_point*FilterStrength*FilterStrength){ A[i] +=HL[j]; c[i]++; } } A[i] /=c[i]; } } for(i=0; i<start; i++){ if(c[i]==0 || c[i+1]==0) continue; if(NormalizeDouble(MathAbs(A[i]-A[i+1]),Digits)>_point*FilterStrength*FilterStrength) continue; if(c[i]<c[i+1]){ c[i]=0; A[i]=0; } else{ c[i+1]=0; A[i+1]=0; i++; continue; } } bool done=false; while(!done){ done=true; for(i=0; i<start; i++){ if(NormalizeDouble(A[i],Digits)==0) continue; for(j=0; j<start; j++){ if(i==j) continue; if(NormalizeDouble(A[j],Digits)==0) continue; if(NormalizeDouble(MathAbs(A[i]-A[j]),Digits)<=_point*FilterStrength*FilterStrength){ if(c[i]<c[j]){ c[i]=0; A[i]=0; done=false; } else{ c[j]=0; A[j]=0; done=false; } } } } } for(i=0; i<start; i++){ if(c[i]==0) HL[i]=0; else HL[i]=A[i]; } } for(i=0; i<start; i++) if(HL[i]>0){ DL(HL[i], "Hard Line "+FilterStrength+" "+TimeFrame+" "+TimeToStr(Time[i]), Time[i]); } //---- done return(0); } void DL(double level, string name, datetime time) { if(ObjectFind(name)<0){ ObjectCreate(name, OBJ_HLINE, 0, time, level); ObjectSet(name, OBJPROP_COLOR, LineColor); ObjectSet(name, OBJPROP_BACK, true); ObjectSet(name, OBJPROP_RAY, true); ObjectSet(name, OBJPROP_WIDTH, LineWidth); } ObjectSet(name, OBJPROP_PRICE1, level); return; } double CP(int i, bool _s) { double result=-1; if(!_s && TimeFrame==Period()) switch(AppliedPrice){ case 1 : result=Open[i]; break; case 2 : result=High[i]; break; case 3 : result=Low[i]; break; case 4 : result=(High[i]+Low[i])/2; break; case 5 : result=(High[i]+Low[i]+Close[i])/3; break; case 6 : result=(High[i]+Low[i]+Close[i]+Close[i])/4; break; default : result=Close[i]; break; } if(_s && TimeFrame==Period()) switch(AppliedPriceExtra){ case 1 : result=Open[i]; break; case 2 : result=High[i]; break; case 3 : result=Low[i]; break; case 4 : result=(High[i]+Low[i])/2; break; case 5 : result=(High[i]+Low[i]+Close[i])/3; break; case 6 : result=(High[i]+Low[i]+Close[i]+Close[i])/4; break; default : result=Close[i]; break; } if(!_s && TimeFrame!=Period()) switch(AppliedPrice){ case 1 : result=iOpen(_symbol,TimeFrame,i); break; case 2 : result=iHigh(_symbol,TimeFrame,i); break; case 3 : result=iLow(_symbol,TimeFrame,i); break; case 4 : result=(iHigh(_symbol,TimeFrame,i)+iLow(_symbol,TimeFrame,i))/2; break; case 5 : result=(iHigh(_symbol,TimeFrame,i)+iLow(_symbol,TimeFrame,i)+iClose(_symbol,TimeFrame,i))/3; break; case 6 : result=(iHigh(_symbol,TimeFrame,i)+iLow(_symbol,TimeFrame,i)+iClose(_symbol,TimeFrame,i)+iClose(_symbol,TimeFrame,i))/4; break; default : result=iClose(_symbol,TimeFrame,i); break; } if(_s && TimeFrame!=Period()) switch(AppliedPriceExtra){ case 1 : result=iOpen(_symbol,TimeFrame,i); break; case 2 : result=iHigh(_symbol,TimeFrame,i); break; case 3 : result=iLow(_symbol,TimeFrame,i); break; case 4 : result=(iHigh(_symbol,TimeFrame,i)+iLow(_symbol,TimeFrame,i))/2; break; case 5 : result=(iHigh(_symbol,TimeFrame,i)+iLow(_symbol,TimeFrame,i)+iClose(_symbol,TimeFrame,i))/3; break; case 6 : result=(iHigh(_symbol,TimeFrame,i)+iLow(_symbol,TimeFrame,i)+iClose(_symbol,TimeFrame,i)+iClose(_symbol,TimeFrame,i))/4; break; default : result=iClose(_symbol,TimeFrame,i); break; } return(NormalizeDouble(result,Digits)); } //+---- Programmed by Rafal Dubiel @ MQLService.co.uk -----------------+
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains close prices for each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: