加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Zigzag之字形指标

(2015-03-30 11:01:15)
标签:

股票

低点

高点

拐点

指标

杂谈

Zigzag指标是连接一系列价格点的趋势线。最小价格的参数改变需要在定单中从新的"Zig" 或 "Zag" 线中确定百分比。这个指标可以消除价格点的改变,分析的价值少于给出的价值。因此,Zigzag指标只反映明显的变化。其主要用途是来标识过去价格中的相对高低点,并以这些点之间的连线来表示这段价格变动的趋势。多数情况下,我们使用之字形很容易感知到价格点,最重要的是它能够显示其转换和改变。在它的帮助下,你同样可以揭示Elliot波动和多样的情形。



Zigzag指标算法

1. Zigzag的3个参数

Zigzag在识别高低点的过程中,主要设置了以下三个参数:ExtDepth, DextDeviation 以及ExtBackstep。程序中的表示:

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;

说明:
ExtDepth:用于设置高低点是相对与过去多少个Bars(价格图形中的一个柱子)而言。Mt4中默认是12。
ExtDeviation:用于设置重新计算高低点时,与前一高低点的相对点差。默认值是5, 也就是说如果
A)当前高点>上个高点 5 ,或者
B)当前低点<上个低点 – 5的情况下,则会对之前计算过的ExtBacksteps个Bars值的高低点进行重新计算。
ExtBackstep:用于设置回退计算的Bars的个数。

2. Zigzag算法

1对计算位置进行初期化
1.1判断是否是第一次进行高低点计算,如果是,则设定计算位置为除去ExtDepth个图形最初的部分。
1.2如果之前已经计算过,找到最近已知的三个拐点(高点或低点),将计算位置设置为倒数第三个拐点之后,重新计算最后的拐点。

2. 从步骤1已经设置好的计算位置开始,将对用于存储高低点的变量进行初始化,准备计算高低点
2.1计算ExtDepth区间内的低点,如果该低点是当前低点,则进行2.1.1的计算,并将其记录成一个低点。
2.1.1如果当前低点比上一个低点值小于相对点差(ExtDeviation);并且之前ExtBackstep个Bars的记录的中,高于当前低点的值清空。
2.2高点的计算如同2.1以及分支处理2.1.1。

3. 从步骤1已经设置好的计算位置开始,定义指标高点和低点
3.1如果开始位置为高点,则接下来寻找低点,在找到低点之后,将下一个寻找目标定义为高点
3.2如果开始位置为低点,则与3.1反之。

以上可能比较难以理解,我们这边举个例子说明:

假设上次计算的结果如下:倒数第14个Bar出现了一个高点(3.1),倒数第4个是低点(1.5),
倒数第1个是新的高点(2.1)——因为距离倒数第14已经大于ExtDepth(14-1>12)。

Bar-14   Bar-4  Bar-1   Bar-Current
高(3.1)  低(1.5)  高(2.1)    X

对于Bar-Current,即当前的价格X,
CaseI.
如果 X >=2.1 ExtDeviation,则根据Zigzag的定义,这将是一个新的高点。假设这里X=2.3,那么我们绘制指标的时候应该成为:
Bar-14    Bar-4  Bar-Current
高(3.1)    低(1.5)  高(2.3)    

CaseII.
如果 1.5 - ExtDeviation< X<2.1 ExtDeviation,则我们继续等待价格的变化,所绘制的指标也不会变化。

CaseIII.
如果 1.5 - ExtDeviation>= X,则这是一个新的低点。假设这里X=1.3,则我们绘制指标的时候应该成为:
Bar-14   Bar-Current
高(3.1)    低(1.3)

这个时候,之前的Bar-4因为在我们定义的ExtBackstep之内(1-4),所以他的最低值会被清空,
根据算法第三步的定义,我们会一直寻找低点直到发现Bar-Current,这时候已经遍历过Bar-1,所以Bar-1定义的高点也不再成为拐点。这也就是所谓的重绘部分,也因此诟病为“未来函数”——因为所看见的当前最后的高低点可能在下个时间段里面被抹去。

