MQL5 向导:无需编程即可创建 EA 交易程序·综合运用
(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,排查时看返回值就知道卡在信号、过滤器还是资金对象。
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 初始化被拦下反而是风控的第一道保险,别急着改代码绕过校验。
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 代码。