注意!这版ZigZag指标基于 ZigZag代码,经作者PPC授权发布。我已测试该版本并修复了算法中的错误。
该代码是MetaTrader 5的MQL5版 Zigzag指标。
注意!AlexSTAL_OutsideBar.mqh库应位于 ..\MQL5\Include文件夹内的MetaTrader 5客户端终端。
这就是答案吗?
我认为ZigZag就像是对价格图表的压缩。ZigZag可以使用K线的收盘价(例如Close价格)或高低价格来计算(最常用的方法)。
在使用MetaQuotes提供的标准ZigZag时,我发现了一些错误。主要问题是标准ZigZag无法处理外部K线。
2007年,Rashid Umarov (Rosh)发布了带有外部K线处理的Zigzag2 R代码(采用DRAW_ZIGZAG风格而非DRAW_SECTION)。
让我们定义“正确”ZigZag实现的特征:
- 高点和低点必须严格交替;
- 当前高点必须高于(或等于)右侧所有K线,直到下一个(相反的)低点;
- 当前低点必须低于(或等于)左侧所有K线,直到下一个(相反的)高点。
让我们以示例(EURUSD,H1,2006年12月8日至13日)进行说明。这里有两个外部K线的案例。典型的ZigZag无法构建“正确”的图像。
![图1. 典型ZigZag,输入参数[12;5;3]和[12;0;0] 图1. 典型ZigZag,输入参数[12;5;3]和[12;0;0]](https://dailyforexmap.s3.ap-northeast-1.amazonaws.com/forum/202511/1763923773916-zz_011.webp)
图1. 典型ZigZag,输入参数[12;5;3]和[12;0;0]
![图2. Zigzag2 R,输入参数[12;5;3] 图2. Zigzag2 R,输入参数[12;5;3]](https://dailyforexmap.s3.ap-northeast-1.amazonaws.com/forum/202511/1763923774923-zz_031.webp)
图2. Zigzag2 R,输入参数[12;5;3]
![图3. Zigzag2 R,输入参数[12;0;0] 图3. Zigzag2 R,输入参数[12;0;0]](https://dailyforexmap.s3.ap-northeast-1.amazonaws.com/forum/202511/1763923775902-zz_021.webp)
图3. Zigzag2 R,输入参数[12;0;0]
乍一看,图3的构建是正确的,但这里有一些特征:
- 在这种情况下,构建是正确的,因为输入参数的缘故,但一般情况下算法必须适用于任何参数。
- 左侧的外部K线不正确,因为K线的高低形成顺序:

ZigZag段必须以这种方式构建。
我测试了许多ZigZag算法: ZigZag MT3, ZigZag, Zigzag R, Zigzag2 R, ZigZag_NK, ZigZag_ZUP89_nen, ZigZag_new_nen4, CZigZag, Swing_ZZ_1, DT_ZZ_nen, ZigZag_Talex, Reverse_ZZ, Points_ZZ_1, i_MF_Fractal_ZZ_3in1, ang_Amp_ZZ, ZigzagFr_v1, NonLagZigZag_v2, ZZ_FF_v3, ZigZag Ensign, ZigZag tauber, SQZZ Товаровед, ZZ_2L_nen wellx, Channel ZZ, Azzx_larryzz_3_0, RPoint, RPoint-m v2, ZigZagTF。但没有一个能正确解决这个问题。
以下是该指标的图示:
![图4. 专业ZigZag,输入参数[12;0] 图4. 专业ZigZag,输入参数[12;0]](https://dailyforexmap.s3.ap-northeast-1.amazonaws.com/forum/202511/1763923777684-zz_051.webp)
图4. 专业ZigZag,输入参数[12;0]
![图5. 专业ZigZag,输入参数[23;0] 图5. 专业ZigZag,输入参数[23;0]](https://dailyforexmap.s3.ap-northeast-1.amazonaws.com/forum/202511/1763923778688-zz_061.webp)
图5. 专业ZigZag,输入参数[23;0]
此版本的一些特征:
- 单次计算算法
- 仅重绘最后一段(该段无法取消,除非历史更新)
- 具有优化算法,用于K线内部的计算(在价格变化低于MinMotion输入参数定义的阈值时,不会进行tick重算)
- 提供两种高低形成顺序的算法:使用K线类型(快速但不精确)和使用来自低时间框架的数据(需要历史数据,需检查其存在性和正确性,或修改OutsideBar库)
以下是ZigZag构建不正确的额外示例:
![图6. EURUSD,H1,11月29日至12月7日(红线:ZigZag,输入参数[7;0;0];蓝线:Zigzag2 R,输入参数[7;0;0]) 图6. EURUSD,H1,11月29日至12月7日(红线:ZigZag,输入参数[7;0;0];蓝线:Zigzag2 R,输入参数[7;0;0])](https://dailyforexmap.s3.ap-northeast-1.amazonaws.com/forum/202511/1763923779494-zz_071.webp)
图6. EURUSD,H1,11月29日至12月7日(红线:ZigZag,输入参数[7;0;0];蓝线:Zigzag2 R,输入参数[7;0;0])

图7. EURUSD,H1,2010年11月29日至12月7日。ZigZag段的正确构建。
总结
遗憾的是,这个版本并不完美,但我正在努力改进。
由于通道算法(iHighest/iLowest),有时会跳过高点。
请告诉我关于该指标的错误和特性。