6 步创建您自己的交易机器人!·综合运用
🤖

6 步创建您自己的交易机器人!·综合运用

(3/3)· 前两步搭好骨架,这最后一篇把信号模块从裸类跑成实盘可测的 EA

案例拆解新手友好 第 3/3 篇
很多人卡在 MQL5 向导生成 EA 后想加自己的信号,一翻标准库五个基类就劝退。其实你不必啃完 OOP,照着向导的派生规则写个 MA_Cross 类,测试仪里点几下就能验证逻辑。本篇接着前两篇的底座,把从建类到复杂化的最后一公里走完。

用策略测试仪跑通向导生成的交叉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 数据回测。

MQL5 / C++
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)就是现成的简单模块样例,下载后编译零报错,有读者实测可跑。 基于现成信号模块堆复杂策略能玩出花,但那得另开一篇才讲得清。外汇和贵金属杠杆高,回测顺不等于实盘稳,拆模块这一步省不得。

把信号回测交给小布盯盘
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到参数敏感度和信号触发分布,你只管判断逻辑要不要留。把重复劳动交给小布,你专注决策。

常见问题

向导只认从 CExpertSignal 等基类派生的模块,你的类必须按继承规则写,否则编译阶段就会报基类不匹配,向导不会把它列进信号源。
会。尤其短周期均线交叉对点差敏感,测试里用固定点差先跑通逻辑,再切到真实浮动点差看衰减,外汇贵金属本身波动剧烈属高风险。
不用。第 4 节演示的是在同一个 CExpertSignal 派生类里叠加过滤函数,保持接口不变,只是内部判断从单条件变复合,向导装配方式一致。
目前小布盯盘内置的是常见信号诊断视图,自定义类的字段需手动映射一次,之后同品种页就能持续跟踪该信号的触发概率与回撤特征。
通常是给信号加一层时效或波动门槛,避免震荡市频繁开仓,属于把裸逻辑变成能挂实盘的收尾修饰,具体看本文第 2 节示例。