6 步用 MQL5 向导造交易机器人:从零写一个 CExpertSignal 模块
很多交易者想有自己的 EA,但不想从零啃完面向对象。MQL5 向导(Wizard)就是为这种需求量身做的:点几次鼠标,就能生成一个可在策略测试器里回测、优化、并最终连账户自动交易的机器人。本文用“双均线交叉”信号做例子,6 步带你从空白文件写出一个能被向导识别的信号模块——不用先精通 OOP,跟着做就行。
一、MQL5 向导与 5 个基类
向导之所以能自动拼 EA,是因为它只认一套标准基类。最核心的有 5 个:CExpertBase 是其余 4 个的基类;CExpert 是交易机器人主体(交易类);CExpertSignal 是交易信号模块(本文主角);CExpertTrailing 是追踪止损;CExpertMoney 是资金管理。你不需要学全 OOP,只要把自己的信号写成 CExpertSignal 的派生类,向导就能把它“插”进生成的 EA 里。
- CExpertBase:其余 4 个类的共同基类
- CExpert:交易机器人主体,负责下单与持仓管理
- CExpertSignal:交易信号模块(本文要写的东西)
- CExpertTrailing:追踪保护性止损
- CExpertMoney:资金管理/仓位计算
二、第 1 步:从头建一个信号类
在 Navigator 里新建文件,存到 MQL5/Include/Expert/ 下,右键选 New File 建类。类名按功能取,比如“两条均线交叉”就叫 MA_Cross;基类(Base Class)填 CExpertSignal,表示我们从它派生。生成后,文件顶部要加一行 #include "..\ExpertSignal.mqh",让编译器知道 CExpertSignal 在哪儿。到这步,类还是空的,但已经能编译通过。
// MA_Cross.mqh 头部
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property version "1.00"
#include "..\ExpertSignal.mqh" // CExpertSignal 所在包含文件
class MA_Cross : public CExpertSignal
{
private:
public:
MA_Cross(void);
~MA_Cross(void);
};
三、第 2 步:写向导描述头(让向导认得它)
空类向导看不到——你得在文件里加一段“向导描述”注释块,按固定规则写。关键字段:标题(向导里显示的名字)、类型(固定 SignalAdvanced)、名称、短名(生成 EA 时参数前缀,形如 Signal_<短名>_<参数>)、类、页,以及若干“参数=函数名,类型,默认值,描述”行。本文例子要 4 个外部参数:FastPeriod、FastMethod、SlowPeriod、SlowMethod。写完编译无错,再开向导就能在信号模块列表里看到它。
// 向导描述开始 //+------------------------------------------------------------------ //| 标题=两条移动平均线交叉信号 //| 类型=SignalAdvanced //| 名称=My_MA_Cross //| 短名=MaCross //| 类=MA_Cross //| 参数=FastPeriod,int,13,fast MA周期 //| 参数=FastMethod,ENUM_MA_METHOD,MODE_SMA,快速 MA 方法 //| 参数=SlowPeriod,int,21,slow MA 周期 //| 参数=SlowMethod,ENUM_MA_METHOD,MODE_SMA,慢速 MA 方法 //+------------------------------------------------------------------ // 向导描述结束
四、第 3 步:把外部参数接进类成员
向导描述里声明的参数,值要存到 MA_Cross 类的对应成员里。先在类 private 区加 4 个成员(m_period_fast、m_method_fast、m_period_slow、m_method_slow 等)。然后——关键技巧——在 public 区声明与参数“同名”的设值方法,例如 void FastPeriod(int value){ m_period_fast=value; }。向导生成 EA 时会自动调用这些同名方法把外部输入灌进类里,你不用手写赋值逻辑。
五、第 4~5 步:校验与信号逻辑
第 4 步加 ValidationSettings():它先调用基类 CExpertSignal::ValidationSettings(),再检查你的参数是否合理(如周期必须 ≥1),不合理就 PrintFormat 报错并返回 false,避免明显非法配置进测试器。第 5 步才是真正的信号逻辑——在类里实现“快线在慢线之上=买、之下=卖”的判断,返回对应的多空信号。这两步决定模块“稳不稳、准不准”。
六、第 6 步:在向导里生成并测试 EA
一切就绪后,打开 MQL5 向导,选 Expert Advisor(基于类的),在信号模块里就能看到“两条移动平均线交叉信号”,勾选它、设置 FastPeriod/SlowPeriod 等参数,向导自动生成完整 EA 源码。编译后丢进策略测试器,既能回测历史,也能做参数优化,满意了再连真实/模拟账户自动交易。整个流程你没手写一行下单代码。
七、小结
用 MQL5 向导造机器人,本质是把“交易想法”装进 CExpertSignal 这个标准插槽:建派生类、写向导描述头、把参数接进同名设值方法、加 ValidationSettings 校验、补信号逻辑,最后在向导里一键生成 EA。你不必精通 OOP,只要遵循这套固定契约,就能产出可回测、可优化、可上线的机器人。把它作为 EA 开发的起点,比从 OnTick 裸写更快也更稳。