MQL5:zig-zag 指标

Zig-Zag 指标是用于描述高低点趋势的指标。


MQL5 官方实现

MQL5 官方实现十分地烂,辣鸡,很多无用的变量,程序冗长,不一致,效率低下。
感觉是多个菜鸟合作写出来的,有一些没有用的变量都没有删掉。
不过,先来看看MQL5的官方实现:

辅助函数

首先引入两个辅助用纯函数1,用于搜索一个数组中一个区间内的最大/最小值的索引。

array[iHighest]=maxi(startPosdepth,startPos]{ array[i]}

array[iLowest]=mini(startPosdepth,startPos]{ array[i]}

// searching index of the highest bar
int iHighest(const double &array[], int depth, int startPos);
// searching index of the lowest bar
int iLowest(const double &array[], int depth, int startPos);

尽管数学上是这样定义的,实际的编程中还需要考虑一些其他的问题:

  1. 区间是否会越界?如果越界了怎么处理?
    可能,但程序保证 startPos - depth >= 0 ,不过官方这样做仍有后果:永远无法引用 array[0]
  2. 在区间中遇到多个最值点如何处理?
    取索引号最大的,因为是从startPos 开始倒序搜索,并且采取了尽量少更新最值的策略,所以结果就是取索引号最大的。

指标参数

  • 搜索深度(ExtDepth)
    上述【辅助函数】中用于计算区间最大/最小的索引号的函数中使用的参数depth,即区间长度。
    (实际上在Zig-Zag指标中在区间中搜索最值总是使用ExtDepth 作为区间长度,默认为12)
  • 最大点数差(ExtDeviation)
    实际上,要将点数转化成价格:deviation = ExtDeviation * _Point; (_Point 是一个点的价格)
    正常情况下,希望当前的最高/低价格处于一个区间。

    nowHigh<lastHigh+deviation

    nowLow>lastLowdeviation

    • 当前柱的最高价不高于上一个高点价位共 ExtDeviation (点)
    • 当前柱的最低价不低于上一个低点价位共 ExtDeviation (点)
      如果这两个条件不满足,即价格超出了上一个高点与上一个低点所划定的区间,要进行回退重算高低点。
      正常情况下是不需要回退重计算的,但同时也不会产生新的Zig-Zag转折点。
  • 回退计算周期(ExtBackstep) 见【回退计算】

重计算区域的选取

最多只需要变动最新的两个Zig-Zag就可以完成重计算,这两个Zig-Zag的值一个是高点一个是低点,即只有最新的Zig-Zag高、低点是不稳定的

所以我们需要向前找3个Zig-Zag点,重新计算从第三新的Zig-Zag点之后的指标值。

(rates_total - 100, rates_total) 区间中找到至多3个Zig-Zag点。

  • 如果这个区间中有至少3个Zig-Zag点,取最新的3个。
  • 如果这个区间中有0~2个Zig-Zag点(异常),取rates_total - 99 (区间中最早的柱) 作为 Zig-Zag 点。

注意:实际上100柱内不到3个 Zig-Zag点这个情况是异常的,官方实现中有这样的漏洞,没有对这种情况进行特殊的处理,也没有报警告。
这个100是程序预设的常量,要求程序从100柱才开始计算指标:越大则取不到3个Zig-Zag的异常越不容易发生,但是同时计算指标的起点会延后,会损失更多的数据。
实际上这个设计完全可以用程序逻辑来规避,官方的实现不是一个好的设计。

以下只讨论正常情况(取到最新的3个Zig-Zag点)。

取3个点中最早的一个Zig-Zag点,看它是低点还是高点:

  • 如果是低点,接下来应该是一个\/ 形状的凹槽(Pike)
    高Zig-Zag + 低Zig-Zag + 当前点
  • 如果是高点,接下来应该是一个/\ 形状的凸起(Sill)
    低Zig-Zag + 高Zig-Zag + 当前点

最后抹除这个最早的Zig-Zag点之后的所有指标数据(不包括原始价格数据),因为要进行重算。

回退计算

最新的一组高、低点划定了一个价格区间:[lastLow - deviation, lastHigh + deviation]
如果当前价格超出了这个区间,就要进行回退计算,试图修改最新的高/低点。

参数 ExtBackstep 回退步数,默认是3。
设当前计算到 X 号柱,回退时仅考虑[X - ExtBackstep, X) 这个区间中是否有高(低)点,如果有,判断当前价格(X号柱的最高(低)价)是否比这个高(低)点更高(低),如果是,重设这个高(低)点到X号柱。

回退计算的触发条件有两个:
1. 在ExtDepth 长度的区间内发现了新的高(低)点。
2. 当前柱的价格超过限定的区间。

重建指标

在高点、低点序列全部计算完毕以后,要合并成Zig-Zag序列。


参考资料

  • MQL5 ZigZag 官方实现

  1. 纯函数,即无副作用函数。输入不变的情况下结果一定不变,不涉及函数外变量的函数。 ↩

你可能感兴趣的:(MQL)