//+------------------------------------------------------------------+ //| Zigzag.mq4 | //| Copyright © 2005-2007, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red //---- indicator parameters extern int ExtDepth=12; //минимальное кол-во баров на котором не будет второго //максимума/минимума меньше/больше на deviation пипсов чем предыдущего extern int ExtDeviation=5; //размер отклонения extern int ExtBackstep=3; extern int ShowAndyPitchfork=0; //---- indicator buffers double ZigzagBuffer[]; double HighMapBuffer[]; double LowMapBuffer[]; int level=3; // глубина пересчета bool downloadhistory=false; int ErrCode; //********************************************************************** //| Custom indicator initialization function | //********************************************************************** int init() { IndicatorBuffers(3); //---- drawing settings SetIndexStyle(0,DRAW_SECTION); //---- indicator buffers mapping SetIndexBuffer(0,ZigzagBuffer); SetIndexBuffer(1,HighMapBuffer); SetIndexBuffer(2,LowMapBuffer); SetIndexEmptyValue(0,0.0); IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")"); //***************************************** if (!ObjectCreate("StaticA",OBJ_TREND,0,0,0,0,0)) {ErrCode=GetLastError(); Print("Ошибка создания StaticA: "+ErrCode); } ObjectSet("StaticA", OBJPROP_STYLE, DRAW_LINE); ObjectSet("StaticA", OBJPROP_COLOR, Blue); ObjectSet("StaticA", OBJPROP_WIDTH, 2); ObjectSet("StaticA", OBJPROP_RAY, true); // ObjectSet("StaticA", OBJPROP_TIMEFRAMES, OBJ_PERIOD_M15|OBJ_PERIOD_H4); if (!ObjectCreate("StaticB",OBJ_TREND,0,0,0,0,0)) {ErrCode=GetLastError(); Print("Ошибка создания StaticB: "+ErrCode);} ObjectSet("StaticB", OBJPROP_STYLE, DRAW_LINE); ObjectSet("StaticB", OBJPROP_COLOR, Blue); ObjectSet("StaticB", OBJPROP_WIDTH, 2); ObjectSet("StaticB", OBJPROP_RAY, true); if (!ObjectCreate("DynamicA",OBJ_TREND,0,0,0,0,0)) {ErrCode=GetLastError(); Print("Ошибка создания DynamicA: "+ErrCode);} ObjectSet("DynamicA", OBJPROP_STYLE, DRAW_LINE); ObjectSet("DynamicA", OBJPROP_COLOR, Red); ObjectSet("DynamicA", OBJPROP_WIDTH, 2); ObjectSet("DynamicA", OBJPROP_RAY, true); if (!ObjectCreate("DynamicB",OBJ_TREND,0,0,0,0,0)) {ErrCode=GetLastError(); Print("Ошибка создания DynamicB: "+ErrCode);} ObjectSet("DynamicB", OBJPROP_STYLE, DRAW_LINE); ObjectSet("DynamicB", OBJPROP_COLOR, Red); ObjectSet("DynamicB", OBJPROP_WIDTH, 2); ObjectSet("DynamicB", OBJPROP_RAY, true); if (!ObjectCreate("AndyPitchfork",OBJ_PITCHFORK,0,0,0,0,0,0,0)) {ErrCode=GetLastError(); Print("Ошибка создания AndyPitchfork: "+ErrCode);} //ObjectSet("AndyPitchfork", OBJPROP_STYLE, DRAW_LINE); ObjectSet("AndyPitchfork", OBJPROP_COLOR, Magenta); ObjectSet("AndyPitchfork", OBJPROP_WIDTH, 1); //ObjectSet("AndyPitchfork", OBJPROP_RAY, true); return(0); } //********************************************************************** int deinit() { ObjectDelete("StaticA"); ObjectDelete("StaticB"); ObjectDelete("DynamicA"); ObjectDelete("DynamicB"); ObjectDelete("AndyPitchfork"); // Comment(""); return(0); } //********************************************************************** int start() { int i, counted_bars = IndicatorCounted();//загрузка количества баров в истории индикатора int limit,counterZ,whatlookfor; int shift,back,lasthighpos,lastlowpos; double val,res; double curlow,curhigh,lasthigh,lastlow; if (counted_bars==0 && downloadhistory) //загрузка истории { ArrayInitialize(ZigzagBuffer,0.0); ArrayInitialize(HighMapBuffer,0.0); ArrayInitialize(LowMapBuffer,0.0); } if (counted_bars==0) { limit=Bars-ExtDepth; downloadhistory=true; } if (counted_bars>0) { while (counterZ=0;i--) { ZigzagBuffer[i]=0.0; LowMapBuffer[i]=0.0; HighMapBuffer[i]=0.0; } } for(shift=limit; shift>=0; shift--) {//--- низы val=Low[iLowest(NULL,0,MODE_LOW,ExtDepth,shift)]; if(val==lastlow) val=0.0; else { lastlow=val; if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0; else { for(back=1; back<=ExtBackstep; back++) { res=LowMapBuffer[shift+back]; if((res!=0)&&(res>val)) LowMapBuffer[shift+back]=0.0; } } } if (Low[shift]==val) LowMapBuffer[shift]=val; else LowMapBuffer[shift]=0.0; //--- верхи val=High[iHighest(NULL,0,MODE_HIGH,ExtDepth,shift)]; if(val==lasthigh) val=0.0; else { lasthigh=val; if((val-High[shift])>(ExtDeviation*Point)) val=0.0; else { for(back=1; back<=ExtBackstep; back++) { res=HighMapBuffer[shift+back]; if((res!=0)&&(res=0;shift--) { res=0.0; switch(whatlookfor) { case 0: //обработка пиков и впадин if (lastlow==0 && lasthigh==0) { if (HighMapBuffer[shift]!=0) { lasthigh=High[shift]; lasthighpos=shift; whatlookfor=-1; ZigzagBuffer[shift]=lasthigh; res=1; } if (LowMapBuffer[shift]!=0) { lastlow=Low[shift]; lastlowpos=shift; whatlookfor=1; ZigzagBuffer[shift]=lastlow; res=1; } } break; case 1: //пики if (LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]lasthigh && LowMapBuffer[shift]==0.0) { ZigzagBuffer[lasthighpos]=0.0; lasthighpos=shift; lasthigh=HighMapBuffer[shift]; ZigzagBuffer[shift]=lasthigh; } if (LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0) { lastlow=LowMapBuffer[shift]; lastlowpos=shift; ZigzagBuffer[shift]=lastlow; whatlookfor=1; } break; default: return; } } //******************* int zzz=0,kol=0; double ZZp0=0,ZZp1=0,ZZp2=0,ZZp3=0; int barP0=0,barP1=0,barP2=0,barP3=0; datetime TimeP0=0,TimeP1=0,TimeP2=0,TimeP3=0; double array1[][6]; if (Period()==1) ArrayCopyRates(array1,NULL,PERIOD_M1); if (Period()==5) ArrayCopyRates(array1,NULL,PERIOD_M5); if (Period()==15) ArrayCopyRates(array1,NULL,PERIOD_M15); if (Period()==30) ArrayCopyRates(array1,NULL,PERIOD_M30); if (Period()==60) ArrayCopyRates(array1,NULL,PERIOD_H1); if (Period()==240) ArrayCopyRates(array1,NULL,PERIOD_H4); if (Period()==1440) ArrayCopyRates(array1,NULL,PERIOD_D1); if (Period()==10080) ArrayCopyRates(array1,NULL,PERIOD_W1); if (Period()==43200) ArrayCopyRates(array1,NULL,PERIOD_MN1); while (zzz<10000) { if (ZigzagBuffer[zzz] !=0) { if (kol==0) {barP0=zzz; ZZp0=ZigzagBuffer[zzz]; TimeP0=array1[zzz][0];} if (kol==1) {barP1=zzz; ZZp1=ZigzagBuffer[zzz]; TimeP1=array1[zzz][0];} if (kol==2) {barP2=zzz; ZZp2=ZigzagBuffer[zzz]; TimeP2=array1[zzz][0];} if (kol==3) {barP3=zzz; ZZp3=ZigzagBuffer[zzz]; TimeP3=array1[zzz][0];} kol++; } zzz++; if (kol==4) { double Delta, PointX; //*** Static **************** MoveChannel("StaticA",TimeP3,ZZp3,TimeP1,ZZp1,0,0); if (ZZp2ZZp1) {Delta=ZZp2-ObjectGetValueByShift("StaticA",barP2); PointX=ZZp1+Delta;} if (ZZp2==ZZp1){Delta=0; PointX=ZZp1;} MoveChannel("StaticB",TimeP2,ZZp2,TimeP1,PointX,0,0); //*** Dynamic **************** MoveChannel("DynamicA",TimeP2,ZZp2,TimeP0,ZZp0,0,0); if (ZZp1ZZp0) {Delta=ZZp1-ObjectGetValueByShift("DynamicA",barP1); PointX=ZZp0+Delta;} if (ZZp1==ZZp0){Delta=0; PointX=ZZp1;} MoveChannel("DynamicB",TimeP1,ZZp1,TimeP0,PointX,0,0); //*** AndyPitchfork ********** if (ShowAndyPitchfork==1)MoveChannel("AndyPitchfork",TimeP2,ZZp2,TimeP1,ZZp1,TimeP0,ZZp0); break; } } return(0); } //********************************************************************** void MoveChannel(string NameObject,datetime X1,double Y1,datetime X2,double Y2,datetime X3,double Y3) { if (NameObject=="AndyPitchfork") {ObjectMove(NameObject,0,X1,Y1); ObjectMove(NameObject,1,X2,Y2); ObjectMove(NameObject,2,X3,Y3);} else {ObjectMove(NameObject,0,X1,Y1); ObjectMove(NameObject,1,X2,Y2);} return; } //**********************************************************************