🚦
MQL5 向导实战:编写自定义交易信号模块
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 未初始化指标句柄,检查日志。