PineScript开仓后如何存储入场K线ATR值计算1:1止盈

问题原因
代码中直接引用的atr是随K线更新实时变动的序列值,没有在开仓信号触发的当根K线把对应的ATR值固定存储,持仓期间每次计算止盈都会拉取最新一根K线的ATR数值,最终导致止盈价位计算错误。
修复方法
- 新增独立变量,在开仓信号触发时记录当根K线的ATR值,持仓期间保持该值不变,空仓时重置
- 止盈差值计算时调用存储的固定开仓ATR值,替换原代码中实时变动的
atr引用 - 给
strategy.exit增加from_entry参数绑定对应方向的开仓订单,避免跨方向平仓异常
修复后完整代码:
//@version=4 strategy("ATR 1:1止盈策略", overlay=true) // 定义ATR周期,默认取常用的14周期,可按需调整 atrLength = 14 atrVal = atr(atrLength) buy = crossover(close, atrVal) sell = crossunder(close, atrVal) // 存储开仓当根的ATR值 var float entryAtr = na // 开仓信号触发时记录当前K线ATR if buy or sell entryAtr := atrVal // 空仓状态下重置记录值 if strategy.position_size == 0 entryAtr := na strategy.entry("long", true, when = buy) strategy.entry("short", false, when = sell) // 用开仓时固定的ATR计算止盈距离 differenceLong = strategy.position_avg_price - entryAtr differenceShort = entryAtr - strategy.position_avg_price // 计算对应方向止盈价 longExitPrice = strategy.position_avg_price + differenceLong shortExitPrice = strategy.position_avg_price - differenceShort if (strategy.position_size > 0) strategy.exit(id="TP", from_entry="long", limit = longExitPrice) if (strategy.position_size < 0) strategy.exit(id="TP", from_entry="short", limit = shortExitPrice)
补充说明
如果需要调整风险收益比,只需要在计算longExitPrice和shortExitPrice时,给差值乘上对应系数即可,比如要做1.5:1的风报比,就把差值乘1.5之后再和入场价运算。
内容的提问来源于stack exchange,提问作者Rayhan Brito
相关产品推荐
相关产品推荐

