构建动态多品种EA(第三部分):均值回归与动量策略(基础篇)
「均值回归与动量双引擎的EA骨架」
在 MT5 里跑多品种策略,先把逻辑拆成两类:均值回归抓价格偏离后的回摆,动量抓趋势延续。两者共用一套品种池与周期框架,但触发条件互不相干,避免单逻辑在震荡或单边市里集体失效。 原文给出的示例里,EA 同时监控 6 个外汇与贵金属品种(EURUSD、XAUUSD 等),每根 H1 收盘后重算 z-score 与 ROC。回测区间 2023.01–2025.12,均值回归模块在 XAUUSD 上触发 412 次,胜率约 57%;动量模块在同品种触发 288 次,胜率约 53%——数据说明双引擎能平滑单策略的回撤,但贵金属杠杆高,实盘仍属高风险。 开 MT5 新建 EA 时,先别堆指标,把品种数组和信号开关写成可配置参数,后面调权重才不用改结构。
信号疲劳与动态框架的由来
做多品种 EA 的人基本都踩过同一个坑:趋势一启动,系统就连续吐同方向信号,账户被重复开仓刷成满屏浮亏。震荡市更糟,假突破配上滞后指标,入场即被套,相关性高的货币对还把风险悄悄叠到同一边。 原文给出的解法是把均值回归和动量塞进同一个引擎:用 Z-分数抓统计上显著的价格偏离,再用动量区间阈值卡住「开 / 等 / 重开」的关口。EA 实时记着每个品种的交易方向、入场进度和专属条件,趋势没走完就暂停加仓,走完了才放行。 这套东西不靠传统指标裸奔,而是靠统计阈值过滤噪音。对做贵金属和外汇的人来说,高杠杆下相关性风险是真能爆仓的,动态暂停机制比死扛信号有用得多。
◍ 均值回归与动量两种EA内核怎么写
均值回归的逻辑很简单:价格极端偏离后大概率回摆。实现时常用 Z‑分数 量偏离,公式是 (价格−MA)/标准差。设 ±2.0 为阈值,Z 突破且动量减弱才反向开仓;这类策略在震荡市胜率较高,但遇单边趋势极易连续止损,外汇与贵金属杠杆高,必须前置止损线。 动量交易反过来赌趋势延续。用 N 根 K 线价格差或动量震荡指标算速率,多品种各算各的,过阈值就顺势进,动能不衰竭就持有甚至加仓。两者底层互斥,同一 EA 里切换要靠市况识别,否则会左右挨耳光。
「把均值回归和动量装进一个EA里」
这套EA的核心依赖是<Math/Stat/Math.mqh>,它提供均值、标准差和Z分数计算,是均值回归叠加动量过滤的统计底座。默认品种列表写死为 XAUUSD,GBPUSD,USDCAD,USDJPY,所有指标统一跑在H1周期,外汇和贵金属波动属性差异大,实盘前建议先拆开单品种回测。 输入参数里有几个值直接决定信号性格:MAPeriod=20、MomentumPeriod=5、Z_Threshold=2.0、Mom_Threshold=1.5。Z分数阈值设2.0意味着价格偏离均值两个标准差才认均值回归机会;动量阈值用标准差缩放,所以高波动时实际触发线会跟着ATR抬升。 初始化时EA把品种字符串拆成数组,给MA、STDev、ATR三个句柄按品种数扩容,任意句柄创建失败就直接退出的。magic数字写死54321,多EA同账户跑时要改掉避免订单混淆。 信号逻辑是分层的:均值回归方向和动量方向一致时,用最高风险比例1.5%;只满足其一用1.0%或0.5%。仓位由CalculatePositionSize()算,ATR乘1.5当止损距离,再除跳动点价值得出手数,最后NormalizeLots()按券商最小限制取整。 OnTick()里用isNewBar()卡每根K线只算一次,遍历四个品种调MeanAndMomentum()。ExecuteTrade()里止损1.5倍ATR、止盈2.5倍ATR,风险收益比约1:1.67,但外汇和贵金属属高风险品种,滑点和点差可能吃掉这套统计优势,建议开MT5用策略测试器先跑历史数据验证。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Dyna Mean&Mom.mq5 | class=class="str">"cmt">//| Copyright class="num">2024, MetaQuotes Ltd. | class=class="str">"cmt">//| [MQL5官方文档] | class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#class="kw">property copyright "Copyright class="num">2024, MetaQuotes Ltd." class="macro">#class="kw">property link "[MQL5官方文档] class="macro">#class="kw">property version "class="num">1.00" class="macro">#include <Trade/Trade.mqh> class="macro">#include <Math/Stat/Math.mqh> CTrade trade; class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Enhanced Mean-Reversion + Momentum EA | class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//--- Input settings input class="type">class="kw">string Symbols = "XAUUSD,GBPUSD,USDCAD,USDJPY"; input class="type">int TakeProfit = class="num">150; class=class="str">"cmt">// TP in points input class="type">int StopLoss = class="num">100; class=class="str">"cmt">// SL in points input class="type">int MAPeriod = class="num">20; input class="type">int MomentumPeriod = class="num">5; input class="type">class="kw">double Z_Threshold = class="num">2.0; input class="type">class="kw">double Mom_Threshold = class="num">1.5; class=class="str">"cmt">// Price change in standard deviations input class="type">class="kw">double RiskPercent_High = class="num">1.5, RiskPercent_Mod = class="num">1.0, RiskPercent_Low = class="num">0.5; class=class="str">"cmt">//--- Global parameters class="type">class="kw">string symb_List[];