You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在现有交易策略中添加静态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,开仓时赋值后就固定不变,直到平仓时重置为na
  • strategy.opentrades.entry_price(0):获取当前持仓的开仓价格(0代表最新的一笔持仓)
  • 止损触发条件:多单时价格跌破固定止损价、空单时价格涨破固定止损价,触发平仓并重置静态变量

你可以直接把这段逻辑移植到你现有的策略里,只需要替换掉示例中的long_condition和short_condition为你自己的开仓条件即可。

内容的提问来源于stack exchange,提问作者Rhouterrr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:31:18