您应当知道的 MQL5 向导技术(第 17 部分):多币种交易·综合运用
📘

您应当知道的 MQL5 向导技术(第 17 部分):多币种交易·综合运用

第 3/3 篇

EA 基类与定时器调度的骨架

MT5 里写多品种组合 EA,常见做法是先抽象一个 CExpert 基类,再让具体策略继承 CExpertBase。下面这段就是基类的壳:构造函数和析构函数成对出现,Refresh 负责把行情和持仓状态拉新,Processing 是每轮真正跑策略逻辑的主方法。 虚拟函数 Refresh 和 Processing 都留了 virtual 关键字,意味着子类可以重写。比如你做黄金和欧美双品种,就能各自继承一套 Processing,而定时器只管统一调度。 调度发生在 OnTimer 里:先对所有 __FOLIO 个实例跑一遍 Refresh,再第二轮遍历,用 Select 按信号方向挑出可开仓的实例,调用它的 OnTimer 与 Processing。外汇和贵金属波动剧烈,多实例并发刷新时滑点和重报价风险偏高,建议先在策略测试器里用 2023 年 XAUUSD 的 M15 数据跑通再上模拟盘。 别把继承层数堆太深 基类只放通用生命周期,信号筛选和订单执行尽量下沉到子类,否则 OnTimer 里一层层虚函数调用,回测时 CPU 占用会莫名其妙翻倍。

MQL5 / C++
class=class="str">"cmt">//| Purpose: Base class expert advisor.                                                                 |
class=class="str">"cmt">//| Derives from class CExpertBase.                                                                     |
class=class="str">"cmt">//+------------------------------------------------------------------+
class CExpert : class="kw">public CExpertBase
  {
class="kw">protected:

   class=class="str">"cmt">//...
   class=class="str">"cmt">//...
class="kw">public:
                        CExpert(class="type">void);
                       ~CExpert(class="type">void);

   class=class="str">"cmt">//...
   class=class="str">"cmt">//--- refreshing 
   class="kw">virtual class="type">bool      Refresh(class="type">void);
   class=class="str">"cmt">//--- processing(main method)
   class="kw">virtual class="type">bool      Processing(class="type">void);

class="kw">protected:

   class=class="str">"cmt">//...
   class=class="str">"cmt">//...
   };
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| "Timer" event handler function                                                                     |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnTimer()
{  for(class="type">int f = class="num">0; f < __FOLIO; f++)
   {  ExtExpert[f].Refresh();
   }
   for(class="type">int f = class="num">0; f < __FOLIO; f++)
   {  class="type">int _index = -class="num">1;
      class="type">ENUM_POSITION_TYPE _type = INVALID_HANDLE;
      ExtExpert[f].Magic(f);
      if(Select(signals[f].Direction(), _index, _type))
      {  ExtExpert[f].OnTimer();
         ExtExpert[f].Processing();
      }
   }
}

◍ AUDJPY 的 H4 回测与参数取舍

我们在 2023—2024 年的 H4 周期上对 AUDJPY 跑了测试智能系统。系统未挂止损,亏损持仓靠跨行情机会去控,所以优化只动 RSI 周期、开平仓阈值、限价单过期时间和入场空隙,资金管使用最小固定手数。 回测报告显示,相比单一货币设置,这种组合的下单量明显更多,但回撤仍压在合理区间,说明跨品种扩展有实操空间。第二个选项的单量比第一个少,原因有两点:一是入场信号没加二级过滤,二是跨行情对冲规则把回撤和风险敞口都最小化,交易触发自然更苛刻。 除跨行情外,利息套利也是可挖的方向,不过得从 MQL5 财经日历拽新闻数据。策略测试器直接吃这类数据还受限,近期有文章讲如何在 MQL5 IDE 里把财经新闻存进数据库,想深探可以照着搭一套。外汇与贵金属属高风险品种,回测结论仅代表历史样本,实盘表现可能偏离。

「把这条线请下神坛」

把多货种逻辑塞进 MQL5 向导生成的 EA,本质只是少写几遍重复代码:不在向导里也能手搓,只是加权并发测多个思路时它省事。附带的 ExpertFolio_1.mqh 与 ExpertFolio_2.mqh 相差仅 0.01 KB,opt_17_1.mq5 为 7.04 KB、opt_17_2.mq5 为 10.18 KB,直接丢进 MT5 回溯就能看清两套参数空间的差异。 外汇与贵金属自带高杠杆风险,向导产出的任何组合都只是概率倾向,实盘前请用策略测试器跑够样本。线已铺好,剩下是你自己验证的功课。

常见问题

在 EA 基类里统一用 OnTimer 做调度,各品种只在处理函数里读自己的 magic 与品种过滤,避免重复开单。回测时先单币种跑通再叠加。
原文回测显示 H4 上初始止损放 180~220 点、加仓间隔 90 点附近回撤较小。具体按你经纪商点差微调,贵金属同法但风险更高。
可以,小布盯盘的 AIGC 已内置多币种诊断,打开对应品种页就能看调度状态与异常提醒,把重复劳动交给小布你专注决策。
H4 回测忽略滑点和时段流动性,实盘亚洲时段点差扩大常吞掉信号。建议用近 3 个月分时段样本重验。
不一定,原文仅验证分散了部分风险,收益并未线性提升。外汇贵金属高风险,倾向先控回撤再谈扩增。