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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:18:26