//+------------------------------------------------------------------+ //| Level Trading.mq4 | //| by Accel | //+------------------------------------------------------------------+ #property copyright "Accel" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Red #property indicator_color2 Blue //---- extern int IndicatorNumber=1; extern color TrendUpColor=Blue; extern color TrendDownColor=Red; extern color LevelColor=DarkGray; extern int Width2LevelConfirmation=3; extern int Width3LevelConfirmation=5; extern int Width4LevelConfirmation=7; extern int Width5LevelConfirmation=10; extern bool SnapExtremumsToLevelOnChar=True; extern int FractalBarsOnEachSide=7; extern int ProceedMaxHistoryBars=2000; extern int LevelActuality=200; extern bool RestDefaultTimeframeValues=True; extern int ExtremumToLevelMaxGap=15; extern double PriceDeltaFor1Bar=0.4; //---- int LevelLength[]; int LevelWidth[]; int PriceCrossedLevel; double Long[]; double Short[]; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() { IndicatorBuffers(2); SetIndexBuffer(0,Long); SetIndexBuffer(1,Short); return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int deinit() { int i=0; //---- for(i=Bars-1;i>=0;i--) if (ObjectFind(StringConcatenate("Level_",IndicatorNumber,"_",i))!=-1) ObjectDelete(StringConcatenate("Level_",IndicatorNumber,"_",i)); for(i=Bars-1;i>=0;i--) if (ObjectFind(StringConcatenate("Trend_",IndicatorNumber,"_",i))!=-1) ObjectDelete(StringConcatenate("Trend_",IndicatorNumber,"_",i)); return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int LastBarWasHighLow(int LELB, int LEHB) { if (LELB==-1 && LEHB!=-1) return(1); if (LELB!=-1 && LEHB==-1) return(-1); if (LELB!=-1 && LEHB!=-1 && LELB>LEHB) return(1); if (LELB!=-1 && LEHB!=-1 && LELB=FractalBarsOnEachSide;i--) { //Ищем нижний фрактал if (i==Lowest(Symbol(),Period(),MODE_LOW,FractalBarsOnEachSide*2+1,i-FractalBarsOnEachSide)) { switch(LastBarWasHighLow(LastExtremumLowBar,LastExtremumHighBar)) { case -1: { if (Low[i]High[LastExtremumHighBar]) { Short[i]=High[i]; Short[LastExtremumHighBar]=0; LastExtremumHighBar=i; } break; } case -1: { if (High[i]>Low[LastExtremumLowBar]) { Short[i]=High[i]; LastExtremumHighBar=i; } break; } case 0: { Short[i]=High[i]; LastExtremumHighBar=i; break; } } } } //Ищем, где заканчиваются уровни фракталов (двойное пересечение ценой уровня) for(i=MathMin(ProceedMaxHistoryBars,Bars-FractalBarsOnEachSide-1);i>=FractalBarsOnEachSide;i--) { if (Long[i]==Low[i]) { Stop=-1; CurrState=0; for(j=i-1;j>=0 && Stop==-1;j--) { if (CurrState==-1) if (High[j]>Low[i]+(i-j)*PriceDeltaFor1Bar*Point+PriceCrossedLevel*Point) Stop=j; if (CurrState==0) if (Low[j]=0 && Stop==-1;j--) { if (CurrState==1) if (Low[j]High[i]+(i-j)*PriceDeltaFor1Bar*Point+PriceCrossedLevel*Point) CurrState=1; } if (Stop!=-1) LevelLength[i]=i-Stop; else LevelLength[i]=i; } } //Объединяем близкие уровни разных фракталов for(i=MathMin(ProceedMaxHistoryBars,Bars-FractalBarsOnEachSide-1);i>=FractalBarsOnEachSide;i--) { if (LevelLength[i]>0) { if (Long[i]!=0) iFractalValue=Long[i]; if (Short[i]!=0) iFractalValue=Short[i]; BarsToCheck=MathMin(LevelActuality,LevelLength[i]); j=i-1; LevelLength[i]=BarsToCheck; while(BarsToCheck>0) { if (LevelLength[j]>0) { if (Long[j]!=0) jFractalValue=Long[j]; if (Short[j]!=0) jFractalValue=Short[j]; if (MathAbs(iFractalValue+(i-j)*PriceDeltaFor1Bar*Point-jFractalValue)=FractalBarsOnEachSide;i--) { if (Long[i]!=0 || Short[i]!=0) { if (LastExtremumBar!=-1) { if (Long[i]!=0) { ObjectCreate(StringConcatenate("Trend_",IndicatorNumber,"_",i),OBJ_TREND,0, Time[LastExtremumBar],Short[LastExtremumBar],Time[i],Long[i]); ObjectSet(StringConcatenate("Trend_",IndicatorNumber,"_",i),OBJPROP_COLOR,TrendDownColor); } if (Short[i]!=0) { ObjectCreate(StringConcatenate("Trend_",IndicatorNumber,"_",i),OBJ_TREND,0, Time[LastExtremumBar],Long[LastExtremumBar],Time[i],Short[i]); ObjectSet(StringConcatenate("Trend_",IndicatorNumber,"_",i),OBJPROP_COLOR,TrendUpColor); } ObjectSet(StringConcatenate("Trend_",IndicatorNumber,"_",i),OBJPROP_RAY,0); ObjectSet(StringConcatenate("Trend_",IndicatorNumber,"_",i),OBJPROP_WIDTH,2); } LastExtremumBar=i; } } //Рисуем уровни for(i=MathMin(ProceedMaxHistoryBars,Bars-FractalBarsOnEachSide-1);i>=FractalBarsOnEachSide;i--) { if (LevelLength[i]!=0) { if (Long[i]!=0) iFractalValue=Long[i]; if (Short[i]!=0) iFractalValue=Short[i]; //---- ObjectCreate(StringConcatenate("Level_",IndicatorNumber,"_",i),OBJ_TREND,0, Time[i],iFractalValue,Time[i-LevelLength[i]],iFractalValue+LevelLength[i]*PriceDeltaFor1Bar*Point); if (i!=LevelLength[i]) ObjectSet(StringConcatenate("Level_",IndicatorNumber,"_",i),OBJPROP_RAY,0); ObjectSet(StringConcatenate("Level_",IndicatorNumber,"_",i),OBJPROP_COLOR,LevelColor); if (LevelWidth[i]>1) { ObjectSet(StringConcatenate("Level_",IndicatorNumber,"_",i),OBJPROP_WIDTH,1); if (LevelWidth[i]>=Width2LevelConfirmation) ObjectSet(StringConcatenate("Level_",IndicatorNumber,"_",i),OBJPROP_WIDTH,2); if (LevelWidth[i]>=Width3LevelConfirmation) ObjectSet(StringConcatenate("Level_",IndicatorNumber,"_",i),OBJPROP_WIDTH,3); if (LevelWidth[i]>=Width4LevelConfirmation) ObjectSet(StringConcatenate("Level_",IndicatorNumber,"_",i),OBJPROP_WIDTH,4); if (LevelWidth[i]>=Width5LevelConfirmation) ObjectSet(StringConcatenate("Level_",IndicatorNumber,"_",i),OBJPROP_WIDTH,5); } else { ObjectSet(StringConcatenate("Level_",IndicatorNumber,"_",i),OBJPROP_COLOR,LevelColor); ObjectSet(StringConcatenate("Level_",IndicatorNumber,"_",i),OBJPROP_STYLE,STYLE_DOT); } } } return(0); } //+------------------------------------------------------------------+