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

如何在Pine Script中修正ATR追踪止损,避免其随价格回落

ATR追踪止损仅随价格趋势单向移动的Pine Script实现方案

问题描述

编写交易策略时遇到核心问题:当价格突破40日高点开多单,初始止损设为入场K线低点下方3*ATR并需向上追踪,但当前代码中价格下跌时止损也会随之下调,导致止损永远无法触发。需要修改代码让追踪止损仅随价格上涨而上移,下跌时保持固定。

当前代码问题分析

原代码中ATRLongStop=low-(ATR*ATRx)实时基于每根K线的低点计算,当价格下跌时,K线低点降低,止损价也随之降低,无法起到追踪止损的作用——止损永远跟在价格下方,不会被触发。

解决方案代码

//@version=5 

strategy("Donchian Breakout - Trading",overlay=true, initial_capital=100000,currency=currency.GBP)

//Inputs
DonchHighLength=input.int(title="DonchHighLength",defval=40,step=10) // 匹配需求的40日突破
DonchLowLength=input.int(title="DonchLowLength",defval=20,step=10)
ATRLength=input.int(title="ATRLength", defval=20, step=1)
ATRx=input.int(title="ATRMultiple", defval=3, step=1) // 匹配需求的3*ATR系数

//Variables
DonchHigh=ta.highest(close[1],DonchHighLength)
DonchLow=ta.lowest(close[1],DonchLowLength)
ATR=ta.atr(ATRLength)

// 声明追踪止损变量,用var保持跨K线状态
var float long_stop = na
var float short_stop = na

//Entry条件
EnterLong=close>DonchHigh  
EnterShort=close<DonchLow 

// 多单入场与止损更新逻辑
if EnterLong and strategy.position_size == 0
    strategy.entry("Long",strategy.long)
    // 入场时设置初始止损:当前K线低点下方3*ATR
    long_stop = low - (ATR * ATRx)
elif strategy.position_size > 0
    // 持仓时仅在新止损价更高(更靠近现价)时更新,确保止损只上移
    current_long_stop = low - (ATR * ATRx)
    long_stop = ta.max(long_stop, current_long_stop)

// 空单入场与止损更新逻辑
if EnterShort and strategy.position_size == 0
    strategy.entry("Short",strategy.short)
    // 入场时设置初始止损:当前K线高点上方3*ATR
    short_stop = high + (ATR * ATRx)
elif strategy.position_size < 0
    // 持仓时仅在新止损价更低(更靠近现价)时更新,确保止损只下移
    current_short_stop = high + (ATR * ATRx)
    short_stop = ta.min(short_stop, current_short_stop)

// 仓位计算:基于初始止损的风险分配
var float pos_size = na
if EnterLong or EnterShort
    RiskEquity=0.02*strategy.equity
    RiskPerTrade = EnterLong ? (strategy.position_avg_price - long_stop)*syminfo.pointvalue : (short_stop - strategy.position_avg_price)*syminfo.pointvalue
    pos_size = RiskEquity/RiskPerTrade
    // 入场后调整仓位
    strategy.adjust_qty(id="Long", qty=pos_size) if EnterLong
    strategy.adjust_qty(id="Short", qty=pos_size) if EnterShort

// 绘图设置
plot(DonchHigh,"Long Breakout Level", color.green)
plot(DonchLow,"Short Breakout Level", color.red)
plot(long_stop, "Long Trailing Stop", color.black, style=plot.style_linebr)
plot(short_stop, "Short Trailing Stop", color.black, style=plot.style_linebr)

// 平仓条件
strategy.close(id="Long", when=close < long_stop[1])
strategy.close(id="Short", when=close > short_stop[1])

关键修改说明

  1. 追踪止损变量:用var float声明long_stop和short_stop,确保变量值在K线间持续保留,不会每次K线重置。
  2. 单向更新逻辑:
    • 多单持仓时,用ta.max()比较当前计算的止损价与历史追踪止损价,仅保留更高的那个,实现止损只上移不下调。
    • 空单持仓时,用ta.min()确保止损只下移不上调。
  3. 初始止损设置:仅在入场时基于当前K线的高低点设置初始止损,后续仅做单向优化。
  4. 仓位计算调整:在入场时计算仓位并通过strategy.adjust_qty()调整,确保基于初始止损的风险计算准确。
  5. 绘图优化:使用style=plot.style_linebr让止损线显示更平滑,避免非必要的跳变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:55:23