// Downloaded From https://www.WiseStockTrader.com // Amibroker AFL code by Edward Pottasch, Nov 2012 // Alternative ZIG type function based on the ATR and VSTOP functions // Added multiple timeframes. Maximum timeframe set to 1440 minutes // Added Channel type indicator after idea by Carl Vanhaesendonck // Added pivot based trendlines + 2 convergence patterns x=xx=BarIndex(); dispZIG=ParamToggle("Display ZIG","Off|On",1); dispVSTOP=ParamToggle("Display VSTOP","Off|On",0); dispCHANNEL=ParamToggle("Display CHANNEL","Off|On",1); dispTRENDLINES=ParamToggle("Display TRENDLINES","Off|On",0); dispSR=ParamToggle("Display S/R levels","Off|On",1); npivTL=Param("N Pivots Used (TRENDLINES)",2,1,5,1); percSR=Param("Percentage Range (S/R LINES)",20,0.05,100,0.01); npivSR=Param("N Pivots Used (S/R LINES)",1,1,250,1); lastMiniPivot=ParamToggle("Mini Pivot (use with CHANNEL display)","Furthest|Last",0); disp0=ParamToggle("Display labels","Off|On",1); tf=Param("Time Frame (min)",60,1,1440,1);tfrm=in1Minute*tf; perBull=Param("perBull",20,1,150,1); perBear=Param("perBear",20,1,150,1); multBull=Param("multBull",2,0.05,4,0.05); multBear=Param("multBear",2,0.05,4,0.05); TimeFrameSet(tfrm); function vstop_func(trBull,trBear) { trailArray[0]=C[0]; for(i=1;iprev AND C[i-1]>prev) { trailArray[i]=Max(prev,C[i]-trBull[i]); } else if(C[i]prev) { trailArray[i]=C[i]-trBull[i]; } else { trailArray[i]=C[i]+trBear[i]; } } return trailArray; } trBull=multBull*ATR(perBull); trBear=multBear*ATR(perBear); trailArray = vstop_func(trBull,trBear); ts=IIf(trailArray>C,trailArray,Null); tl=IIf(trailArrayO,colorBrightGreen,IIf(C<=O,colorRed,colorLightGrey))); Plot(C,"Price",IIf(C>O,ColorRGB(0,255,0),IIf(C<=O,ColorRGB(255,0,0),colorLightGrey)),64,0,0,0,0,1); lll=LLV(L,BarsSince(!IsEmpty(tl)));lll=IIf(ts,lll,Null);llls=lll; ttt1=IIf((!IsEmpty(ts) AND IsEmpty(Ref(ts,1))) OR BarIndex()==BarCount-1,1,Null); ttt=ValueWhen(ttt1,lll,0);ttt=IIf(ts,ttt,Null);ttt=IIf(ttt1,Ref(ttt,-1),ttt); tr=L==ttt;lll=Sum(tr,BarsSince(!IsEmpty(tl))); qqq=ValueWhen(ttt1,lll,0);qqq=IIf(ts,qqq,Null);qqq=IIf(ttt1,Ref(qqq,-1),qqq);tr=tr AND lll==qqq; tr=IIf((!IsEmpty(ts) AND IsEmpty(Ref(ts,1)) AND IsEmpty(Ref(ts,-1))),1,tr);//exception hhh=HHV(H,BarsSince(!IsEmpty(ts)));hhh=IIf(tl,hhh,Null);hhhs=hhh; ttt1=IIf((!IsEmpty(tl) AND IsEmpty(Ref(tl,1))) OR BarIndex()==BarCount-1,1,Null); ttt=ValueWhen(ttt1,hhh,0);ttt=IIf(tl,ttt,Null);ttt=IIf(ttt1,Ref(ttt,-1),ttt); pk=H==ttt;hhh=Sum(pk,BarsSince(!IsEmpty(ts))); sss=ValueWhen(ttt1,hhh,0);sss=IIf(tl,sss,Null);sss=IIf(ttt1,Ref(sss,-1),sss);pk=pk AND hhh==sss; pk=IIf((!IsEmpty(tl) AND IsEmpty(Ref(tl,1)) AND IsEmpty(Ref(tl,-1))),1,pk);//exception px0=ValueWhen(pk,x,0); tx0=ValueWhen(tr,x,0); px1=ValueWhen(pk,x,1); tx1=ValueWhen(tr,x,1); px2=ValueWhen(pk,x,2); tx2=ValueWhen(tr,x,2); ph0=ValueWhen(pk,H,0); tl0=ValueWhen(tr,L,0); ph1=ValueWhen(pk,H,1); tl1=ValueWhen(tr,L,1); ph2=ValueWhen(pk,H,2); tl2=ValueWhen(tr,L,2); minipk=H>=Ref(HHV(H,1),-1) AND Ref(HHV(H,1),1)L; ll=tr AND tl1tl2; hh=pk AND ph1>ph2; lh=pk AND ph1tx1,(ph0-tl1)/(px0-tx1),0);aa1=IIf(pk,Ref(aa1,-1),aa1);ls1=aa1*(xx-tx1)+tl1; bb1=IIf(px0>tx1 AND px1px1,(tl0-ph1)/(tx0-px1),0);aa1=IIf(tr,Ref(aa1,-1),aa1);ls1=aa1*(xx-px1)+ph1; bb1=IIf(tx0>px1 AND tx1tx1,(ph0-tl1)/(px0-tx1),0);aa1=IIf(pk,Ref(aa1,-1),aa1);ls1=aa1*(xx-tx1)+tl1; bb1=IIf(px0>tx1 AND px1ValueWhen(pk,H),Null,ls2e); Plot(ls1,"",colorBlue,styleThick,0,0,0,-1,2); //PlotShapes(IIf(minitr AND bb1 AND BarsSince(tr)>1,shapeSmallCircle,shapeNone),ColorRGB(0,30,0),0,L,-10); PlotShapes(IIf(mp,shapeHollowSmallCircle,shapeNone),colorWhite,0,L,-10); Plot(ls2,"",colorBlue,styleDashed,0,0,0,-1,1); Plot(IIf( (tx0>px1 AND tx1px1,(tl0-ph1)/(tx0-px1),0);aa1=IIf(tr,Ref(aa1,-1),aa1);ls1=aa1*(xx-px1)+ph1; bb1=IIf(tx0>px1 AND tx1ValueWhen(pk,H),Null,ls2);Ls2=IIf(Ls2<0,Null,Ls2); ls2e=ValueWhen(tr,ls2)+ValueWhen(tr,aa1)*(xx-tx1);ls2e=IIf(ls2e1,shapeSmallCircle,shapeNone),ColorRGB(50,0,0),0,H,10); PlotShapes(IIf(mp,shapeHollowSmallCircle,shapeNone),colorWhite,0,H,10); Plot(ls2,"",colorOrange,styleDashed,0,0,0,-1,1); Plot(IIf( (px0>tx1 AND px1maxy OR ss0 AND ts AND upchan,ss,Null); valid_ss1=IIf(BarsSince(tr)>0 AND tl AND upchan,ss,Null); valid_ss2=IIf(BarsSince(tr)>0 AND tl AND dnchan,ss,Null); valid_ss3=IIf(BarsSince(tr)>0 AND ts AND dnchan,ss,Null); valid_ss=IIf(valid_ss1,valid_ss1,IIf(valid_ss2,valid_ss2,IIf(valid_ss3,valid_ss3,Null))); rr=ValueWhen(pk,H,1);rr=IIf(rr>maxy OR rr0 AND tl AND dnchan,rr,Null); valid_rr1=IIf(BarsSince(pk)>0 AND ts AND dnchan,rr,Null); valid_rr2=IIf(BarsSince(pk)>0 AND ts AND upchan,rr,Null); valid_rr3=IIf(BarsSince(pk)>0 AND tl AND upchan,rr,Null); valid_rr=IIf(valid_rr1,valid_rr1,IIf(valid_rr2,valid_rr2,IIf(valid_rr3,valid_rr3,Null))); for (i=1;i<=npivTL;i++) { y0=ValueWhen(tr,L,i-1); y1=ValueWhen(tr,L,i); x0=ValueWhen(tr,xx,i-1); x1=ValueWhen(tr,xx,i); aa=(y0-y1)/(x0-x1); ls1=aa*(xx-x1)+y1; dls1=ls1-Ref(ls1,-1); ls1=IIf(dls1<0,Null,ls1); if(i>2) ls1=IIf(tr,Null,ls1); if(i==1) Plot(ls1,"",colorBrightGreen,styleLine|styleNoRescale,0,0,0,-1); if(i==2) { Plot(IIf(invalid_ss,ls1,Null),"",colorLightGrey,styleNoLine|styleDots|styleThick|styleNoRescale,0,0,0,-1); Plot(IIf(valid_ss,ls1,Null),"",colorDarkGreen,styleNoLine|styleDots|styleThick|styleNoRescale,0,0,0,-1); vv=IIf(valid_ss,ls1,Null); Short=valid_HL_LH AND Cross(vv,C);Short=ExRem(Short,tr);ShortPrice=C; PlotShapes(IIf(Short,shapeSmallDownTriangle,shapeNone),colorRed,0,H,-15); PlotShapes(IIf(Short,shapeSmallCircle,shapeNone),colorWhite,0,ShortPrice,0); } if(i>2) { Plot(ls1,"",colorDarkGreen,styleNoLine|styleDots|styleThick|styleNoRescale,0,0,0,-1); } y0=ValueWhen(pk,H,i-1); y1=ValueWhen(pk,H,i); x0=ValueWhen(pk,xx,i-1); x1=ValueWhen(pk,xx,i); aa=(y0-y1)/(x0-x1); hs1=aa*(xx-x1)+y1; dhs1=hs1-Ref(hs1,-1); hs1=IIf(dhs1>0,Null,hs1); if(i>2) hs1=IIf(pk,Null,hs1); if(i==1) Plot(hs1,"",colorRed,styleLine|styleNoRescale,0,0,0,-1); if(i==2) { Plot(IIf(invalid_rr,hs1,Null),"",colorLightGrey,styleNoLine|styleDots|styleThick|styleNoRescale,0,0,0,-1); Plot(IIf(valid_rr,hs1,Null),"",colorOrange,styleNoLine|styleDots|styleThick|styleNoRescale,0,0,0,-1); vv=IIf(valid_rr,hs1,Null); Buy=valid_LH_HL AND Cross(C,vv);Buy=ExRem(Buy,pk);BuyPrice=C; PlotShapes(IIf(Buy,shapeUpArrow,shapeNone),colorDarkGreen,0,L,-15); PlotShapes(IIf(Buy,shapeSmallCircle,shapeNone),colorWhite,0,BuyPrice,0); } if(i>2) { Plot(hs1,"",colorOrange,styleNoLine|styleDots|styleThick|styleNoRescale,0,0,0,-1); } } } Buy=0;Short=0; if(dispSR) { upchan=Flip(tr,pk); dnchan=Flip(pk,tr); miny=LastVisibleValue(C)-LastVisibleValue(C)/100*percSR; maxy=LastVisibleValue(C)+LastVisibleValue(C)/100*percSR; ss=ValueWhen(tr,L,1);ss=IIf(ss>maxy OR ss0 AND ts AND upchan,ss,Null); valid_ss1=IIf(BarsSince(tr)>0 AND tl AND upchan,ss,Null); valid_ss2=IIf(BarsSince(tr)>0 AND tl AND dnchan,ss,Null); valid_ss3=IIf(BarsSince(tr)>0 AND ts AND dnchan,ss,Null); valid_ss=IIf(valid_ss1,valid_ss1,IIf(valid_ss2,valid_ss2,IIf(valid_ss3,valid_ss3,Null))); rr=ValueWhen(pk,H,1);rr=IIf(rr>maxy OR rr0 AND tl AND dnchan,rr,Null); valid_rr1=IIf(BarsSince(pk)>0 AND ts AND dnchan,rr,Null); valid_rr2=IIf(BarsSince(pk)>0 AND ts AND upchan,rr,Null); valid_rr3=IIf(BarsSince(pk)>0 AND tl AND upchan,rr,Null); valid_rr=IIf(valid_rr1,valid_rr1,IIf(valid_rr2,valid_rr2,IIf(valid_rr3,valid_rr3,Null))); for (i=1;i<=npivSR;i++) { if(i==1) { Plot(invalid_ss,"",colorLightGrey,styleNoLine|styleDots,0,0,0,-1); Plot(valid_ss,"",colorRed,styleNoLine|styleDots,0,0,0,-1); Plot(invalid_rr,"",colorLightGrey,styleNoLine|styleDots,0,0,0,-1); Plot(valid_rr,"",colorBlue,styleNoLine|styleDots,0,0,0,-1); Buy=Buy+(Cross(C,valid_rr) AND valid_rr); Short=Short+(Cross(valid_ss,C) AND valid_ss); } else if(i>1) { rr=ValueWhen(pk,H,i);rr=IIf(rr>maxy OR rrmaxy OR ss= 60 AND qq < 1440){tf=" hrs";tt=qq/60;} else if(qq >= 1440){tf=" days";tt=(qq/60)/24;} qq=Max(tfrm/60,Interval()/60); if(qq < 60){tfa=" min";tta=qq;} else if(qq >= 60 AND qq < 1440){tfa=" hrs";tta=qq/60;} else if(qq >= 1440){tfa=" days";tta=(qq/60)/24;} Title = Name() + "\nChart TF: " + tt + tf + "\nZig TF: " + tta + tfa; dxhm=14;dxlm=10;dxh=0;dxl=0;dyhm=5;dylm=3;dyh=18;dyl=29;hm=30;lm=30; dyl2=42;dylm2=16;dyhm2=18;dyh2=31; function GetVisibleBarCount() { lvb=Status("lastvisiblebar"); fvb=Status("firstvisiblebar"); return Min(lvb-fvb,BarCount-fvb); } function GfxConvertPixelsToBarX(Pixels) { lvb=Status("lastvisiblebar"); fvb=Status("firstvisiblebar"); pxchartleft=Status("pxchartleft"); pxchartwidth=Status("pxchartwidth"); fac=pxchartwidth/Pixels; bar=(lvb-fvb)/fac; return bar; } function GfxConvertPixelToValueY(Pixels) { local Miny,Maxy,pxchartbottom,pxchartheight; Miny=Status("axisminy"); Maxy=Status("axismaxy"); pxchartbottom=Status("pxchartbottom"); pxchartheight=Status("pxchartheight"); fac=pxchartheight/Pixels; Value=(Maxy-Miny)/fac; return Value; } miny=Status("axisminy"); maxy=Status("axismaxy"); AllVisibleBars=GetVisibleBarCount(); fvb=Status("firstvisiblebar"); LowMargin=Miny+GfxConvertPixelToValueY(lm); HighMargin=Maxy-GfxConvertPixelToValueY(hm); dyllm=GfxConvertPixelToValueY(dylm); dyhhm=GfxConvertPixelToValueY(dyhm); dyll=GfxConvertPixelToValueY(dyl); dyhh=GfxConvertPixelToValueY(dyh); dxllm=GfxConvertPixelsToBarX(dxlm); dxhhm=GfxConvertPixelsToBarX(dxhm); dxll=GfxConvertPixelsToBarX(dxl); dxhh=GfxConvertPixelsToBarX(dxh); dyllm2=GfxConvertPixelToValueY(dylm2); dyll2=GfxConvertPixelToValueY(dyl2); dyhhm2=GfxConvertPixelToValueY(dyhm2); dyhh2=GfxConvertPixelToValueY(dyh2); dyllv=GfxConvertPixelToValueY(dyl+26); dyhhv=GfxConvertPixelToValueY(dyhm+39); if(disp0) { for(i=0;i