如何在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])
关键修改说明
- 追踪止损变量:用
var float声明long_stop和short_stop,确保变量值在K线间持续保留,不会每次K线重置。 - 单向更新逻辑:
- 多单持仓时,用
ta.max()比较当前计算的止损价与历史追踪止损价,仅保留更高的那个,实现止损只上移不下调。 - 空单持仓时,用
ta.min()确保止损只下移不上调。
- 多单持仓时,用
- 初始止损设置:仅在入场时基于当前K线的高低点设置初始止损,后续仅做单向优化。
- 仓位计算调整:在入场时计算仓位并通过
strategy.adjust_qty()调整,确保基于初始止损的风险计算准确。 - 绘图优化:使用
style=plot.style_linebr让止损线显示更平滑,避免非必要的跳变。
内容的提问来源于stack exchange,提问作者Dave_R_Pierce
相关产品推荐
相关产品推荐

