//+------------------------------------------------------------------+ //| Zigzag-fractals.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 Gold //---- indicator parameters //---- indicator buffers double ZigzagBuffer[]; double HighMapBuffer[]; double LowMapBuffer[]; int level=3; // recounting's depth bool downloadhistory=false; //+------------------------------------------------------------------+ double UP[20];double UP_bar[20]; //+------------------------------------------------------------------+ //| 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); //---- indicator short name IndicatorShortName("ZigZag-fractal"); //---- initialization done return(0); } //+------------------------------------------------------------------+ //----------------------------------------------------------------------------------------------------------// void OnDeinit(const int reason) { Comment(""); //ObjectsDeleteAll(); //ObjectsDeleteAll(0, OBJ_HLINE); //return(0); } //+--------------------------------------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { //datetime signaltimeRect; 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) // history was downloaded { ArrayInitialize(ZigzagBuffer,0); ArrayInitialize(HighMapBuffer,0); ArrayInitialize(LowMapBuffer,0); } if (counted_bars==0) { limit=Bars-12; downloadhistory=true; } if (counted_bars>0) { while (counterZ<3 && i<100) { res=ZigzagBuffer[i]; if (res!=0) counterZ++; i++; } i--; limit=i; if (LowMapBuffer[i]!=0) { curlow=LowMapBuffer[i]; whatlookfor=1; } else { curhigh=HighMapBuffer[i]; whatlookfor=-1; } for (i=limit-1;i>=0;i--) { ZigzagBuffer[i]=0.0; LowMapBuffer[i]=0.0; HighMapBuffer[i]=0.0; } } //---------------------- for(shift=limit; shift>=0; shift--) { val=iFractals(NULL, 0, MODE_LOWER, shift);//Low[iLowest(NULL,0,MODE_LOW,12,shift)]; if(val==lastlow) val=0.0; else { lastlow=val; if((Low[shift]-val)>(1*Point)) val=0.0; else { for(back=1; back<=1; back++) { res=LowMapBuffer[shift+back]; if((res!=0)&&(res>val)) LowMapBuffer[shift+back]=0.0; } } } LowMapBuffer[shift]=val; //--- high val=iFractals(NULL, 0, MODE_UPPER, shift);//High[iHighest(NULL,0,MODE_HIGH,12,shift)];//iFractals(NULL, 0, MODE_UPPER, 3); if(val==lasthigh) val=0.0; else { lasthigh=val; if((val-High[shift])>(1*Point)) val=0.0; else { for(back=1; back<=1; back++) { res=HighMapBuffer[shift+back]; if((res!=0)&&(res=0;shift--) { res=0.0; switch(whatlookfor) { case 0: // look for peak or lawn 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: // look for peak if (LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]lasthigh && LowMapBuffer[shift]==0.0) { ZigzagBuffer[lasthighpos]=0.0; lasthighpos=shift; lasthigh=HighMapBuffer[shift]; ZigzagBuffer[shift]=lasthigh; /* signaltimeRect=signaltimeRect=Time[shift]; UpperPrice= Open[shift]; LowerPrice= High[shift]; RectangleDelete(IFTRectangleUp); RectangleCrt(signaltimeRect,IFTRectangleDn,UpperPrice, LowerPrice,RectClrDn); */ } if (LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0) { lastlow=LowMapBuffer[shift]; lastlowpos=shift; ZigzagBuffer[shift]=lastlow; whatlookfor=1; } break; default: return; } } //+------------------------------------------------------------------+ int up=0;int dn=0; for(int i02=counted_bars;i02>=0;i02--) { int i02_=counted_bars-i02; if(dn>14||up>14) break; if(up<=14&&HighMapBuffer[i02_]>0&&ZigzagBuffer[i02_]>0) {UP[up]=HighMapBuffer[i02_];/*UP_1_time=Time[i02_]*/;UP_bar[up]=i02_;up++;} } double Xm0=0,Ym0=0,XY0=0,XX0=0; for(int lsl0=3;lsl0>=1;lsl0--) {Xm0=Xm0+UP_bar[lsl0];Ym0=Ym0+UP[lsl0];XY0=XY0+UP_bar[lsl0]*UP[lsl0];XX0=XX0+UP_bar[lsl0]*UP_bar[lsl0];} double m0,h0; m0=(XX0-Xm0*Xm0/3); h0= XY0-Xm0*Ym0/3; double h1; //h1=h0/m0; Comment("\n " ,"\n Xm0=",Xm0," Ym0=",Ym0 ,"\n XY0=",XY0," XX0=",XX0 ,"\n m0=",m0," h0=",h0 ,"\n h1=",h1 ); return(0); }