如何在现有交易策略中添加静态ATR(STATIC ATR)?
在Pine Script中为策略添加静态ATR锁定止损
静态ATR止损的核心是开仓时一次性计算ATR值,之后固定止损价不再随后续价格波动更新,和移动ATR止损的区别很明显——后者会跟着最新ATR调整止损位。下面直接给你落地的实现方法和示例代码:
核心逻辑步骤
- 计算基准ATR值(比如用14周期的标准ATR)
- 开仓瞬间记录当时的ATR数值(用
var变量保存,确保开仓后不再变化) - 根据多空方向计算固定止损价:
- 做多单:止损价 = 开仓价 - (ATR倍数 × 开仓时的ATR值)
- 做空单:止损价 = 开仓价 + (ATR倍数 × 开仓时的ATR值)
- 当价格触及这个固定止损价时,触发平仓
示例代码(结合简单均线策略)
假设你已有一个基于均线交叉的策略,我们直接嵌入静态ATR止损逻辑:
//@version=5 strategy("带静态ATR锁定止损的均线策略", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, commission_type=strategy.commission.percent, commission_value=0.1) // 1. 定义基础指标和参数 atr_length = input.int(14, "ATR周期") atr_multiplier = input.float(2.0, "ATR止损倍数") ma_fast = ta.sma(close, 50) ma_slow = ta.sma(close, 200) // 2. 计算ATR atr_value = ta.atr(atr_length) // 3. 用var变量保存开仓时的静态ATR和止损价(开仓前保持初始值,开仓后固定) var float entry_atr = na var float stop_loss_price = na // 4. 开仓条件与静态值记录 long_condition = ta.crossover(ma_fast, ma_slow) short_condition = ta.crossunder(ma_fast, ma_slow) if (long_condition) strategy.entry("做多", strategy.long) entry_atr := atr_value // 记录开仓时的ATR stop_loss_price := strategy.opentrades.entry_price(0) - (atr_multiplier * entry_atr) // 计算多单固定止损 if (short_condition) strategy.entry("做空", strategy.short) entry_atr := atr_value // 记录开仓时的ATR stop_loss_price := strategy.opentrades.entry_price(0) + (atr_multiplier * entry_atr) // 计算空单固定止损 // 5. 触发静态ATR止损平仓 if (strategy.position_size > 0 and close <= stop_loss_price) strategy.close("做多") entry_atr := na // 平仓后重置变量,避免影响下一次开仓 stop_loss_price := na if (strategy.position_size < 0 and close >= stop_loss_price) strategy.close("做空") entry_atr := na stop_loss_price := na // 绘图:显示止损线 plot(strategy.position_size > 0 ? stop_loss_price : na, color=color.red, style=plot.style_linebr, title="多单止损") plot(strategy.position_size < 0 ? stop_loss_price : na, color=color.green, style=plot.style_linebr, title="空单止损")
关键代码解释
var float entry_atr = na:var关键字让变量只初始化一次,开仓前是na,开仓时赋值后就固定不变,直到平仓时重置为nastrategy.opentrades.entry_price(0):获取当前持仓的开仓价格(0代表最新的一笔持仓)- 止损触发条件:多单时价格跌破固定止损价、空单时价格涨破固定止损价,触发平仓并重置静态变量
你可以直接把这段逻辑移植到你现有的策略里,只需要替换掉示例中的long_condition和short_condition为你自己的开仓条件即可。
内容的提问来源于stack exchange,提问作者Rhouterrr
相关产品推荐
相关产品推荐

