并且在有一些事件发生时也会完整计算?mt4怎么
并且在有一些事件发生时也会完整计算?mt4怎么登入观摩彰彰,之字转向有两种状况: 它的目标向上或者向下。当线的目标是向上时 — 看守代价看是否有新越过现, 而当线的目标是向下时 — 恭候新低的浮现。还必要看守看是否知足条款指示有目标的改换,是以,为了画出一条之字转向,必要做的是:
源数据能够是单唯一个序列 (比方,柱的收盘价) 或者两个序列 (比方,柱的最高价和最低价),即使利用了一个数据序列,它能够不但利用收盘价,并且能够是任何目标,振撼目标或者转移均匀。当依据目标数据绘制之字转向时,也恐怕利用两个数据序列: 一个是基于柱的最高价的目标数据,而另一个是基于柱的最低价的数据。
目标改换的条款是最主要的一点,它界说了之字转向的区别类型。这些条款恐怕有很大的区别。比方,如许的条款能够是依据目前柱与n个柱的最高价/最低价做对照而组成,换句话说,即使目前柱的源数据的值是近来n个柱的最大值或者最小值,这就界说了之字转向的目标。这个准绳运用正在经典的之字转向目标中。另一个手腕 — 依据从固定最大值或者最小值回滚的巨细。回滚的巨细能够以点数权衡 (即使源序列为代价) 或者是商定的单元 (即使是某些目标)。能够利用的手腕并不局部于这两种,也能够利用任何目标占定目标 — 如随机振撼目标, ADX, 等等。即使随机振撼目标正在50以上,之字转向目标就指向上方,即使它低于50 - 就指向下方。现正在,依据 ADX 占定目标:即使 PDI 线正在 MDI 线上方,之字转向线就指向上方,即使 PDI 低于 MDI,就指向下方。 如许,为第一点和第二点通过组合区别的改观,就能得到各样区别的之字转向。其它,当然还能够利用 RSI 数据用于第一点而依据随机振撼目标来占定目标,以此类推。第三点只对看起来相像于之字转向的目标有须要,假使绘制选项能够有很大区别。 由于赫兹量化买卖软件这里的劳动是得到一个通用目标,有须要尽恐怕小心地把算法分成两个部门: 关于统统之字转向都同样的部门 (把它称为共用部门) 以及依赖于之字转向的区别部门 (把它称为个人部门)。个人部门利用源数据填充目标缓冲区: 代价或者目标数据。另一个缓冲区 (决意之字转向线值来填充。这三个缓冲区传给共用部门,正在个中会利用它们绘制目标自己。 为了使流程愈加知晓,起初创筑一个独自的目标,它基于柱的最高/最低价,而且依据第n个柱的最高/最低价来改换放向。 基于最高价/最低价的浅易之字转向目标 正在 MetaEditor 中创筑一个新目标 (主菜单 — 文献 — 新筑或者按下 Ctrl+N). 正在目标创筑导游中,输入名称“iHighLowZigZag”,创筑一个外部参数 period (int 类型, 数值为 12), 遴选 OnCalculate(...,open,high,low,close) 事变管制函数, 创筑一个缓冲区,名称为 ZigZag (Section 类型, 利用赤色) 以及其它三个缓冲区,名称划分为 Direction, LastHighBar 和 LastLowBar (line 类型, 颜色为 none)。 ZigZag 缓冲区将用于显示之字转向,其余的缓冲区是辅助的。关于统统的辅助缓冲区,正在OnInit()函数中,移用SetIndexBuffer()函数把 INDICATOR_DATA 类型改为 INDICATOR_CALCULATIONS类型。正在文献的顶部,批改 indicator_plots 属性的值: 把数值设为 1。正在那往后,目标会只画一个 ZigZag 缓冲区, 而且目标不会画任何众余的线,然则同时,其它的缓冲区能够用理由 iCustom() 函数做管制。 起初,入手盘算推算的柱的索引(start变量)是正在OnCalculate()函数中确定的,是以只要正在目标入手的工夫才会盘算推算统统的柱,往后的盘算推算只正在每个新柱前进行。其它,还要初始化缓冲区的元素: int start; // 入手盘算推算的柱的索引 if(prev_calculated==0) { // 正在启动时 // 初始化缓冲区元素 DirectionBuffer[0]=0; LastHighBarBuffer[0]=0; LastLowBarBuffer[0]=0; start=1; // 从初始化之后的元素入手盘算推算 } else { // 正在运转中 start=prev_calculated-1; } } 现正在,主目标轮回: for(int i=start;irates_total;i++) { 就像上面描摹的那样,为了得到通用性,必要把代码分为之字转向目标的盘算推算以及它的绘制两个部门,这个准绳将要听命。起初写出用于确定目标的代码,为了确定目标,利用ArrayMaximum()和ArrayMinimum()函数。即使正在盘算推算的柱上浮现了高价或者低价,Direction 数组的元素就被赋值为 1 或者 -1,为了获得之字转向正在每个柱确当前线向的新闻,正在盘算推算目标之前,从 Direction 缓冲区的前一个元素赢得数值并赋给目前的元素: // 赢得前一个 // 确定目标数组元素的值 DirectionBuffer[i]=DirectionBuffer[i-1]; // 盘算推算初始柱的 // ArrayMaximum() 和 ArrayMinimum() 函数值 int ps=i-period+1; // 确定最高价和最低价 // 正在 period 个柱的界限之内 int hb=ArrayMaximum(high,ps,period); int lb=ArrayMinimum(low,ps,period); // 即使识别到最高价或者最低价 if(hb==i && lb!=i) { // 找到了最高价 DirectionBuffer[i]=1; } else if(lb==i && hb!=i) { // 找到了最低价 DirectionBuffer[i]=-1; } 请小心代码的终末部门: 它识别最高价或者最低价,查抄目前柱上是否同时有最高价而且没有最低价,或者相反:有最低价而没有最高价。有工夫,恐怕会有十分长的柱形,恐怕同时正在上面确定两个目标,正在这种情景下,Direction 缓冲区会蕴涵之前确认的目标。 大凡来说,正在 MetaTrader 5 终端内,能够创筑一个之字转向,画出笔直的线段,这使得能够正在统一个柱上显示目标目标的两个改观,然则,如许的之字转向类型不正在本文接头界限之内。 让咱们延续正在主轮回中写代码: 以下片断将用于画出之字转向线,其余两个缓冲区将与 Direction 缓冲区作相似的管制: LastHighBarBuffer[i]=LastHighBarBuffer[i-1]; LastLowBarBuffer[i]=LastLowBarBuffer[i-1]; 这两个缓冲区将蕴涵之字转向中近来的最高价和最低价柱的索引数据。除了那些必要画出目标的柱的索引,那些缓冲区正在从EA买卖中移用之字转向目标也是被多量运用的,那样就不必要正在轮回中迭代统统的柱来找到近来的高点了。 确保扫除之字转向目标的缓冲区: ZigZagBuffer[i]=EMPTY_VALUE; 必需如许做是由于只要正在启动时才会完美盘算推算目标,而且正在有极少事变发作时也会完美盘算推算,比方下载史籍时。缓冲区恐怕有旧的数据,这恐怕会侵犯目标线的外观。 现正在,让咱们转到画图,正在此,算法被分为四个分支: 入手新的向上转移,入手新的向下转移,延续向上转移,延续向下转移。为了查抄目标值,正在盘算推算和前一个柱上利用了 switch 操作符: switch((int)DirectionBuffer[i]) { case 1: switch((int)DirectionBuffer[i-1]) { case 1: // 延续向上的转移 ... break; case -1: // 入手新的向上转移 ... break; } break; case -1: switch((int)DirectionBuffer[i-1]) { case -1: // 延续向下的转移 ... break; case 1: // 入手新的向下转移 ... break; } break; 剩下的劳动是写四个代码块,它们个中的两个将要精细讨论: 入手新的向上转移和延续向上转移。当 Direction 缓冲区的值从-1形成1的工夫入手新的向上转移,当浮现这种情景时,算法会画出之字转向的一个新点,并保全新目标入手时的柱的索引: ZigZagBuffer[i]=high[i]; LastHighBarBuffer[i]=i;