Pine Editor中基于ATR设置固定止损的问题求助
问题排查与解决方案
你的核心问题是止损值没有在开仓时固定,而是随每根新K线重新计算,原因是stopLoss变量仅在longEntry触发的K线计算,但strategy.exit的参数会被后续K线的动态值覆盖——你没有把开仓瞬间的止损值持久化存储下来。
问题分析
在Pine Script中,strategy.exit如果放在if longEntry块内调用,后续K线运行时该块不会再执行,但你直接使用的ta.lowest(low,1)-ta.atr(1)[1]是动态表达式,每根K线更新时都会重新计算,导致止损值持续变动。必须把开仓时的止损值保存为固定值,后续不再修改。
修复代码
// 声明持久化变量存储止损值,仅初始化一次 var float longStopLoss = na if longEntry strategy.entry('Buy', strategy.long) // 仅在开仓时计算并赋值止损值 longStopLoss := ta.lowest(low, 1) - ta.atr(1)[1] // 全局调用strategy.exit,使用持久化的止损值 strategy.exit('Stop Loss', 'Buy', stop=longStopLoss, when=exitRule)
关键改动说明
- 使用
var float声明变量:var关键字让变量仅在脚本初始化时创建一次,后续只有主动赋值才会改变,确保止损值固定为开仓时的计算结果。 - 把
strategy.exit移出if longEntry块:全局调用可让脚本在每根K线都检查止损和exitRule条件,同时止损值是之前存储的固定值,不会随新K线变动。 - 合并退出条件:
strategy.exit本身支持when参数,无需单独调用strategy.close,直接传入exitRule即可统一处理止损和主动退出逻辑。
内容的提问来源于stack exchange,提问作者Yusuf_408
相关产品推荐
相关产品推荐

