首页 / 交易学院 / 小布知识库 / 6 步用 MQL5 向导造交易机器人:从零写一个 CExpertSignal 模块
6 步用 MQL5 向导造交易机器人:从零写一个 CExpertSignal 模块
🤖

6 步用 MQL5 向导造交易机器人:从零写一个 CExpertSignal 模块

EA 开发实战 难度 · 入门 2011 12 分钟阅读
MQL5 向导CExpertSignal交易机器人信号模块Wizard 描述EA 生成

很多交易者想有自己的 EA,但不想从零啃完面向对象。MQL5 向导(Wizard)就是为这种需求量身做的:点几次鼠标,就能生成一个可在策略测试器里回测、优化、并最终连账户自动交易的机器人。本文用“双均线交叉”信号做例子,6 步带你从空白文件写出一个能被向导识别的信号模块——不用先精通 OOP,跟着做就行。

一、MQL5 向导与 5 个基类

向导之所以能自动拼 EA,是因为它只认一套标准基类。最核心的有 5 个:CExpertBase 是其余 4 个的基类;CExpert 是交易机器人主体(交易类);CExpertSignal 是交易信号模块(本文主角);CExpertTrailing 是追踪止损;CExpertMoney 是资金管理。你不需要学全 OOP,只要把自己的信号写成 CExpertSignal 的派生类,向导就能把它“插”进生成的 EA 里。

二、第 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 时会自动调用这些同名方法把外部输入灌进类里,你不用手写赋值逻辑。

易错点:描述头里的参数名(如 FastPeriod)必须和类里的设值方法名一字不差地对应,否则向导生成 EA 时参数接不进类,信号永远读不到你设的值。命名一致性是向导机制能跑通的命脉。

五、第 4~5 步:校验与信号逻辑

第 4 步加 ValidationSettings():它先调用基类 CExpertSignal::ValidationSettings(),再检查你的参数是否合理(如周期必须 ≥1),不合理就 PrintFormat 报错并返回 false,避免明显非法配置进测试器。第 5 步才是真正的信号逻辑——在类里实现“快线在慢线之上=买、之下=卖”的判断,返回对应的多空信号。这两步决定模块“稳不稳、准不准”。

六、第 6 步:在向导里生成并测试 EA

一切就绪后,打开 MQL5 向导,选 Expert Advisor(基于类的),在信号模块里就能看到“两条移动平均线交叉信号”,勾选它、设置 FastPeriod/SlowPeriod 等参数,向导自动生成完整 EA 源码。编译后丢进策略测试器,既能回测历史,也能做参数优化,满意了再连真实/模拟账户自动交易。整个流程你没手写一行下单代码。

进阶建议:写熟一个信号模块后,可以把它当模板克隆出更多(RSI 交叉、MACD 背离等),只改类内信号逻辑和描述头参数。向导生态的标准库里上百个模块都是这个套路,读懂一个就能读一片。

七、小结

用 MQL5 向导造机器人,本质是把“交易想法”装进 CExpertSignal 这个标准插槽:建派生类、写向导描述头、把参数接进同名设值方法、加 ValidationSettings 校验、补信号逻辑,最后在向导里一键生成 EA。你不必精通 OOP,只要遵循这套固定契约,就能产出可回测、可优化、可上线的机器人。把它作为 EA 开发的起点,比从 OnTick 裸写更快也更稳。

常见问题

它能点几次鼠标生成一个完整 EA:可在策略测试器回测与参数优化,满意后连账户自动交易。前提是你的信号写成 CExpertSignal 派生类,向导才能把它插进生成的 EA。零 OOP 基础也能跟着固定步骤做出可用模块。
CExpertBase(其余 4 个的共同基类)、CExpert(交易机器人主体,负责下单与持仓)、CExpertSignal(交易信号模块,本文要写的)、CExpertTrailing(追踪止损)、CExpertMoney(资金管理)。向导只认这套标准基类来自动拼装 EA。
写在文件注释块里,固定字段:标题(向导显示名)、类型(固定 SignalAdvanced)、名称、短名(生成 EA 参数前缀)、类、页,以及若干“参数=函数名,类型,默认值,描述”行。类型必须写 SignalAdvanced,否则向导不识别。
向导生成 EA 时会按描述头里的参数名,自动调用类里同名的 public 设值方法把外部输入灌进成员。若名字对不上,参数接不进类,信号永远读不到你设的值。命名一致性是向导机制跑通的命脉。
它在 EA 启动/优化前检查参数是否合法(如周期必须≥1),不合法就报错并返回 false,避免明显非法配置进测试器浪费时间。先调用基类同名方法,再补自己的参数校验。