自定义追踪止损类封装(SAR/NRTR)
用指标算止损位,封装成可换子类、零改主逻辑的追踪止损
价格朝盈利方向移动时,定期把止损拉近,锁定利润、减少回吐。MT5 内置标准追踪,本文教你用指标(SAR/NRTR)算更聪明的止损位,封装成可复用类。
一、追踪止损解决什么问题
MT5 内置标准追踪只在达收支平衡后按固定距离跟;自定义可用 SAR/NRTR 等跟随趋势,趋势反转前就把止损推到更合理的位置。
二、基类 CTrailingStop 设计
- 通用:判定持仓类型/当前止损、算新止损、检查是否要改、发修改请求;
- 方法:Init/On/Off/StartTimer/StopTimer/EventHandle/Deinit/DoStoploss;
- 虚方法 Refresh/Trend/BuySellStoploss 由子类实现。
三、两个子类
- CParabolicStop(SAR):Trend 看价与 SAR 线上下,买卖止损都取 SAR 值;
- CNRTRStop(NRTR):sup ≠ 0 上升、res ≠ 0 下降,买卖止损取 sup/res。
四、集成到 EA 的七步
包含 .mqh → 声明参数 → 建实例 → OnInit 里 Init/SetParameters/StartTimer/On → OnTimer 调 Refresh → OnTick 调 DoStoploss → OnDeinit 调 Deinit。
五、技术细节与回测
- 最小距离看 SYMBOL_TRADE_STOPS_LEVEL;
- 卖单止损要加点点差(按买价平);
- NormalizeDouble 标准化;
- MqlTradeRequest 填 TRADE_ACTION_SLTP 发修改;
- 文中回测 SAR 版盈利优于 NRTR。
六、SAR 与 NRTR 追踪的算法差异
SAR(抛物线)追踪按固定加速因子逐步拉近止损,单边强趋势里跟得紧、反转时退得也快;NRTR(通道突破)用价格波动带做追踪,更平滑、对噪音更钝。两者适配的市场节奏不同。
选哪个取决于品种波动特性:高波动品种用 NRTR 类平滑追踪更稳,强趋势品种用 SAR 类能吃满行情。没有万能,要靠回测选。 实际部署时可以为不同品种各配一套参数并存,运行时按品种波动自动选 SAR 或 NRTR 模板,比全局一套参数更能适配多市场。
七、把追踪止损接进主循环
追踪止损要每 tick 重新计算止损价,若比当前止损更优(多单更高、空单更低)就用 CTrade 或修改订单函数上移。注意只在「确实更优」时改,避免每 tick 无谓发单。
double newSL = SignalPrice() - ATR(14)*2; if(newSL > PositionGetDouble(POSITION_SL)) trade.PositionModify(_Symbol, newSL, 0);
八、参数与回测注意
追踪距离用 ATR 倍数而非固定点数,跨周期跨品种行为才一致。回测时要看「被扫次数」与「回吐利润」的权衡:太紧频繁被洗、太松利润回吐,找高原而非尖峰参数。 一个实用指标是「被扫后价格是否真的反转」:若扫掉止损后价格往往继续原方向,说明止损太紧、该放宽;若扫掉后反转,说明追踪有效。用这个反馈调参比看曲线直观。
另外追踪止损只在持仓期间有意义,平仓逻辑要独立于它,别让追踪函数误平掉想持有的单。