3. Zigzag源码及解释:
Mt4的Zigzag源码里面的注释特别稀罕,估计是感觉实现比较简单,所以一概略去——恩,极坏的编程习惯。
下面简要说明一下,中文部分都是追加的解释:


  1. // ——————————————————————
  2. //|                                                       Zigzag.mq4 |
  3. //|                 Copyright ?2005-2007, MetaQuotes Software Corp. |
  4. //|                                       http://www.metaquotes.net/ |
  5. // ——————————————————————
  6. #property copyright “Copyright ?2007, MetaQuotes Software Corp.”
  7. #property link      “http://www.metaquotes.net/”

  8. //Mt4特有的指标属性设置
  9. #property indicator_chart_window      //主窗口进行指标显示
  10. #property indicator_buffers 1            //指标运用到数值的个数
  11. #property indicator_color1 Red       //指标显示颜色
  12. //—- indicator parameters
  13. //Zigzag的三个参数
  14. extern int ExtDepth=12;
  15. extern int ExtDeviation=5;
  16. extern int ExtBackstep=3;

  17. //—- indicator buffers
  18. //指标的数值存储变量
  19. double ZigzagBuffer[];        //拐点
  20. double HighMapBuffer[];      //高点的临时变量数组
  21. double LowMapBuffer[];    //低点的临时变量数组

  22. int level=3; // recounting’s depth  //最近已知的三个拐点
  23. bool downloadhistory=false; //是否第一次计算
  24. // ——————————————————————
  25. //| Custom indicator initialization function                         |
  26. // ——————————————————————

  27. //Init函数是Mt4指标第一次载入之后运行的初期化函数
  28. int init()
  29.   {
  30.    IndicatorBuffers(3); //对于缓冲储存器分配记忆应用自定义指标计算,用F1可以看到该函数的帮助和解释
  31. //—- drawing settings
  32.    SetIndexStyle(0,DRAW_SECTION);     //划线的风格
  33. //—- indicator buffers mapping
  34.    SetIndexBuffer(0,ZigzagBuffer);
  35.    SetIndexBuffer(1,HighMapBuffer);
  36.    SetIndexBuffer(2,LowMapBuffer);
  37.    SetIndexEmptyValue(0,0.0);
  38.    
  39. //—- indicator short name
  40.    IndicatorShortName(”ZigZag(” ExtDepth ”,” ExtDeviation ”,” ExtBackstep ”)”);        //设置指标的简称。
  41. //—- initialization done
  42.    return(0);
  43.   }
  44. // ——————————————————————
  45. //|                                                                  |
  46. // ——————————————————————

  47. //start函数是Mt4的主函数,当每次价格变动之后都会触发该函数的执行
  48. int start()
  49.   {
  50. //变量定义

  51.   //i:临时变量;
  52.   //counted_bars :用于标识已经计算过的Bar数
  53.    int i, counted_bars = IndicatorCounted();

  54.    //limit:算法中所谓的开始计算位置;
  55.   //counterZ:临时变量
  56.   //whatlookfor:用于标识当前计算的是高点或者低点
  57.    int limit,counterZ,whatlookfor;      

  58.   //以下都是临时变量,具体设值时解释
  59.    int shift,back,lasthighpos,lastlowpos;
  60.    double val,res;
  61.    double curlow,curhigh,lasthigh,lastlow;

  62.    if (counted_bars==0 && downloadhistory) // history was downloaded
  63.        //指标载入时counted_bars为0,而downloadhistory为false,将在下一次价格变化时进行
  64.       ArrayInitialize(ZigzagBuffer,0.0);
  65.       ArrayInitialize(HighMapBuffer,0.0);
  66.       ArrayInitialize(LowMapBuffer,0.0);
  67.      }
  68.    if (counted_bars==0)
  69.      { //初期化,第一次运行时limit为除去ExtDepth个图形最初的部分。(算法1.1)
  70.       limit=Bars-ExtDepth;
  71.       downloadhistory=true;
  72.      }
  73.    if (counted_bars>0)
  74.      {//如果之前已经计算过,找到最近已知的三个拐点(高点或低点),将计算位置设置为倒数第三个拐点。(算法1.2)
  75.       while (counterZ<100)
  76.         {
  77.          res=ZigzagBuffer;
  78.          if (res!=0) counterZ ;
  79.          i ;
  80.         }
  81.       i–;           //在上面while中最后一次找到的时候进行 1,所以要-1才能得到真正第三个拐点处。
  82.       limit=i;  //计算位置赋值
  83.       if (LowMapBuffer!=0)
  84.         {//如果倒数第三个拐点是低点
  85.          curlow=LowMapBuffer;
  86.          //目标在于寻找高点
  87.          whatlookfor=1;
  88.         }
  89.       else
  90.         {
  91.          curhigh=HighMapBuffer;
  92.          whatlookfor=-1;
  93.         }
  94.       for (i=limit-1;i>=0;i–)
  95.         {//清空第三个拐点后的数值,准备重新计算最后的拐点
  96.          ZigzagBuffer=0.0;
  97.          LowMapBuffer=0.0;
  98.          HighMapBuffer=0.0;
  99.         }
  100.      }


  101. //算法Step2部分:计算高低点
  102.    for(shift=limit; shift>=0; shift–)
  103.      {
  104.       //2.1计算ExtDepth区间内的低点
  105.       val=Low[iLowest(NULL,0,MODE_LOW,ExtDepth,shift)];
  106.       if(val==lastlow) val=0.0;
  107.       else
  108.         {//如果该低点是当前低点,
  109.          lastlow=val;
  110.          if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;        //是否比上个低点还低ExtDeviation,不是的话则不进行回归处理
  111.          else
  112.            {//找到一个新的低点
  113.             for(back=1; back<=ExtBackstep; back )
  114.               {//回退ExtBackstep个Bar,把比当前低点高的纪录值给清空
  115.                res=LowMapBuffer[shift back];
  116.                if((res!=0)&&(res>val)) LowMapBuffer[shift back]=0.0;
  117.               }
  118.            }
  119.         }
  120.       //将新的低点进行记录
  121.       if (Low[shift]==val) LowMapBuffer[shift]=val; else LowMapBuffer[shift]=0.0;

  122.       //— high
  123.       val=High[iHighest(NULL,0,MODE_HIGH,ExtDepth,shift)];
  124.       if(val==lasthigh) val=0.0;
  125.       else
  126.         {
  127.          lasthigh=val;
  128.          if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
  129.          else
  130.            {
  131.             for(back=1; back<=ExtBackstep; back )
  132.               {
  133.                res=HighMapBuffer[shift back];
  134.                if((res!=0)&&(res
  135.               }
  136.            }
  137.         }
  138.       if (High[shift]==val) HighMapBuffer[shift]=val; else HighMapBuffer[shift]=0.0;
  139.      }

  140.    // final cutting
  141.    if (whatlookfor==0)
  142.      {
  143.       lastlow=0;
  144.       lasthigh=0;
  145.      }
  146.    else
  147.      {
  148.       lastlow=curlow;
  149.       lasthigh=curhigh;
  150.      }

  151. //算法step3.定义指标的高低点
  152.    for (shift=limit;shift>=0;shift–)
  153.      {
  154.       res=0.0;
  155.       switch(whatlookfor)
  156.         {
  157.          //初期化的情况下,尝试找第一个高点或者是地点
  158.          case 0: // look for peak or lawn
  159.             if (lastlow==0 && lasthigh==0)
  160.               {//lastlow,lasthigh之前已经初始化,再次判断以保证正确性?
  161.                if (HighMapBuffer[shift]!=0)
  162.                  {//发现高点
  163.                   lasthigh=High[shift];
  164.                   lasthighpos=shift;
  165.                   whatlookfor=-1;        //下个寻找目标是低点
  166.                   ZigzagBuffer[shift]=lasthigh;
  167.                   res=1;
  168.                  }
  169.                if (LowMapBuffer[shift]!=0)
  170.                  {//发现低点
  171.                   lastlow=Low[shift];
  172.                   lastlowpos=shift;
  173.                   whatlookfor=1;       //下个寻找目标是高点
  174.                   ZigzagBuffer[shift]=lastlow;
  175.                   res=1;
  176.                  }
  177.               }
  178.              break;
  179.          case 1: // look for peak      //寻找高点
  180.             if (LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]
  181.               {//如果在上个低点和下个高点间发现新的低点,则把上个低点抹去,将新发现的低点作为最后一个低点
  182.                ZigzagBuffer[lastlowpos]=0.0;
  183.                lastlowpos=shift;
  184.                lastlow=LowMapBuffer[shift];
  185.                ZigzagBuffer[shift]=lastlow;
  186.                res=1;
  187.               }
  188.             if (HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0)
  189.               {//发现目标高点
  190.                lasthigh=HighMapBuffer[shift];
  191.                lasthighpos=shift;
  192.                ZigzagBuffer[shift]=lasthigh;
  193.                whatlookfor=-1;        //下一个目标将是寻找低点
  194.                res=1;
  195.               }
  196.             break;            
  197.          case -1: // look for lawn          //寻找低点
  198.             if (HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]==0.0)
  199.               {
  200.                ZigzagBuffer[lasthighpos]=0.0;
  201.                lasthighpos=shift;
  202.                lasthigh=HighMapBuffer[shift];
  203.                ZigzagBuffer[shift]=lasthigh;
  204.               }
  205.             if (LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0)
  206.               {
  207.                lastlow=LowMapBuffer[shift];
  208.                lastlowpos=shift;
  209.                ZigzagBuffer[shift]=lastlow;
  210.                whatlookfor=1;
  211.               }
  212.             break;            
  213.          default: return;
  214.         }
  215.      }

  216.    return(0);
  217.   }
  218. // ——————————————————————

复制代码

4.总结

以上就是对Zigzag算法和实现的分析。希望能够对大家编写指标和EA有所帮助。
原文来自:股票自动机-AI Invest博客

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有