1、Zigzag指标算法Zigzag指标算法如官方所述:Zigzag指标是连接一系列价格点的趋势线。所以Zigzag主要用途是来标识过去价格中的相对高低点,并以这些点之间的连线来表示这段价格变动的趋势。文章来自:股票自动机-AI Invest:专注于自动交易系统研究和开发的博客1.Zigzag的3个参数Zigzag在识别高低点的过程中,主要设置了以下三个参数:ExtDepth, DextDeviation以及ExtBackstep。程序中的表示:extern int ExtDepth=12;extern int ExtDeviation=5;extern int ExtBackstep=3;说明:
2、ExtDepth:用于设置高低点是相对与过去多少个Bars(价格图形中的一个柱子)而言。Mt4中默认是12。ExtDeviation:用于设置重新计算高低点时,与前一高低点的相对点差。默认值是5, 也就是说如果A)当前高点上个高点 5 ,或者B)当前低点12)。Bar-14Bar-4Bar-1Bar-Current高(3.1)低(1.5)高(2.1) X对于Bar-Current,即当前的价格X,CaseI.如果 X =2.1ExtDeviation,则根据Zigzag的定义,这将是一个新的高点。假设这里X=2.3,那么我们绘制指标的时候应该成为:Bar-14Bar-4Bar-Current高
3、(3.1)低(1.5)高(2.3)CaseII.如果 1.5- ExtDeviationX=X,则这是一个新的低点。假设这里X=1.3,则我们绘制指标的时候应该成为:Bar-14Bar-Current高(3.1) 低(1.3)这个时候,之前的Bar-4因为在我们定义的ExtBackstep之内(1-4),所以他的最低值会被清空,根据算法第三步的定义,我们会一直寻找低点直到发现Bar-Current,这时候已经遍历过Bar-1,所以Bar-1定义的高点也不再成为拐点。这也就是所谓的重绘部分,也因此诟病为“未来函数”因为所看见的当前最后的高低点可能在下个时间段里面被抹去。3Zigzag源码及解释:
4、Mt4的Zigzag源码里面的注释特别稀罕,估计是感觉实现比较简单,所以一概略去恩,极坏的编程习惯。下面简要说明一下,中文部分都是追加的解释:/ /|Zigzag.mq4 |/|Copyright ?2005-2007, MetaQuotes Software Corp. |/| |/ #property copyright “Copyright ?2007, MetaQuotes SoftwareCorp.”#propertylink“/Mt4特有的指标属性设置#propertyindicator_chart_window/主窗口进行指标显示#property indicator_buffe
5、rs1/指标运用到数值的个数#property indicator_color1Red/指标显示颜色/- indicator parameters/Zigzag的三个参数extern int ExtDepth=12;extern int ExtDeviation=5;extern int ExtBackstep=3;/- indicator buffers/指标的数值存储变量doubleZigzagBuffer;/拐点doubleHighMapBuffer;/高点的临时变量数组doubleLowMapBuffer;/低点的临时变量数组int level=3; / recountings dep
6、th/最近已知的三个拐点bool downloadhistory=false; /是否第一次计算/ /| Custom indicator initializationfunction|/ /Init函数是Mt4指标第一次载入之后运行的初期化函数int init() IndicatorBuffers(3);/对于缓冲储存器分配记忆应用自定义指标计算,用F1可以看到该函数的帮助和解释/- drawing settingsSetIndexStyle(0,DRAW_SECTION);/划线的风格/- indicator buffers mappingSetIndexBuffer(0,ZigzagBu
7、ffer);SetIndexBuffer(1,HighMapBuffer);SetIndexBuffer(2,LowMapBuffer);SetIndexEmptyValue(0,0.0);/- indicator short name IndicatorShortName(”ZigZag(”ExtDepth ”,” ExtDeviation ”,” ExtBackstep”)”);/设置指标的简称。/- initialization done return(0); / /|/ /start函数是Mt4的主函数,当每次价格变动之后都会触发该函数的执行int start() /变量定义 /i:临
8、时变量; /counted_bars :用于标识已经计算过的Bar数 int i, counted_bars =IndicatorCounted(); /limit:算法中所谓的开始计算位置; /counterZ:临时变量 /whatlookfor:用于标识当前计算的是高点或者低点 intlimit,counterZ,whatlookfor; /以下都是临时变量,具体设值时解释intshift,back,lasthighpos,lastlowpos; double val,res; doublecurlow,curhigh,lasthigh,lastlow; if (counted_bars=
9、0& downloadhistory) / history wasdownloaded/指标载入时counted_bars为0,而downloadhistory为false,将在下一次价格变化时进行ArrayInitialize(ZigzagBuffer,0.0);ArrayInitialize(HighMapBuffer,0.0);ArrayInitialize(LowMapBuffer,0.0); if (counted_bars=0) /初期化,第一次运行时limit为除去ExtDepth个图形最初的部分。(算法1.1)limit=Bars-ExtDepth;downloadhistor
10、y=true; if(counted_bars0)/如果之前已经计算过,找到最近已知的三个拐点(高点或低点),将计算位置设置为倒数第三个拐点。(算法1.2)while (counterZlevel& i=0;i)/清空第三个拐点后的数值,准备重新计算最后的拐点ZigzagBufferi=0.0;LowMapBufferi=0.0;HighMapBufferi=0.0;/算法Step2部分:计算高低点 for(shift=limit;shift=0; shift)/2.1计算ExtDepth区间内的低点val=LowiLowest(NULL,0,MODE_LOW,ExtDepth,shift);
11、if(val=lastlow) val=0.0;else/如果该低点是当前低点,lastlow=val;if(Lowshift-val)(ExtDeviation*Point)val=0.0;/是否比上个低点还低ExtDeviation,不是的话则不进行回归处理else/找到一个新的低点for(back=1; backval)LowMapBuffershift back=0.0;/将新的低点进行记录if (Lowshift=val) LowMapBuffershift=val; elseLowMapBuffershift=0.0;/ highval=HighiHighest(NULL,0,MO
12、DE_HIGH,ExtDepth,shift);if(val=lasthigh) val=0.0;elselasthigh=val;if(val-Highshift)(ExtDeviation*Point)val=0.0;elsefor(back=1; back=ExtBackstep; back )res=HighMapBuffershift back;if(res!=0)&(res=0;shift)res=0.0;switch(whatlookfor)/初期化的情况下,尝试找第一个高点或者是地点case 0: / look for peak or lawnif (lastlow=0 &la
13、sthigh=0)/lastlow,lasthigh之前已经初始化,再次判断以保证正确性?if (HighMapBuffershift!=0)/发现高点lasthigh=Highshift;lasthighpos=shift;whatlookfor=-1;/下个寻找目标是低点ZigzagBuffershift=lasthigh;res=1;if (LowMapBuffershift!=0)/发现低点lastlow=Lowshift;lastlowpos=shift;whatlookfor=1;/下个寻找目标是高点ZigzagBuffershift=lastlow;res=1;break;cas
14、e 1: / look forpeak/寻找高点if (LowMapBuffershift!=0.0 &LowMapBuffershiftlasthigh& LowMapBuffershift=0.0)ZigzagBufferlasthighpos=0.0;lasthighpos=shift;lasthigh=HighMapBuffershift;ZigzagBuffershift=lasthigh;if (LowMapBuffershift!=0.0 &HighMapBuffershift=0.0)lastlow=LowMapBuffershift;lastlowpos=shift;ZigzagBuffershift=lastlow;whatlookfor=1;break;default: return; return(0); / 4.总结以上就是对Zigzag算法和实现的分析。希望能够对大家编写指标和EA有所帮助。