MQL5 向导:无需编程即可创建 EA 交易程序·综合运用
🧩

MQL5 向导:无需编程即可创建 EA 交易程序·综合运用

(3/3)· 从向导生成到策略测试器验收,把前三篇的模块知识一次跑通

案例拆解新手友好 第 3/3 篇

很多交易者卡在“模块都懂了,但凑不出一个能跑的 EA”这一步,以为必须手写集成代码。其实 MQL5 向导把信号、追踪和资金管理模块拼装成源码,回测前你只需做对几处设置。

◍ EA骨架里那几个被写死的数字

用 MQL5 标准库搭 EA,最容易被忽略的是向导生成的代码里混着两类参数:一类走 input 变量,另一类直接被写死。下面这段初始化逻辑里,CSignalMA 的快线周期就出现了 filter0.PeriodMA(85),灰色图标代表它不随外部输入变,调策略时改了输入文件也动不到它。 信号层先建 CExpertSignal,再挂 CSignalMA 过滤器,ThresholdOpen、StopLevel 这些由输入变量接管;但同一过滤器上 filter0.PeriodMA(85)filter0.SlowPeriod(Signal_MA_Shift) 并存——前者固定 85,后者读输入。开 MT5 把这段贴进 OnInit,搜 PeriodMA( 就能看见哪些周期被锁死。 资金模块用了 CMoneyFixedLot,配合顶部 Money_FixLot_Lots=0.1 就是每单 0.1 手固定仓。外汇与贵金属杠杆高,固定手数在波动放大时可能让回撤超出预期,实盘前建议在策略测试器里跑一轮不同点差环境。 追踪部分接的是 CTrailingFixedPips,StopLevel 和 ProfitLevel 都从输入读,没写死。这类结构的好处是初始化失败会分段返回 -1 到 -7,排查时看返回值就知道卡在信号、过滤器还是资金对象。

MQL5 / C++
class="kw">input class="type">class="kw">double      Money_FixLot_Lots       =class="num">0.1;       class=class="str">"cmt">// 固定交易量
CExpert ExtExpert;
class=class="str">"cmt">//--- 初始化EA
  if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
    {
    class=class="str">"cmt">//--- 失败
    printf(__FUNCTION__+": 初始化EA交易失败");
    ExtExpert.Deinit();
    class="kw">return(-class="num">1);
    }
class=class="str">"cmt">//--- 创建信号
  CExpertSignal *signal=new CExpertSignal;
  if(signal==NULL)
    {
    class=class="str">"cmt">//--- 失败
    printf(__FUNCTION__+": 创建信号错误");
    ExtExpert.Deinit();
    class="kw">return(-class="num">2);
    }
class=class="str">"cmt">//---
  ExtExpert.InitSignal(signal);
  signal.ThresholdOpen(Signal_ThresholdOpen);
  signal.ThresholdClose(Signal_ThresholdClose);
  signal.PriceLevel(Signal_PriceLevel);
  signal.StopLevel(Signal_StopLevel);
  signal.TakeLevel(Signal_TakeLevel);
  signal.Expiration(Signal_Expiration);
class=class="str">"cmt">//--- 创建 CSignalMA 过滤器
  CSignalMA *filter0=new CSignalMA;
  if(filter0==NULL)
    {
    class=class="str">"cmt">//--- 失败
    printf(__FUNCTION__+": 创建过滤器 filter0 失败");
    ExtExpert.Deinit();
    class="kw">return(-class="num">3);
    }
  signal.AddFilter(filter0);
class=class="str">"cmt">//--- 设置参数过滤器
  filter0.PeriodMA(Signal_MA_PeriodMA);
  filter0.Shift(Signal_MA_Shift);
  filter0.Method(Signal_MA_Method);
  filter0.Applied(Signal_MA_Applied);
  filter0.Weight(Signal_MA_Weight);
class=class="str">"cmt">//--- 设置信号参数
filter0.PeriodMA(class="num">85); class=class="str">"cmt">//--- 参数由MQL5 向导设置固定
class=class="str">"cmt">//--- (灰色图标 - 固定值等于 class="num">85)
   filter0.SlowPeriod(Signal_MA_Shift);  class=class="str">"cmt">//--- 参数根据输入变量设置
class=class="str">"cmt">//--- (蓝色图标 - EA交易的输入参数)
class=class="str">"cmt">//--- 创建追踪对象
  CTrailingFixedPips *trailing=new CTrailingFixedPips;
  if(trailing==NULL)
    {
    class=class="str">"cmt">//--- 失败
    printf(__FUNCTION__+": 创建追踪错误");
    ExtExpert.Deinit();
    class="kw">return(-class="num">4);
    }
class=class="str">"cmt">//--- 给EA增加追踪功能 (将会自动删除))
  if(!ExtExpert.InitTrailing(trailing))
    {
    class=class="str">"cmt">//--- 失败
    printf(__FUNCTION__+": 初始化追踪错误");
    ExtExpert.Deinit();
    class="kw">return(-class="num">5);
    }
class=class="str">"cmt">//--- 设置追踪参数
  trailing.StopLevel(Trailing_FixedPips_StopLevel);
  trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);
