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

使用ATR设置止盈止损订单 脚本计算错误触发异常问题咨询

问题原因

  • 你当前定义的tplong/stoplong等止盈止损价位是全局实时计算的变量,会随着每一根新K线生成、行情波动持续更新数值,不是开仓时刻的固定值。策略执行时订单的止盈止损价位会持续变动,自然无法按照开仓时的规则触发。
  • 次要问题:当前计算最高价、最低价、ATR时默认包含了当前未走完的K线数据,会导致参数取值偏差。

修复后代码

// 输入参数
LookBack = input(title="Stop/Profit LookBack", type=input.integer, defval=7, minval=1)
ATRLength = input(title="ATR计算周期", type=input.integer, defval=14, minval=1)
ATRMultiplier_TP = input.float(title="止盈ATR倍数", defval=2.0, minval=0.1)
ATRMultiplier_SL = input.float(title="止损ATR倍数", defval=1.0, minval=0.1)

// 预计算历史指标(偏移1位取上一根K收盘后的确定值,避免实时K线波动影响)
hisHigh = ta.highest(high, LookBack)[1]
hisLow = ta.lowest(low, LookBack)[1]
hisATR = ta.atr(ATRLength)[1]

// 开仓时固定止盈止损价位
long_tp = ta.valuewhen(buySignal, hisHigh + hisATR * ATRMultiplier_TP, 0)
long_sl = ta.valuewhen(buySignal, hisLow - hisATR * ATRMultiplier_SL, 0)
short_tp = ta.valuewhen(sellSignal, hisLow - hisATR * ATRMultiplier_TP, 0)
short_sl = ta.valuewhen(sellSignal, hisHigh + hisATR * ATRMultiplier_SL, 0)

// 交易逻辑
strategy.entry("Long", strategy.long, when = buySignal, comment = "Buy")
strategy.exit("Close Long", "Long", limit = long_tp, stop = long_sl, comment = "Close Long")
strategy.entry("Short", strategy.short, when = sellSignal, comment = "Sell Short")
strategy.exit("Close Short", "Short", limit = short_tp, stop = short_sl, comment = "Close Short")

修改说明

  • 使用ta.valuewhen()函数锁定开仓信号触发时的止盈止损价位,后续K线更新不会再改变已开仓订单的止盈止损值,符合常规交易逻辑
  • 指标计算时添加[1]偏移,取上一根K线收盘后的确定数值,避免未闭合K线的实时波动干扰参数取值
  • 把ATR倍数、ATR周期拆成可调整的输入参数,后续调试更灵活

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:54:05