How to extract only the bottoms turnaround points extracted by the zigzag indicator?
like comparing
double K = iCustom(Symbol(),0,"zigzag",ExtDepth,ExtDeviation,ExtBackstep,0,i); if (K==Low[i] && K>0) //..low zigzag......
deVries,
Thanks a lot for your prompt reply. do you mean simply change the second last parameter of iCustom to 0? I have tried this before. and The result is definitely not what I desired...To make my question clearer, i show the two figures below to illustrate my question....
Fig1. unwanted tops are shown when I want to only show the botoms! I want to filter out all the unwanted tops when I only want to show the bottoms.
FIg2. The desired tops are shown without any unwanted bottoms. This is the result that i want to have.
So my question is: is it possible to show only the bottom points without showing Point A/B/C/D/E ? I hope I have made the question clear.....
Thanks a lot for your prompt reply....
//+------------------------------------------------------------------+ //| Zigzag2.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 3 #property indicator_color1 Red #property indicator_color2 Magenta #property indicator_color3 LightSkyBlue //---- indicator parameters extern int ExtDepth=12; extern int ExtDeviation=5; extern int ExtBackstep=3; //---- indicator buffers double ZigzagBuffer[]; double HighMapBuffer[]; double LowMapBuffer[]; int level=3; // recounting's depth bool downloadhistory=false; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { IndicatorBuffers(3); //---- drawing settings SetIndexStyle(0,DRAW_SECTION); SetIndexStyle(1,DRAW_SECTION); SetIndexStyle(2,DRAW_SECTION); //---- indicator buffers mapping SetIndexBuffer(0,ZigzagBuffer); SetIndexBuffer(1,HighMapBuffer); SetIndexBuffer(2,LowMapBuffer); SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); SetIndexEmptyValue(2,0.0); //---- indicator short name IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")"); //---- initialization done 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) // history was downloaded { 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<level && 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=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; //--- high 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<val)) HighMapBuffer[shift+back]=0.0; } } } if (High[shift]==val) HighMapBuffer[shift]=val; else HighMapBuffer[shift]=0.0; } // final cutting if (whatlookfor==0) { lastlow=0; lasthigh=0; } else { lastlow=curlow; lasthigh=curhigh; } for (shift=limit;shift>=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]<lastlow && HighMapBuffer[shift]==0.0) { ZigzagBuffer[lastlowpos]=0.0; lastlowpos=shift; lastlow=LowMapBuffer[shift]; ZigzagBuffer[shift]=lastlow; res=1; } if (HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0) { lasthigh=HighMapBuffer[shift]; lasthighpos=shift; ZigzagBuffer[shift]=lasthigh; whatlookfor=-1; res=1; } break; case -1: // look for lawn if (HighMapBuffer[shift]!=0.0 && HighMapBuffer[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; } } return(0); } //+------------------------------------------------------------------+
It was possible to show only zigzag buffer
zigzag is repainting
see result of this
Here's what i came up with. I haven't checked deVries results above [was doing this when he posted].
#property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Green #property indicator_width1 1 #property indicator_color2 Yellow #property indicator_width2 1 double Bottoms[]; double Toppers[]; int init() { IndicatorBuffers(2); SetIndexStyle(0,DRAW_SECTION); SetIndexBuffer(0,Bottoms); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_SECTION); SetIndexBuffer(1,Toppers); SetIndexEmptyValue(1,0.0); IndicatorShortName("zz show top & bottom"); return(0); } int deinit() { return(0); } int start() { int counted_bars=IndicatorCounted(); int limit=0; limit = Bars-counted_bars; for(int shift=limit-1;shift>=0;shift--) { int ExtDepth=12; int ExtDeviation=5; int ExtBackstep=3; int ZigzagBuffer=0; int HighMapBuffer=1; int LowMapBuffer=2; Bottoms[shift]=iCustom( Symbol(),0,"ZigZag", ExtDepth, ExtDeviation, ExtBackstep, LowMapBuffer, shift ); Toppers[shift]=iCustom( Symbol(),0,"ZigZag", ExtDepth, ExtDeviation, ExtBackstep, HighMapBuffer, shift ); if(Bottoms[shift]>0.1) Bottoms[shift]=Bottoms[shift]; if(Toppers[shift]>0.1) Toppers[shift]=Toppers[shift]; } return(0); }
Here's what i came up with. I haven't checked deVries results above [was doing this when he posted].
#property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Red #property indicator_width1 3 #property indicator_color2 Green #property indicator_width2 3 #property indicator_color3 Yellow #property indicator_width3 3 //---- indicator parameters extern int ExtDepth=12; extern int ExtDeviation=5; extern int ExtBackstep=3; double ZigZag[]; double Bottoms[]; double Toppers[]; int init() { IndicatorBuffers(3); SetIndexStyle(0,DRAW_SECTION); SetIndexBuffer(0,ZigZag); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_SECTION); SetIndexBuffer(1,Bottoms); SetIndexEmptyValue(1,0.0); SetIndexStyle(2,DRAW_SECTION); SetIndexBuffer(2,Toppers); SetIndexEmptyValue(2,0.0); IndicatorShortName("zz show top & bottom"); return(0); } int deinit() { return(0); } int start() { int counted_bars=IndicatorCounted(); int limit=0; limit = Bars-counted_bars; for(int shift=limit-1;shift>=0;shift--) { ZigZag[shift]=iCustom( Symbol(),0,"ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift ); if(ZigZag[shift]>0.1 && Low[shift]==ZigZag[shift]) Bottoms[shift]=ZigZag[shift]; if(ZigZag[shift]>0.1 && High[shift]==ZigZag[shift]) Toppers[shift]=ZigZag[shift]; } return(0); }
This is giving as Result
now bottoms and tops match all with zigzag
deVries:
Nice ubzen with help of your code i came to this......This is giving as Result
now bottoms and tops match all with zigzag
Hi deVries,
Thanks a lot for your code. If i want to know how far is the Fibonacci Retracement of the last zigzag leg, compare to the previous zigzag leg. How to do that ?
I want to do like the picture, but the code below that i tried did not make it ...
Thanks,
jack
#property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Red #property indicator_width1 3 #property indicator_color2 Green #property indicator_width2 3 #property indicator_color3 Yellow #property indicator_width3 3 //---- indicator parameters extern int ExtDepth=12; extern int ExtDeviation=5; extern int ExtBackstep=3; double ZigZag[]; double Bottoms[]; double Toppers[]; double resBuffer[][]; //--- int init() { IndicatorBuffers(3); SetIndexStyle(0,DRAW_SECTION); SetIndexBuffer(0,ZigZag); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_SECTION); SetIndexBuffer(1,Bottoms); SetIndexEmptyValue(1,0.0); SetIndexStyle(2,DRAW_SECTION); SetIndexBuffer(2,Toppers); SetIndexEmptyValue(2,0.0); IndicatorShortName("zz show top & bottom"); return(0); } int deinit() { ObjectDelete("myFibo"); return(0); } int start() { int counted_bars=IndicatorCounted(); int limit=0; limit = Bars-counted_bars; int k=0, m=0; int candle1=0, candle2=0; double prc1=0, prc2=0; for(int shift=limit-1;shift>=0;shift--) { ZigZag[shift]=iCustom( Symbol(),0,"ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift ); if(ZigZag[shift]>0.1 && Low[shift]==ZigZag[shift]) { Bottoms[shift]=ZigZag[shift]; resBuffer[k][0] = Bottoms[shift]; resBuffer[k][1] = shift; k++; } if(ZigZag[shift]>0.1 && High[shift]==ZigZag[shift]) { Toppers[shift]=ZigZag[shift]; resBuffer[k][0] = Toppers[shift]; resBuffer[k][1] = shift; k++; } } // ende for //--- for(m=k;m>=0;m--) { candle1 = resBuffer[m][1]; prc1 = resBuffer[m][0]; candle2 = resBuffer[m-1][1]; prc2 = resBuffer[m-1][0]; //--- ObjectDelete("myFibo"); ObjectCreate("myFibo", OBJ_FIBO, 0, Time[candle1], prc2, Time[candle2], prc1); } // ende for return(0); }
Hi deVries,
Thanks a lot for your code. If i want to know how far is the Fibonacci Retracement of the last zigzag leg, compare to the previous zigzag leg. How to do that ?
Thanks,
jack

draw fibonacci this way find the two points with zigzag indicator iCustom
0.0 1.6154
100.0 1.6168
difference 0.0014
last high = 1.6169
difference with 0.0 0.0015 in% 0.0015/0.0014 * 100% = 107% in distance + 0.0001
Is that what you mean ??
Hi deVries,
Thank you. Yes, it's like the picture you sent. But i want to know how to code it. It must calculate each previous Zigzag leg, and then draw the Fibonacci level, so we know how far is the current / last zigzag goes.
edit: i sent the code on the previous post. It would not draw the fibo line ...
Thanks






Dear all, How to modify the code to show only the bottoms of the zigzag ?