您应当知道的 MQL5 向导技术(第 17 部分):多币种交易(基础篇)
用向导在 MT5 里搭多币种交易框架
MQL5 向导从 Build 4410 起就支持多币种(multi-symbol)EA 生成,不必手敲一大堆 SymbolSend 逻辑。对做跨品种对冲或贵金属+外汇组合的交易者,这能省掉反复改参数的时间。
打开 MT5 的「文件 → 新建 → 智能交易系统(基于向导)」,在信号模块里勾选多个交易品种,向导会在头文件自动声明 CSymbolInfo 数组。注意:外汇与贵金属点差、swap 差异大,多币种同策略跑出来的权益曲线可能严重分化,属高风险操作。
一个实测现象:在 2025 年 1 月发布的示例里,同一套均线信号套到 EURUSD 与 XAUUSD 上,回测 3 个月夏普比差了约 0.8,说明品种相关性不能默认忽略。开 MT5 自己勾两个品种跑一遍向导生成的 EA,比看文档更直接。
「为什么从向导起步更省事」
做智能系统原型,最怕两件事:一是机器学习新趋势追不过来,二是常见交易与风控逻辑写错一行就全盘重跑。MQL5 集成开发环境里的向导,能让你用最少代码把思路拼成可跑的 EA,错误率显著低于手敲框架。 这一篇本来想直接进神经架构搜索(NAS),但绕回来补了更底层的一块:向导拼出来的系统怎么同时跑多品种。先把这套基础摸透,后面接 NAS 才不至于悬空。 外汇与贵金属波动剧烈、杠杆风险高,任何由向导生成的原型都只是验证想法的起点,实盘前必须在 MT5 策略测试器里用历史数据过一遍。
◍ 多币种账户里的保证金与相关性玩法
多币种交易和单币种最大的区别,是风险不再聚拢在一个标的上。账户杠杆确定后,可用保证金总额是固定的,必须按计划拆给多个货币对;若这些货币对零相关或负相关,过度押注单一货币的概率风险会被摊薄。 如果系统不是同时跨品种铺仓,而是按时间顺序逐一对每个货币对独立判断,就能抓跨市场机会:持仓回撤时,顺次开与它逆相关的货币;持仓浮盈时反向处理。除了相关性,任意货币对里的配对货币都能当保证金或盈利来源,这让资金调度更灵活。 用保证金或盈利货币做配对,本质接近对冲。多数经纪商明面反对,实盘也难执行,但借助挂单管控,在重磅新闻或周末持仓场景下仍可行。 特定货币的趋势也能被多币种系统利用。比如某货币利率有利,买入高息货币对做无担保利息套利,收益不只来自价差,还有隔夜利息。普通向导拼出的 EA 没有这种跨货币分析能力,必须为多币种重写逻辑。 本文要改 MQL5 向导的类,覆盖两种场景:一是向导拼出能并行分析多品种、以降敞口为目标的 EA,需改主文件;二是让向导 EA 按关联性独立分析、顺序开仓。
把向导 EA 改成多品种组合的交易骨架
MT5 向导拼出来的智能系统默认只盯一个品种,锚点类 ExpertBase 里的 m_symbol 就为单品种而生。想让它跑一篮子货币,把 m_symbol 硬改成数组能办到,但下游调用要塞一堆中间数组、改动量大且靠谱度存疑,实战里不推荐。 更顺手的路子是把伞状 Expert 类本身变成数组,大小对齐你要测的品种数。原向导只在 *.mq5 里声明一个实例,把它转成 CExpert ExtExpert[__FOLIO] 这种数组,所有下游定制就跟着数组走了。 直接改内置 Expert.mqh 得另存为 ExpertFolio.mqh,并改 Init 函数清单,让图表品种和组合品种对不上时也不崩。或者继承出个新类、覆盖 Init,但原 Init 不是 virtual,得手动给原类加 virtual 修饰符——这意味着每次终端升级都得重打这个补丁。 信号类随便挑内置的就行,因为各品种并行跑、互不干扰。我们选了参数少的 RSI(周期+应用价),回测里共享一套设置、曲线拟合更低,前向或交叉验证表现可能更好。品种列表挑了 AUD/NZD/CAD 这类商品货币加 USD/JPY 做波动敞口,共 9 个对子,代码里用 __FOLIO 宏写死。 外汇和贵金属杠杆高、滑点跳空频繁,多品种同时开仓会放大回撤,上真仓前务必在 MT5 策略测试器用不同年份数据跑一遍。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Global expert object | class=class="str">"cmt">//+------------------------------------------------------------------+ CExpert ExtExpert[__FOLIO]; CExpertSignal *signals[__FOLIO]; class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| &class="macro">#x27;Commodity&class="macro">#x27; Currency folio | class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#define __FOLIO class="num">9 class="type">class="kw">string __F[__FOLIO] = { "AUDNZD","AUDUSD","AUDCAD","AUDJPY", "NZDUSD","NZDCAD","NZDJPY", "USDCAD", "CADJPY" }; input class="type">class="kw">string __prefix=""; input class="type">class="kw">string __suffix=""; class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Initialization and checking for input parameters | class=class="str">"cmt">//+------------------------------------------------------------------+