ZigZag显示顶点值指标
//+------------------------------------------------------------------+//| 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;
if (res!=0) counterZ++;
i++;
}
i--;
limit=i;
if (LowMapBuffer!=0)
{
curlow=LowMapBuffer;
whatlookfor=1;
}
else
{
curhigh=HighMapBuffer;
whatlookfor=-1;
}
for (i=limit-1;i>=0;i--)
{
ZigzagBuffer=0.0;
LowMapBuffer=0.0;
HighMapBuffer=0.0;
}
}
for(shift=limit; shift>=0; shift--)
{
val=Low;
if(val==lastlow) val=0.0;
else
{
lastlow=val;
if((Low-val)>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=LowMapBuffer;
if((res!=0)&&(res>val)) LowMapBuffer=0.0;
}
}
}
if (Low==val) LowMapBuffer=val; else LowMapBuffer=0.0;
//--- high
val=High;
if(val==lasthigh) val=0.0;
else
{
lasthigh=val;
if((val-High)>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=HighMapBuffer;
if((res!=0)&&(res<val)) HighMapBuffer=0.0;
}
}
}
if (High==val) HighMapBuffer=val; else HighMapBuffer=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!=0)
{
lasthigh=High;
lasthighpos=shift;
whatlookfor=-1;
ZigzagBuffer=lasthigh;
res=1;
}
if (LowMapBuffer!=0)
{
lastlow=Low;
lastlowpos=shift;
whatlookfor=1;
ZigzagBuffer=lastlow;
res=1;
}
}
break;
case 1: // look for peak
if (LowMapBuffer!=0.0 && LowMapBuffer<lastlow && HighMapBuffer==0.0)
{
ZigzagBuffer=0.0;
lastlowpos=shift;
lastlow=LowMapBuffer;
ZigzagBuffer=lastlow;
res=1;
}
if (HighMapBuffer!=0.0 && LowMapBuffer==0.0)
{
lasthigh=HighMapBuffer;
lasthighpos=shift;
ZigzagBuffer=lasthigh;
whatlookfor=-1;
res=1;
}
break;
case -1: // look for lawn
if (HighMapBuffer!=0.0 && HighMapBuffer>lasthigh && LowMapBuffer==0.0)
{
ZigzagBuffer=0.0;
lasthighpos=shift;
lasthigh=HighMapBuffer;
ZigzagBuffer=lasthigh;
}
if (LowMapBuffer!=0.0 && HighMapBuffer==0.0)
{
lastlow=LowMapBuffer;
lastlowpos=shift;
ZigzagBuffer=lastlow;
whatlookfor=1;
}
break;
default: return;
}
}
for (shift=limit;shift>=0;shift--)
{
Printrightprice("RP" + DoubleToStr(ZigzagBuffer, Digits), ZigzagBuffer, shift, White_Color, LineWidth);
CrEAtLine("rp1" + DoubleToStr(ZigzagBuffer, Digits), shift,Yellow);
}
return(0);
}
//+------------------------------------------------------------------+
//| 显示顶点值 |
//+------------------------------------------------------------------+
void Printrightprice(string mapName, double mapPrice, int mapShift, color mapColor, int mapwidth)
{
ObjectCreate(mapName, OBJ_ARROW, 0, Time, 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,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);
}
非常感谢分享,请问一下,怎么才能获取zigzag最后两个拐点的数值? 不错不错,很好哦 ZigZag显示顶点值指标 看帖回帖是美德!:lol 找到好贴不容易,我顶你了,谢了 谢谢分享~~~很需要
真好 ,特牛的东西 非常感谢 学习了,不错 {:1_181:}
页:
[1]
2