首页 / 交易学院 / MQL5 向导实战:编写未平仓位的追踪止损模块
MQL5 向导实战:编写未平仓位的追踪止损模块
🛡

MQL5 向导实战:编写未平仓位的追踪止损模块

EA 开发实战 难度 · 进阶 2012 11 分钟阅读
追踪止损CExpertTrailing移动止损

追踪模块的作用

CExpertTrailing 只负责“是否该修改保护性订单”,最终决策仍归 CExpert。把它独立出来,可以让同一信号搭配不同的护利策略。

核心虚方法

Trailing 模块暴露 CheckTrailingStopLong/Short,返回是否需要上移/下移止损。Profit 与 StopLevel 是两个关键参数。

class CExpertTrailing : public CObject
{
public:
   virtual bool Init(...) { return false; }
   virtual bool CheckTrailingStopLong(void)  { return false; }
   virtual bool CheckTrailingStopShort(void) { return false; }
};

class CSampleTrailing : public CExpertTrailing
{
protected:
   double m_profit;     // 触发盈利阈值
   double m_stoplevel;  // 追踪距离
};

实现移动止损逻辑

只有盈利超过阈值才启动追踪,且新止损必须高于(多头)现有止损,遵循“只增不减”原则,避免把止损往不利方向拉。

bool CSampleTrailing::CheckTrailingStopLong(void)
{
   double pos = PositionGetDouble(POSITION_PRICE_OPEN);
   double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   if(bid - pos < m_profit) return false;          // 未达盈利阈值
   double new_sl = bid - m_stoplevel;
   if(new_sl > PositionGetDouble(POSITION_SL))
      return true;                                  // 允许上移止损
   return false;
}

参数:Profit / StopLevel

Profit 设触发线(盈利多少才开始护利),StopLevel 设回撤距离(从现价回撤多少锁利)。二者配合可避免过早锁定利润,也避免利润回吐过多。

常见坑

⚠ 只增不减 + 最小距离
1) 必须比较 new_sl 与现有 SL,只增不减;2) 新止损不能小于经纪商最小止损距离(STOP_LEVEL);3) 短线品种 StopLevel 太小会被拒,导致永不移动。

小结

✦ 正交组合的力量
追踪模块与信号模块正交:可以“激进信号 + 保守护利”,也可以“保守信号 + 激进护利”,无需改动彼此代码。

常见问题

由 CExpert 在每个 tick/价变调用 CheckTrailingStop*,无需自己挂 OnTick。
常因 new_sl 仍低于当前 SL(只增不减规则),或小于经纪商最小止损距离。
可以,资金模块设初始 SL,追踪模块在盈利后接管上移。