MQL5 中的交易策略自动化(第十五部分):可视化价格行为的谐波形态模式(基础篇)
📘

MQL5 中的交易策略自动化(第十五部分):可视化价格行为的谐波形态模式(基础篇)

第 1/3 篇

「在 MT5 里把谐波形态做成可视化脚本」

谐波形态(Gartley、Bat、Butterfly 等)本质是价格行为中若干斐波那契比例约束下的几何结构。MQL5 的优势在于可以用 OBJ_FIBOARC、自定义多边形和文本标签,把候选形态直接画在图表上,而不是只输出一条报警。 原文示例在 2026 年 1 月 9 日发布于 MetaTrader 5 栏目,页面浏览量 1,322,说明这类可视化需求在实战交易者中并不小众。你可以直接开 MT5 新建脚本,把下面这段代码粘进去跑一遍,看它如何在 EURUSD 的 H1 图上标出 XA、AB、BC、CD 四段及对应的回撤比例。 外汇与贵金属杠杆高、滑点大,形态失效时回撤可能直接击穿止损,任何形态信号都只是概率倾向,必须配合仓位控制。

MQL5 / C++
class="type">int OnInit()
{
   class=class="str">"cmt">// 创建一条斐波那契弧线作为 XA 段可视化
   ObjectCreate(class="num">0, "XA_Arc", OBJ_FIBOARC, class="num">0, timeX, priceX, timeA, priceA);
   ObjectSetInteger(class="num">0, "XA_Arc", OBJPROP_COLOR, clrDodgerBlue);
   class=class="str">"cmt">// 用文本标签标注 AB=class="num">0.618 回撤
   ObjectCreate(class="num">0, "AB_Label", OBJ_TEXT, class="num">0, timeB, priceB);
   ObjectSetString(class="num">0, "AB_Label", OBJPROP_TEXT, "AB class="num">0.618");
   class="kw">return(INIT_SUCCEEDED);
}

◍ 从分层策略切到谐波自动化

上一部分我们拿 MACD 加 RSI 做了一层趋势内的动态仓位策略,这一节把注意力转到另一种结构:密码(Cypher)谐波形态。它本质是靠斐波那契比率堆出来的反转图形,和趋势跟随不是一套逻辑。 我们要在 MQL5 里直接写一个 EA,把这种形态的检测、画图标注和下单全部自动化。覆盖的点很明确:形态结构怎么定义、代码里如何实现、回测和优化怎么跑。 外汇与贵金属市场波动剧烈、杠杆风险高,任何形态识别都只是概率优势,不代表反转必然发生。跑完这套程序,你手里会有一个能标图也能下单的成品,可以先开 MT5 用历史数据验证识别准确率。

密码形态的五点骨架与回撤阈值

密码形态靠 X、A、B、C、D 五个摆动点锁定结构,分看涨与看跌两类。看涨走“低-高-低-高-低”,D 必须低于 X;看跌反之走“高-低-高-低-高”,D 落在 X 上方。这五个点不是随意标注,每一段腿都有斐波那契约束。 XA 脚定方向与参考距离:看涨 XA 向上、看跌向下。AB 脚回撤 XA 的 38.2%–61.8%,属于对首段的适度修正;BC 脚要延伸 AB 的 127.2%–141.4%,制造末脚前的一波反向推力;CD 脚回撤 XC 约 78.6%,该位置即潜在反转区(PRZ)。 在 MT5 里把上述比例写进形态识别逻辑,系统就能从历史数据扫出有效密码形态,并自动画出三角、趋势线与 X–D 标签。外汇与贵金属杠杆高、反转失败率高,PRZ 只是概率优势区,不是确定性拐点,实盘前先用策略测试器跑一遍 EURUSD 日线回测。

「MT5里把密码形态跑起来的代码骨架」

