- //+------------------------------------------------------------------+
- //| Zigzag.mq4 |
- //| Copyright ?2005-2007, metaQuotes Software Corp. |
- //|
- //+------------------------------------------------------------------+
- #property copyright "Copyright ?2007, metaQuotes Software Corp."
- #property indicator_chart_window
- #property indicator_buffers 1
- #property indicator_color1 Red
- //---- indicator parameters
- extern int ExtDepth=12;
- extern int ExtDeviation=5;
- extern int ExtBackstep=3;
- extern color White_Color=White;
- extern int LineWidth=2;
- //---- indicator buffers
- double ZigzagBuffer[];
- double HighMapBuffer[];
- double LowMapBuffer[];
- int level=3; // recounting's depth
- bool downloadhistory=false;
- string rp1="rp";
- int a=0;
- //+------------------------------------------------------------------+
- //| |
- //+------------------------------------------------------------------+
- int deinit() {
- ObjectsDeleteAll();
- }
- //+------------------------------------------------------------------+
- //| 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("+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;
- }
- }
-
- for (shift=limit;shift>=0;shift--)
- {
- Printrightprice("RP" + DoubleToStr(ZigzagBuffer[shift], Digits), ZigzagBuffer[shift], shift, White_Color, LineWidth);
- CrEAtLine("rp1" + DoubleToStr(ZigzagBuffer[shift], Digits), shift,Yellow);
-
- }
- return(0);
- }
-
- //+------------------------------------------------------------------+
- //| 显示顶点值 |
- //+------------------------------------------------------------------+
- void Printrightprice(string mapName, double mapPrice, int mapShift, color mapColor, int mapwidth)
- {
- ObjectCreate(mapName, OBJ_ARROW, 0, Time[mapShift], mapPrice);
- ObjectSet(mapName, OBJPROP_COLOR, mapColor);
- ObjectSet(mapName, OBJPROP_WIDTH, mapwidth);
- ObjectSet(mapName, OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
-
-
- }
- //+------------------------------------------------------------------+
- void CrEAtLine(string objName,int time1,color Cl) //画水平线函数
- {
- // ObjectDelete(objName);
- ObjectCreate(objName,OBJ_VLINE,0,Time[time1],0);
- ObjectSet(objName,OBJPROP_COLOR,Cl);
- }
- void wt(string labelname,string date,int j,int x,int y,color colorvalue,int fontsize) //创建WT函数,进行文字显示。
- {
- ObjectDelete(labelname);
- ObjectCreate(labelname,OBJ_LABEL,0,0,0);
- ObjectSetText(labelname,date,fontsize,"arial",colorvalue);
- ObjectSet(labelname,OBJPROP_CORNER,j);
- ObjectSet(labelname,OBJPROP_XDISTANCE,x);
- ObjectSet(labelname,OBJPROP_YDISTANCE,y);
-
- }
|