首页 / 交易学院 / MQL5 向导实战:编写自定义交易信号模块
MQL5 向导实战:编写自定义交易信号模块
🚦

MQL5 向导实战:编写自定义交易信号模块

EA 开发实战 难度 · 进阶 2012 11 分钟阅读
MQL5向导信号模块CExpertSignal

向导的四大支柱

通过 MQL5 向导创建的 EA 基于四个基本类:CExpert(引擎)、CExpertSignal(信号)、CExpertMoney(资金)、CExpertTrailing(追踪)。其中 CExpertSignal 负责回答“现在该不该进/平/反”。

CExpertSignal 虚方法签名

信号模块的本质是一组返回 bool 的虚方法。引擎每 tick 调用它们,由 EA 综合信号、资金、追踪后做最终决策。保持“只判断、不下单”是良好设计。

class CExpertSignal : public CObject
{
public:
   virtual bool Init(...) { return false; }
   virtual bool ValidationSettings(void) { return true; }
   virtual bool InitIndicators(void) { return false; }
   virtual bool CheckOpenLong(void)   { return false; }
   virtual bool CheckOpenShort(void)  { return false; }
   virtual bool CheckCloseLong(void)   { return false; }
   virtual bool CheckCloseShort(void)  { return false; }
   virtual bool CheckReverseLong(void) { return false; }
   virtual bool CheckReverseShort(void){ return false; }
   virtual bool CheckTrailingOrderLong(...)  { return false; }
   virtual bool CheckTrailingOrderShort(...) { return false; }
};

最小可用信号类

下面用 MACD 金叉做例子:快线上穿慢线返回开多信号。注意指标句柄在 Init/InitIndicators 中初始化。

class CSampleSignal : public CExpertSignal
{
protected:
   CiMACD m_macd;
public:
   virtual bool InitIndicators(void)
   {
      return m_macd.Create(_Symbol, PERIOD_CURRENT, 12, 26, 9);
   }
   virtual bool CheckOpenLong(void)
   {
      if(m_macd.Main(0) > m_macd.Signal(0)
      && m_macd.Main(1) <= m_macd.Signal(1))
         return true;
      return false;
   }
};

信号处理链

CExpert 在每个 tick 依次调用:信号模块→资金模块→追踪模块,收集各方建议,最后由 EA 决策。这种链式结构让模块可以自由组合。

常见坑

⚠ 加载失败的元凶
1) 必须重写 Init/InitIndicators 初始化指标句柄,否则句柄为无效值;2) ValidationSettings 返回 false 会让向导直接拒绝加载;3) 不要在主信号里直接 OrderSend,只返回 bool。

小结

✦ 信号模块保持纯判断
把下单与仓位交给引擎,信号模块只描述“条件是否成立”。这样同一信号可被不同资金/追踪组合复用,也便于单元测试。

常见问题

不应该。信号模块只返回开/平/反转的 bool,真正下单由 CExpert 决策,保证架构清晰。
Close 是平仓离场;Reverse 是平掉反向并反手,逻辑不同。
多半是 ValidationSettings 返回 false 或 OnInit 未初始化指标句柄,检查日志。