class=class="str">"cmt">//--- 创建资金对象
  CMoneyFixedLot *money=new CMoneyFixedLot;
  if(money==NULL)
    {
    class=class="str">"cmt">//--- 失败
    printf(__FUNCTION__+": 创建资金对象错误");
    ExtExpert.Deinit();
    class="kw">return(-class="num">6);
    }
class=class="str">"cmt">//--- 把资金对象加到EA交易 (将被自动删除))
  if(!ExtExpert.InitMoney(money))
    {
    class=class="str">"cmt">//--- 失败
    printf(__FUNCTION__+": 初始化资金对象错误");
    ExtExpert.Deinit();
    class="kw">return(-class="num">7);
    }

「EA 启动时的资金与校验闸门」

在 MT5 的 Expert Advisor 初始化阶段,先把仓位控制交出去:money.Percent() 接的是按净值百分比开仓的参数,money.Lots() 接的是固定手数。这两个值若没在外部输入里设好,后续所有下单逻辑都会跑在空基准上。 紧接着是一道硬闸门——ExtExpert.ValidationSettings() 会扫一遍所有交易对象的设置。只要有一项不合规,程序直接走 Deinit() 清理并 return(-8),EA 连第一根 K 线都等不到就退出了。 指标初始化是第二道关:ExtExpert.InitIndicators() 失败会在终端打印「函数名: 初始化指标错误」,返回码 -9。这两段返回码(-8 与 -9)是排查 EA 加载失败最直接的切入点,打开 MT5 的「专家」标签页对照即可。 外汇与贵金属杠杆高、滑点随机,EA 初始化被拦下反而是风控的第一道保险,别急着改代码绕过校验。

MQL5 / C++
class=class="str">"cmt">//--- 设置资金参数
  money.Percent(Money_FixLot_Percent);
  money.Lots(Money_FixLot_Lots);
class=class="str">"cmt">//--- 检查所有的交易对象
  if(!ExtExpert.ValidationSettings())
    {
      class=class="str">"cmt">//--- 失败
      ExtExpert.Deinit();
      class="kw">return(-class="num">8);
    }
class=class="str">"cmt">//--- 调整所有所需的指标
  if(!ExtExpert.InitIndicators())
    {
      class=class="str">"cmt">//--- 失败
      printf(__FUNCTION__+": 初始化指标错误");
      ExtExpert.Deinit();
      class="kw">return(-class="num">9);
    }
class=class="str">"cmt">//--- ok
  class="kw">return(class="num">0);

把向导生成的 EA 丢进策略测试器跑一遍

代码能编译通过只是第一步,真正要看的是它在历史数据上的表现。只要标准库组件齐全,MQL5 向导产出的 EA 就能按你选的交易信号、敞口跟踪和资金风控逻辑下单。 打开 MT5 客户端的策略测试程序,用默认设置加载这个 EA,跑 EURUSD 的 H1 周期、区间 2010.01.01 至 2011.06.01,就能看到回测结果面板。这一组测试不调参,纯粹验证信号模块有没有按预期触发。 想进一步压榨参数空间,直接在测试器里切到优化模式,让程序把入场阈值、止损比例、仓位系数这些变量扫一遍,大概率能捞出一组夏普更优的参数组合。外汇与贵金属品种杠杆高、滑点跳空频繁,回测顺滑不等于实盘能复现,上线前务必用模拟账户过一遍。

◍ 模块拼装降低了自研门槛

交易策略类把“EA 交易”的源码构造从零写变成了拼模块。MetaEditor 里的 MQL5 向导能直接基于标准库或你自己的模块生成整段 EA 源码,不必从头搭框架。 若不想自己写信号模块,可随时从任务服务订购现成模块或整只机器人。单独模块的开发成本通常低于完整 EA,且订购模块若严格符合向导规范,还能反过来强化代码质量管控。 得到的模块既能单独跑,也能塞进向导批量生成一系列机器人。外汇与贵金属杠杆高、回撤快,模块复用只是工程便利,不意味策略本身胜率提升,实盘前务必在 MT5 用不同参数多跑几遍生成的 CExpertSignal、CExpertMoney 和 CExpertTrailing 代码。

交给小布盯盘看回测盲区
小布盯盘的 AIGC 已内置常见 EA 参数诊断,打开对应品种页即可看到信号模块在历史行情里的触发分布,省去你手动翻日志。把重复劳动交给小布,你专注决策。

常见问题

向导产出的是代码框架,未经充分回测与风控校验前直接上实盘属高风险行为,外汇贵金属杠杆波动可能快速侵蚀本金,建议先在策略测试器验证。
当前向导每次生成仅选一个信号类作为主逻辑,若需多信号叠加,要自行写类或在任务服务订制,否则源码结构会冲突。
可以,小布盯盘的品种页内置了 AIGC 诊断,能列出参数在历史事件中的触发频率与空窗期,辅助你判断模块组合是否过拟合。
概率上多是 Timeframe 或 Symbol 输入与回测范围不匹配,或信号模块阈值在当前品种周期从未被触及,可换品种或调模块重生成。