首页 / 交易学院 / 小布知识库 / MQL5 中艾略特波浪的自动分析:从 ZigZag 到波浪标记
MQL5 中艾略特波浪的自动分析:从 ZigZag 到波浪标记
🌊

MQL5 中艾略特波浪的自动分析:从 ZigZag 到波浪标记

技术分析基础 难度 · 高阶 2013 14 分钟阅读
艾略特波浪ZigZag自动分析MQL5形态识别

艾略特波浪理论认为价格受群体心理驱动,呈“推动波(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 个)

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 子浪未完成且向上”时做多。注意自动数浪仍有歧义(尤其未闭合浪),实战应把它当“辅助过滤器”而非唯一依据,配合动量/成交量确认。

落地建议:把波浪状态写入指标缓冲或全局变量,EA 在 OnTick 里读取;对“未结束”浪保持观望,对“已完成推动波”才放行同向信号。

八、小结

MQL5 自动数浪不是玄学,而是“Zigzag 取点 → 枚举标记 → 规则校验 → 树存层级”的一套工程。本文给出的 7 个数据结构与 4 个核心函数,足以搭出一个可递归、可扩展的波浪分析引擎。把它接进 EA,你能用“当前浪位”这道滤网挡掉一大批逆势假信号——但记住,自动浪位有歧义,永远当辅助,不当圣旨。

常见问题

核心是“Zigzag 取拐点 → 枚举所有合法点组合标记 → 按波浪规则逐一校验 → 用树结构递归存子浪”。结合自上而下(分形)与穷举两种思路:先找大浪,再向下钻子浪,直到波浪闭合。
不准到可单独跟单的程度。未闭合浪(未开始/未结束)天然有歧义,自动标记也会给出多种候选。正确用法是把它当“浪位过滤器”辅助 EA:只在已完成推动波且同向时放行信号,并配合动量/成交量确认。
共 7 个:TWaveDescription(浪类描述)、TWave(具体浪参数)、TZigzag(Zigzag 顶点)、TNode(波浪树节点)、TPoints(候选点)、TNodeInfo(已分析区段)、TLabel(上图标记)。树+递归是承载分形嵌套的关键。
大浪由小浪构成、小浪又由更小浪构成,这正是递归分析的天然结构。程序先在大区间找父浪,再对父浪的子区间递归分析子浪,直到波浪“已完成”才作为可信节点闭合。分形嵌套决定了用树而非平铺来存储结果。