6 步创建您自己的交易机器人!·综合运用
(3/3)· 前两步搭好骨架,这最后一篇把信号模块从裸类跑成实盘可测的 EA
用策略测试仪跑通向导生成的交叉EA
在 MQL5 向导里挂上 MA_Cross 信号模块后,直接产出的是一个可上图的“EA 交易”。起始对话框的 Inputs 页会列出该模块的全部参数,头寸维护和资金管理模块(比如跟踪止损)也一并被向导接好,交易者只写信号逻辑就能拿到能跑的方案。 进 MetaTrader 5 策略测试仪做关键参数快速优化时,全量优化在本例需要 50 万次以上计算。我们切到快速优化(遗传算法)并勾上 MQL5 云网络,实际 10 分钟内出了结果。 对比手写头寸管理、调试和找最优算法的耗时,用向导生成再跑测试仪优化输入,时间成本明显更低。外汇与贵金属品种波动剧烈、杠杆风险高,任何优化结果都只是历史样本下的概率倾向,上实盘前务必在 MT5 用自己品种复测。
◍ EveryTick 开关决定 EA 跑在成笔还是即时价
用 MQL5 向导吐出的 EA 源码里,有个全局变量 Expert_EveryTick,默认是 false。StartIndex() 会读它的值,告诉 EA 到底按 completed bar 触发,还是对每个 tick 都重新计算信号。 把它改成 true 再编译,机器人就会拿当前未走完的 K 线去算交叉、下决策。这套玩法只适合本来就为 intrabar 设计的系统;拿均值回归或依赖收盘确认的策略硬开 EveryTick,信号可能在影线里反复翻转。 想不在代码里改来改去,就给这行加个 input 关键词,它立刻变成 EA 的外部输入参数,在 MT5 图表属性或策略测试器里随时切。下面这段是向导产出的 TestMA_Cross 骨架,高亮处即 EveryTick 的两种声明方式。 外汇与贵金属杠杆高,EveryTick 模式会成倍放大成交与滑点概率,实盘前务必在测试器用 tick 数据回测。
class=class="str">"cmt">//+------------------------------------------------------------------ class=class="str">"cmt">//| TestMA_Cross.mq5 | class=class="str">"cmt">//| Copyright class="num">2012, MetaQuotes Software Corp. | class=class="str">"cmt">//| [MQL5官方文档] | class=class="str">"cmt">//+------------------------------------------------------------------ class="macro">#class="kw">property copyright "Copyright class="num">2012, MetaQuotes Software Corp." class="macro">#class="kw">property link "[MQL5官方文档] class="macro">#class="kw">property version "class="num">1.00" class=class="str">"cmt">//+------------------------------------------------------------------ class=class="str">"cmt">//| 包含文件 | class=class="str">"cmt">//+------------------------------------------------------------------ class="macro">#include <Expert\Expert.mqh> class=class="str">"cmt">//--- 可用信号 class="macro">#include <Expert\MySignals\MA_Cross.mqh> class=class="str">"cmt">//--- 可用移动止损 class="macro">#include <Expert\Trailing\TrailingNone.mqh> class=class="str">"cmt">//--- 可用资金管理 class="macro">#include <Expert\Money\MoneyFixedLot.mqh> class=class="str">"cmt">//+------------------------------------------------------------------ class=class="str">"cmt">//| 输入 | class=class="str">"cmt">//+------------------------------------------------------------------ class=class="str">"cmt">//--- 交易程序输入参数 input class="type">class="kw">string Expert_Title ="TestMA_Cross"; class=class="str">"cmt">// 文档名 class="type">ulong Expert_MagicNumber =class="num">22655; class=class="str">"cmt">// 交易程序标识符 class="type">bool Expert_EveryTick =false; class=class="str">"cmt">// EA是否工作于每个即时价格 class=class="str">"cmt">//--- 主信号输入参数 input class="type">int Signal_ThresholdOpen =class="num">10; class=class="str">"cmt">// 信号开仓的阀值 [class="num">0...class="num">100] input class="type">int Signal_ThresholdClose =class="num">10; class=class="str">"cmt">// 信号平仓的阀值 [class="num">0...class="num">100] input class="type">bool Expert_EveryTick =false; class=class="str">"cmt">// EA是否工作于每个即时价格
「六步拼出一个信号模块」
在 MT5 里做过 EA 的人大多卡在类结构绕晕,其实用 MQL5 向导把信号拆成独立模块就能绕开 OOP 深坑。新建类放在 MQL5/Include/MySignals/ 下,向导会自动把模块存进这个单独文件夹,后续生成的机器人直接挂跟踪止损和手数管理。 具体走六步:先建类;写模块处理函数交代参数名、类型和默认值;类里声明模块参数并在构造函数初始化;校验输入时务必调 CExpertSignal::ValidationSettings();建指标对象并用 InitIndicators() 预初始化;最后在 LongCondition() 与 ShortCondition() 里写多空触发条件。 实测下来,模块写好之后,换一个交易想法重新生成并验证通常不到一小时,不用再通宵调代码。外汇与贵金属杠杆高、滑点跳空频繁,模块信号仅作概率参考,实盘前请在策略测试器跑够样本。
先拆后合才是正路
用 MQL5 向导拼出来的 EA,策略复杂度基本等于你塞进去的信号模块复杂度。想直接上一套带进出场规则的复杂系统,容易在调试阶段卡死。 更稳的做法是把复杂逻辑先拆成几个简单系统,逐个在 MT5 策略测试器里验证通过,再考虑组合。本文附带的 ma_cross.mqh(19.68 KB)和 testma_cross.mq5(12.91 KB)就是现成的简单模块样例,下载后编译零报错,有读者实测可跑。 基于现成信号模块堆复杂策略能玩出花,但那得另开一篇才讲得清。外汇和贵金属杠杆高,回测顺不等于实盘稳,拆模块这一步省不得。