随机优化和最优控制示例·综合运用
(3/3)·从蒙特卡洛到模型预测控制,一篇看清外汇 EA 如何把随机建模落地成下单逻辑
◍ 手手动算仓位也要先卡死经纪商边界
写 EA 时最容易被忽略的一步,是把你算出来的 lotSize 先夹在经纪商允许的最小最大手数之间。MT5 里这两个值不是常量,而是随品种和账户类型浮动的,直接发单可能报 4756 错误(无效交易量)。 下面这段逻辑就是典型的边界收敛:先取当前品种的最小手数 SYMBOL_VOLUME_MIN 和最大手数 SYMBOL_VOLUME_MAX,再用 MathMin 和 MathMax 把自定义手数 lotSize1 夹进去,最后返回安全值。 [CODE] // Ensure the lotSize is within the allowed limits double minLot = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN ); double maxLot = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MAX ); double lotSize2 = MathMax (minLot, MathMin (maxLot, lotSize1)); return lotSize2; } [/CODE] 逐行拆解:第 1 行是注释,提醒手数需在允许范围内;第 2 行用 SymbolInfoDouble 抓当前品种最小成交量,比如欧美可能返回 0.01;第 3 行抓最大成交量,部分黄金账户能到 50 甚至更高;第 4 行先 MathMin 把 lotSize1 压到不超过 maxLot,再 MathMax 抬到不低于 minLot;第 5 行把夹好的 lotSize2 交出去。 开 MT5 随便挂个 EURUSD 的脚本打印这两个值,你会发现 minLot 通常 0.01、maxLot 随杠杆变动。外汇和贵金属波动剧烈、高杠杆高风险,夹手数只是防报错的第一道闸,不预示任何收益。
class=class="str">"cmt">// Ensure the lotSize is within the allowed limits class="type">class="kw">double minLot = SymbolInfoDouble( _Symbol , SYMBOL_VOLUME_MIN ); class="type">class="kw">double maxLot = SymbolInfoDouble( _Symbol , SYMBOL_VOLUME_MAX ); class="type">class="kw">double lotSize2 = MathMax(minLot, MathMin(maxLot, lotSize1)); class="kw">return lotSize2; }
EA 内部决策链条怎么跑
这套 EA 把下单逻辑拆成了一串可单独验证的函数,核心入口是 OptimalControl(double currentPrice)。它用模型预测控制(MPC)在预测窗口内算预期回报,再和决策阈值比对,输出买、卖或持有三种状态。 CalculateExpectedReturn(...) 专门给 OptimalControl 喂预期回报数值;IsTrendFavorable / IsLongTermTrendFavorable 则拿均线和 RSI 判断趋势是否和决策同向,避免逆势硬开。 仓单管理由 ManageOpenOrder(int decision) 接管:按已开仓 K 线数量或决策冲突来平仓;UpdateSLTP(ulong ticket, int decision) 随市况移动已有单的止损止盈。ExecuteTrade(int decision) 负责按决策开新仓并挂 SL/TP。 风险端有两处动态手数函数——AdjustLotSizeForDrawdown() 按当前回撤缩量,CalculateDynamicLotSize() 结合余额算手数;EstimateDrift() 与 EstimateVolatility() 给最优控制提供漂移和波动输入。LogMessage(string message) 把关键事件写文件,方便你过后在 MT5 终端的 Files 目录里翻日志复盘。 外汇与贵金属杠杆高、滑点跳空频繁,这类基于 MPC 的 EA 在实盘前务必用策略测试器跑至少 3 个月 tick 数据,重点看 EstimateVolatility 在重大数据日的输出是否失真。
「不同周期下的回测表现」
我们在 MT5 策略测试器中分别跑了 1 天、1 小时、4 小时、6 小时四个时间周期,观察同一套 EA 的逻辑输出。 从结果分布看,EA 在日内级别周期(如 1 小时、4 小时)的表现明显优于 1 天这种大周期,说明它对日内波动的捕捉更敏感。 需要点明:外汇与贵金属属高风险品种,上述现象仅代表历史回测倾向,实盘可能偏离。 当前版本未设止损(SL),若你在输入参数里补一个 SL 或做过滤优化,回测曲线有可能进一步收敛回撤。
◍ 最后一句大实话
SMOC EA 只是把随机建模和控制优化塞进自动化框架里的简化版,它同时挂了移动平均线、RSI、ATR 加一套自定义最优控制算法,靠动态手数和回撤风控去换长期可持续性。 这套东西在 40.29 KB 的 mq5 文件里能直接跑,但作者自己都写明了——这只是一个高级 EA 的简单示例,别当成能躺赢的成品。 外汇和贵金属杠杆高、滑点跳空随时来,真要上实盘,先在自己 MT5 做充分回测和前向测试,看它在你常做的品种上概率上是否站得住,再谈信任。