MQL5 中艾略特波浪的自动分析:从 ZigZag 到波浪标记
艾略特波浪理论认为价格受群体心理驱动,呈“推动波(5)+调整波(3)”的循环,且大浪由小浪分形嵌套而成。手动数浪主观、费时,自动标记器因此而生。本文用 MQL5 实现一套自动分析程序:先用 Zigzag 找拐点,再枚举所有合法波浪标记,按波浪规则逐一校验,最后用树结构存下完整波浪层级。
一、艾略特波浪理论回顾
推动波是 5 个子波(1-2-3-4-5),调整波是 3 个(A-B-C,或更复杂的双重三、三重三)。核心铁律:第 2 波不破第 1 波起点;第 3 波从不最短且必为推进;第 4 波不破第 1 波顶;第 3 波必为推动波。调整波里三角形、平顶、锯齿各有自己的子规则。原文列出了从经典到现代(倾斜三角形、引导楔形等)的完整规则表,是自动校验的“法条”。
二、自动标记的两大思路
- 自上而下(分形):先在最大区间找大浪,再递归进子浪,逐层细化——契合波浪的分形嵌套特性
- 穷举枚举:直接列出某区间内所有可能的点组合与波浪标记,再逐一用规则过滤
实际程序把两者结合:Zigzag 先给出候选拐点,枚举这些点能拼出哪些合法标记,按规则筛掉非法的,剩下的再向下分析其子浪。
三、Zigzag 找点 + 枚举 + 规则校验
分析推动波需要 6 个点(5 顶点+1 起点),分析锯齿波需要 4 个点。Zigzag 若在图上只找到 6 个点,标记立即唯一;若找到 8 个点,就要枚举多种标记(图里用不同颜色标出),对每种标记跑一遍规则检查。
// Zigzag 在 [Start,Finish] 内用参数 H 计算拐点,
// 把找到的顶点索引/值写入数组,返回顶点数量
int Zigzag(int H, int Start, int Finish,
CArrayInt *IndexVertex, CArrayDouble *ValueVertex);
四、波浪的三种状态:未开始 / 未结束 / 已完成
大区间里往往无法确定波浪的起点终点,作者据此把波浪分三组:未开始(编号后带“<”,如缺第 1 波的 1<-2-3)、未结束(编号后带“>”,如缺第 5 波的 1-2-3-4-5>)、已完成(如完整的 1-2-3-4-5)。每个状态对应“需要的点数”,程序据此决定要不要继续向下钻取子浪。
五、核心数据结构(7 个)
- TWaveDescription:描述某类浪的名称、子浪数、可能的子浪形态
- TWave:存具体波浪的参数(公式、层级、6 个顶点值/索引)
- TZigzag:存 Zigzag 找到的顶点值与点索引
- TNode:波浪树节点,挂子节点与 TWave
- TPoints:存 FindPoints 找到的候选点
- TNodeInfo:存已分析区段的起止与对应树节点
- TLabel:存上图前的波浪文字标记
struct TWaveDescription { string NameWave; int NumWave;
string Subwaves[6]; }; // 该类浪可能的子浪
class TWave { public: string Name; string Formula;
int Level; double ValueVertex[6]; int IndexVertex[6]; };
六、关键函数:Zigzag / FillZigzagArray / FindPoints
FillZigzagArray 用不同 H 参数把 Zigzag 算到顶点数<2 为止,把各套顶点存进全局 ZigzagArray;FindPoints 在指定区间、给定首尾点值,搜出至少 NumPoints 个候选点写入 TPoints;NotStartedAndNotFinishedWaves 则专门递归分析“未开始/未结束”那组浪,把结果挂进波浪树。
bool FindPoints(int NumPoints,int IndexStart,int IndexFinish, double ValueStart,double ValueFinish,TPoints &Points); // 在 [IndexStart,IndexFinish] 内搜至少 NumPoints 个点, // 找到返回 true,否则 false
七、把自动分析用到 EA 里
标记结果是一棵波浪树,EA 可以读取“当前处在第几浪、是否完成”来过滤信号:比如只在“推动波第 3 或第 5 子浪未完成且向上”时做多。注意自动数浪仍有歧义(尤其未闭合浪),实战应把它当“辅助过滤器”而非唯一依据,配合动量/成交量确认。
八、小结
MQL5 自动数浪不是玄学,而是“Zigzag 取点 → 枚举标记 → 规则校验 → 树存层级”的一套工程。本文给出的 7 个数据结构与 4 个核心函数,足以搭出一个可递归、可扩展的波浪分析引擎。把它接进 EA,你能用“当前浪位”这道滤网挡掉一大批逆势假信号——但记住,自动浪位有歧义,永远当辅助,不当圣旨。