🛡
MQL5 向导实战:编写未平仓位的追踪止损模块
追踪止损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,追踪模块在盈利后接管上移。