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

基于ATR Bands的策略:止盈止损偶尔失效或随机平仓问题

交易策略止盈止损异常问题排查

我开发了一款交易策略,逻辑是当价格突破开仓时对应的ATR Bands上轨或下轨时触发止盈。策略整体可正常运行,但存在止盈(TP)或止损(SL)偶尔失效、仓位被随机平仓的问题。

策略运行状态截图

  • 正常运行表现:策略正常运行截图
  • 异常运行表现:
    • 异常情况1
    • 异常情况2
    • 异常情况3

原策略代码

//@version=5
strategy("2Ma cross ATR Bands strategy", overlay = true) 

// Inputs
atrPeriod = input(3, "ATR Period")
srcUpper = input(defval = close, title = "Source Upper")
srcLower = input(defval = close, title = "Source Lower")
atrMultiplierUpper = input(title = "ATR Multiplier Upper", defval = 4.0, tooltip ="3.8" )
atrMultiplierLower = input(title = "ATR Multiplier Lower", defval = 3.0, tooltip = "2.5")

// ATR
atr = ta.atr(atrPeriod)

// Plotting
plot(srcUpper + atr * atrMultiplierUpper, color = color.green)
plot(srcLower - atr * atrMultiplierLower, color = color.red)
plot(ta.sma(close,10))

// Entry condition
buysign= ta.crossover(close, ta.sma(close,10))

// Trading session
// session = input.session("0200-1600", "Session") 
// t = time(timeframe.period, session)
// bgcolor(time == t ? color.rgb(76, 175, 79, 80) : na)

// Define take profit and stop loss
tp = srcUpper + atr * atrMultiplierUpper
sl = srcLower - atr * atrMultiplierLower

//place trade
if buysign
    strategy.entry("long", strategy.long)

//exit trade
if buysign
    strategy.exit("TP/SL", stop = sl, limit = tp)

问题根源分析

  1. TP/SL动态更新导致价格漂移:原代码中tp和sl是逐K线计算的,每根K线都会根据当前的ATR和价格重新计算止盈止损价格,而非使用开仓时刻的固定数值。这会导致止盈止损线随行情波动,出现“随机平仓”或触发逻辑混乱的情况。
  2. 退出指令绑定时机错误:strategy.exit仅在buysign触发的K线执行,若开仓后后续K线未再次触发开仓信号,退出指令可能无法持续生效,导致止盈止损偶尔失效。

修正后的策略代码

//@version=5
strategy("2Ma cross ATR Bands strategy", overlay = true) 

// Inputs
atrPeriod = input(3, "ATR周期")
srcUpper = input(defval = close, title = "上轨计算源")
srcLower = input(defval = close, title = "下轨计算源")
atrMultiplierUpper = input(title = "上轨ATR乘数", defval = 4.0, tooltip ="3.8" )
atrMultiplierLower = input(title = "下轨ATR乘数", defval = 3.0, tooltip = "2.5")

// ATR计算
atr = ta.atr(atrPeriod)

// 计算ATR Bands
upper_band = srcUpper + atr * atrMultiplierUpper
lower_band = srcLower - atr * atrMultiplierLower

// 绘图
plot(upper_band, color = color.green, title="ATR上轨")
plot(lower_band, color = color.red, title="ATR下轨")
plot(ta.sma(close,10), color=color.blue, title="10周期均线")

// 开仓信号
buysign= ta.crossover(close, ta.sma(close,10))

// 存储开仓时的固定TP/SL
var float entry_tp = na
var float entry_sl = na

// 执行开仓并记录TP/SL
if buysign
    strategy.entry("long", strategy.long)
    // 开仓瞬间记录当前的ATR Bands作为固定止盈止损
    entry_tp := upper_band
    entry_sl := lower_band

// 执行平仓:持有仓位时持续绑定固定TP/SL
if strategy.position_size > 0
    strategy.exit("TP/SL", stop = entry_sl, limit = entry_tp)

修正说明

  • 使用var关键字定义entry_tp和entry_sl,确保变量仅在开仓时更新为当时的ATR Bands数值,后续保持固定,避免价格漂移。
  • 将strategy.exit的触发条件改为strategy.position_size > 0,只要持有仓位就会维持止盈止损的绑定,确保退出指令持续生效。
  • 拆分ATR Bands的计算逻辑,代码结构更清晰,便于维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:25:03