MT5 MT4 zigzag指标的算法详解

mt4 mt5的zigzag的指标算法,在度娘上面找到了不少,都是讲得云里雾里的,

有些讲得好像是很明了,但是,一对应到代码里面,就又懵了。到底这个是如何用代码实现。

经过我不懈的研读,测试,调试,终于解开了这个谜

首先是 mt4 5  的作图机制,包括这函数OnInit()  ,里面的东西就不详细讲了(主要是自己也没搞太清楚);

  主要的是  OnCalculate()的循环机制~~  

这里,我们主要是理解的是,通过这个函数的循环,我们可以获取的信息:

rates_total (所有k线数目),也就是bar的数目;

prev_calculated,这个是上次运行OnCalculate()留下的结果数目,这里的留的数值的就是bar数目;

后面的都好理解,open[] high[] low[] close[]   这个分别代表每个bar 的开盘价,最高价,最低价,收盘价。

 其他参数都米有用到的。

开始来重点了,下面出场的是我们都是经常迷惑的三个可调参数:InpDepth  InpDeviation InpBackstep

对应就是depth  deviation  backsteps    第一个叫宽度比较合适,第二个叫偏离偏差比较合适,名字上看就知道,指细微的差别,第三个即使字面意思了,回退步数,但是我觉得叫回溯步数更合适;

代码当中,同时还定义了重要存储各个顶点的三个数组:

ZigZagBuffer[] :这个是代表需要画出来的各个顶点,就是落实下来的上下转折点,这个是结合HighMapBuffer 和LowMapBuffer的所有点,重新筛选出来的;

HighMapBuffer[]:代表所有的合乎策略的高点,这个肯定比zigzag的高点要多

LowMapBuffer[]:同理这个代表合乎策略低点

以下就详细介绍的   High  Low 的MapBuffer是策略是如何实现的

这里就不结合枯燥的代码了,

只选Low的方向:

low点的选择是这样:在宽度范围depth,按默认值12,就是宽度范围为12跟k线寻找,只有这12根K线最后一根是这么多根线里面最低的(这里肯定最低价,不是收盘价),然后就会把这个最低值记录在LowMapBuffer里面,其它的值,全部是0

而且,误差范围在正负deviation(要乘以基点值)里面,都会去记录

按照以上话,就有可能会产生两个密集的低点,算法里面就会以后面一点的为准,然后往前回溯Backstep的步数,默认值是3步,就是回溯3个k线,把值清零。

可以这么理解,一个极值(low点或者high点)前后三步以内是不允许产生新的同方向的极值

就是low点前后三步,不会有low点 ,high点前后三步也是如此。

上图看再说明一次,以下这是一个宽12bar,就是12K线的水平线,

现在看这个两个低点不能成为极值点呢,

MT5 MT4 zigzag指标的算法详解_第1张图片

 我们用上面那条12宽度的水平线度量一下就懂,

MT5 MT4 zigzag指标的算法详解_第2张图片

 记住最新值跟最低点是同一个点的时候,才会更新为极值,反之亦然

这里还是附上原版代码可以对着看一下:

      val=low[Lowest(low,InpDepth,shift)];//这里Lowest函数是找出宽度InpDepth个K线的里面的最低值
      if(val==last_low)
         val=0.0;
      else
        {
         last_low=val;
         if((low[shift]-val)>InpDeviation*_Point)
            val=0.0;
         else
           {
            for(back=1; back<=InpBackstep; 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;

下面讲解另外一个难懂点,就是如何结合HighMapBuffer 和LowMapBuffer  筛选出来最终的zigzag

大概思路是这样:

HighMapBuffer 和LowMapBuffer同时从0位置开始遍历,这个0位置的肯定是对应最左边,时间最早的K线,然后先找出一个zigzag高点或者低点,记录在ZigZagBuffer里面,如果第一个找出来的是zigzag高点,下一个寻找的就必定是zigzag低点,反之亦然。高就肯定找HighMapBuffer   ,低就肯定是LowMapBuffer。

这里就会遇到一个问题,上图说明更清楚

MT5 MT4 zigzag指标的算法详解_第3张图片

 上图前面的第一个highmap高点,首先会记录zigzag高点,然后按照流程,下一步就要找zigzag低点,但是在下一个lowmap点找到之前,是要先更新zigzag前高点的值,只要找到更高的,就会自动更新,最后如图,zigzag高点就被挪到后面位置去了,直到找到lowmap低点,再把它记录到zigzag低点,然后就推出循环了。
 

 到这里,整个算法思路就基本讲完了

你可能感兴趣的:(c++)