360 发表于 2016-11-14 20:18:19

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);
   
}


cooker_wang 发表于 2017-3-30 19:58:12

非常感谢分享,请问一下,怎么才能获取zigzag最后两个拐点的数值?

阅乐芙月 发表于 2018-8-26 17:07:49

不错不错,很好哦

jaryk 发表于 2018-8-26 17:20:41

ZigZag显示顶点值指标

巴黎不快乐 发表于 2020-6-19 20:52:14

看帖回帖是美德!:lol

一笑 发表于 2020-6-21 10:26:47

找到好贴不容易,我顶你了,谢了

winer 发表于 2020-6-23 00:22:42

谢谢分享~~~很需要

a178 发表于 2020-7-2 16:09:04

真好 ,特牛的东西 非常感谢

快速开始 发表于 2020-7-29 18:11:35

学习了,不错

stock 发表于 2020-11-9 10:06:06

{:1_181:}
页: [1] 2
查看完整版本: ZigZag显示顶点值指标