首页 / 交易学院 / 小布知识库 / 自定义追踪止损类封装(SAR/NRTR)
自定义追踪止损类封装(SAR/NRTR)
🛡️

自定义追踪止损类封装(SAR/NRTR)

用指标算止损位,封装成可换子类、零改主逻辑的追踪止损

EA 开发实战 难度 · 进阶 2026-07-15 11 分钟阅读
#EA#追踪止损#SAR#NRTR#OOP

价格朝盈利方向移动时,定期把止损拉近,锁定利润、减少回吐。MT5 内置标准追踪,本文教你用指标(SAR/NRTR)算更聪明的止损位,封装成可复用类。

一、追踪止损解决什么问题

MT5 内置标准追踪只在达收支平衡后按固定距离跟;自定义可用 SAR/NRTR 等跟随趋势,趋势反转前就把止损推到更合理的位置。

二、基类 CTrailingStop 设计

三、两个子类

四、集成到 EA 的七步

包含 .mqh → 声明参数 → 建实例 → OnInit 里 Init/SetParameters/StartTimer/On → OnTimer 调 Refresh → OnTick 调 DoStoploss → OnDeinit 调 Deinit。

✦ 换指标零改主逻辑
把追踪止损做成类,EA 里只调 DoStoploss(),换指标(SAR→NRTR→自己写的)只需换子类,主逻辑一行不改。

五、技术细节与回测

⚠ 卖单止损加点点差
卖单止损加点点差这一步极易漏——漏了修改会被拒或平在错误价;用 MathMin/MathMax 把止损夹在允许区间内。

六、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);
✦ 只在更优时改
每 tick 都改止损会刷爆订单。判断「新止损比旧止损更优才改」,既跟住趋势又不多花手续费。

八、参数与回测注意

追踪距离用 ATR 倍数而非固定点数,跨周期跨品种行为才一致。回测时要看「被扫次数」与「回吐利润」的权衡:太紧频繁被洗、太松利润回吐,找高原而非尖峰参数。 一个实用指标是「被扫后价格是否真的反转」:若扫掉止损后价格往往继续原方向,说明止损太紧、该放宽;若扫掉后反转,说明追踪有效。用这个反馈调参比看曲线直观。

另外追踪止损只在持仓期间有意义,平仓逻辑要独立于它,别让追踪函数误平掉想持有的单。

九、小结

✦ 小结
追踪止损类封装:SAR 跟得紧适合强趋势、NRTR 平滑适合高波动,用 ATR 倍数归一化跨品种一致。接主循环时只在「新止损更优」才改单,回测权衡扫单率与利润回吐,找高原参数。

常见问题

内置只在达收支平衡后按固定距离跟;自定义可用 SAR/NRTR 等跟随趋势,趋势反转前就把止损推到更合理的位置。
基类管通用流程,子类只管指标怎么给止损价,换指标零改主逻辑;还能多品种多策略同时挂不同追踪类。
卖单按买价(Bid)平仓,而止损价挂在卖价侧,两者差一个 spread;不加的话止损位会偏,触发异常或被拒。
每 tick 改止损既耗资源又可能因最小距离限制被拒;文中有每 tick / 每 bar 两种模式,震荡市用每 bar 更稳。
文中样例 SAR 版盈利改善更明显,NRTR 接近但偏弱;但结论依赖具体品种与时段,换市场要重测,别当成铁律。