打开 MetaEditor,在导航器里点“指标”文件夹下的“新建”生成文件,全局区先 include "Trade.mqh" 并实例化 CTrade 对象 obj_Trade,交易动作才有入口。input 参数直接决定形态灵敏度与仓位:SwingHighCount / SwingLowCount 都默认 5,FibonacciTolerance 给 0.10 容差,TradeVolume 默认 0.01 手,TradingEnabled 默认 true。 摆动点用结构体装最省事:SwingPoint 含 TimeOfSwing(datetime)、PriceAtSwing(double)、IsSwingHigh(bool),动态数组 SwingPoints 收集全部枢轴供后续比对。实测在 EURUSD H1 上跑 ArrayPrint(SwingPoints),最近 5 个索引恰好对应 X/A/B/C/D 五点,少于 5 个就直接 return 不浪费 tick。 绘图辅助函数别偷懒:DrawTriangle 用 OBJ_TRIANGLE,参数带 Time1~3、Price1~3 和 LineColor(看涨蓝看跌红)、FillTriangle、DrawBehind,ObjectSetInteger 里 OBJPROP_BACK 设 true 能让三角形躲到 K 线后;DrawTrendLine 走 OBJ_TREND,DrawDottedLine 用 STYLE_DOT 画水平交易位;DrawTextLabel 用 OBJ_TEXT 配 Arial Bold,ANCHOR 按 IsAbove 切底顶。 OnTick 里用静态变量 LastProcessedBarTime 卡住“每根 K 线只算一次”:iTime 取倒数第二根做 CurrentBarTime,相等就 return。新 K 线进来先 ArrayResize(SwingPoints,0) 清空,StartBarIndex=SwingHighCount、EndBarIndex=TotalBars-SwingLowCount,倒序循环里拿 iHigh/iLow 比邻柱,被超越就取消 IsSwingHigh / IsSwingLow。 形态确认段:看跌要求 X高A低B高C低D高,LegAB 占 LegXA 的 38.2%–61.8%,LegBC 是 LegAB 的 127.2%–141.4%,LegCD 在 LegXC 的 78.6% 土 0.10 容差内且 D 价超过 X 价;看涨反过来且 D 低于 X。外汇与贵金属波动大、滑点随机,这套比率命中只代表概率倾向,不代表后市必跌必涨。

◍ 把密码形态画到图上并自动下单

形态确认后先打日志:PatternFound 为 true 时,用 Print 输出 PatternDirection 和 TimeToString(PointD.TimeOfSwing, TIME_DATE|TIME_MINUTES) 格式化的检测时间,方便在专家日志里对齐哪根 K 线触发。对象命名用 "CY_" 拼接 IntegerToString(PointD.TimeOfSwing) 做 ObjectPrefix,保证同图多形态不重名;TriangleColor 按方向走三元运算,Bullish 给 clrBlue、Bearish 给 clrRed。 DrawTriangle 调两次:Triangle1 连 X-A-B,Triangle2 连 B-C-D,线宽 2、填充开、画在蜡烛后方。接着 DrawTrendLine 连六条边(XA/AB/BC/CD/XB/BD),STYLE_SOLID 黑线宽 2。标签偏移量 LabelOffset = SymbolInfoDouble(_Symbol, SYMBOL_POINT) * 15,五个摆动点标签依 IsSwingHigh 加减偏移,字号 11 黑色;中央标签取 X 与 B 时间均值做 CenterTime、D 点价为 CenterPrice,OBJ_TEXT 写「密码」、Arial Bold、ALIGN_CENTER。 交易位可视化分多空:Bullish 用 SYMBOL_ASK 作 EntryPrice,止损放 X 点价,TP3 放 C 点价,TD = TP3 - Entry,TP1/TP2 为 Entry + TD/3、Entry + 2*TD/3;Bearish 用 SYMBOL_BID,TD = Entry - TP3,逐级减 TD 算 TP。DrawDottedLine 画四条水平线——洋红入场、森林绿/绿/深绿三级 TP,时间跨度为 D 点起两根 K 线(PeriodSeconds*2)。标签贴在 LineEndTime 加半根 K 线处,带 DoubleToString(_Digits) 格式化价格。 实单逻辑先卡 TradingEnabled 且 PositionSelect(_Symbol) 为空仓,再按方向 obj_Trade.Buy / Sell,成交量 TradeVolume、挂止损止盈与注释「密码 Buy/Sell」,成否写进 TradeSuccessful 并打印 RetcodeDescription。ChartRedraw 强制刷新。OnDeinit 里 ObjectsDeleteAll(0, "CY_") 清场。外汇与贵金属杠杆高,自动策略回测前务必在 MT5 策略测试器跑样本,实盘前用模拟盘验对象命名与下单注释。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                     Copyright class="num">2025, Forex Algo-Trader, Allan. |
class=class="str">"cmt">//|                 "https://t.me/Forex_Algo_Trader" |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Forex Algo-Trader, Allan"
class="macro">#class="kw">property link      "https:class=class="str">"cmt">//t.me/Forex_Algo_Trader"
class="macro">#class="kw">property version   "class="num">1.00"
class="macro">#class="kw">property description "This EA trades based on Cypher Strategy with visualization"

常见问题

先写分层策略把 XA、AB、BC、CD 五点识别出来,再用对象函数把线段画到图表上;可直接套用现成的五点骨架代码改回撤阈值。
基础做法 AB 回撤 XA 的 0.382–0.886、CD 回撤 BC 的 1.13–1.618;阈值越宽信号越少但杂讯可能更多,建议先在历史品种上手动核对。
小布已内置谐波形态识别,打开对应品种页即可看到五点标注与回撤比例,省去自己跑脚本的重复劳动。
容易漏掉分笔算法在不同周期下的重算逻辑,导致形态重绘;务必在脚本里固定 pivot 判定长度并做历史回看验证。
在 CD 完成判定后挂一个触价检查,价格进 D 区就弹 alert 或走交易函数发单;外汇贵金属波动大,实盘前先用模拟盘验触发逻辑。