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

TradingView策略问题:空头仓位TP/SL无法显示与生效

TradingView SuperTrend策略多空TP/SL修复方案

问题根源

当前代码中空头仓位的TP/SL计算逻辑完全错误,同时未结合仓位状态控制TP/SL线的显示,导致:

  • 空头止损/止盈数值计算偏离实际交易逻辑
  • 无仓位时仍会绘制无效的TP/SL线
  • strategy.exit无法正确关联空头仓位触发平仓

修复步骤与核心修改

  1. 固定开仓价格
    用var变量分别存储多/空头的开仓价,在信号触发时更新,避免依赖strategy.position_avg_price的动态变化(加仓/减仓时该值会变动)。
  2. 修正空头TP/SL计算公式
    空头交易逻辑:
    • 止损(SL):价格上涨到设定点位触发平仓,公式为 空头开仓价 * (1 + sl_inp)
    • 止盈(TP):价格下跌到设定点位触发平仓,公式为 空头开仓价 * (1 - tp_inp)
  3. 按需显示TP/SL线
    仅在对应仓位存在时绘制TP/SL线,避免无仓位时的无效数值干扰图表。
  4. 绑定平仓指令到对应仓位
    给strategy.exit添加from_entry参数,明确关联对应的开仓ID,保证平仓逻辑精准触发。

修复后完整代码

//@version=5
strategy('Super', overlay=true, format=format.price, precision=2)

// 用户输入参数
Periods = input(title='ATR周期', defval=10)
src = input(hl2, title='数据源')
Multiplier = input.float(title='ATR乘数', step=0.1, defval=3.0)
changeATR = input(title='切换ATR计算方式?', defval=true)
showsignals = input(title='显示买卖信号?', defval=true)
highlighting = input(title='趋势高亮开关?', defval=true)

sl_inp = input(2.0, title='止损百分比%') / 100
tp_inp = input(1.0, title='止盈百分比%') / 100

// ATR与SuperTrend核心逻辑
atr2 = ta.sma(ta.tr, Periods)
atr = changeATR ? ta.atr(Periods) : atr2
up = src - Multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up
dn = src + Multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn

trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

// 信号绘制
upPlot = plot(trend == 1 ? up : na, title='上升趋势', style=plot.style_linebr, linewidth=2, color=color.new(color.green, 0))
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title='上升趋势启动', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))
plotshape(buySignal and showsignals ? up : na, title='买入', text='买入', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0), textcolor=color.new(color.white, 0))

dnPlot = plot(trend == 1 ? na : dn, title='下降趋势', style=plot.style_linebr, linewidth=2, color=color.new(color.red, 0))
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title='下降趋势启动', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
plotshape(sellSignal and showsignals ? dn : na, title='卖出', text='卖出', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0), textcolor=color.new(color.white, 0))

// 趋势高亮
mPlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? trend == 1 ? color.green : color.white : color.white
shortFillColor = highlighting ? trend == -1 ? color.red : color.white : color.white
fill(mPlot, upPlot, title='上升趋势高亮', color=longFillColor, transp=90)
fill(mPlot, dnPlot, title='下降趋势高亮', color=shortFillColor, transp=90)

// 警报条件
alertcondition(buySignal, title='SuperTrend买入', message='SuperTrend买入信号触发!')
alertcondition(sellSignal, title='SuperTrend卖出', message='SuperTrend卖出信号触发!')
changeCond = trend != trend[1]
alertcondition(changeCond, title='SuperTrend趋势反转', message='SuperTrend趋势方向改变!')

// 开仓价格记录
var float long_entry_price = na
var float short_entry_price = na

// 更新开仓价格
if (buySignal)
    long_entry_price := close
if (sellSignal)
    short_entry_price := close

// 计算多空TP/SL
long_stop_level = long_entry_price * (1 - sl_inp)
long_take_level = long_entry_price * (1 + tp_inp)
short_stop_level = short_entry_price * (1 + sl_inp)
short_take_level = short_entry_price * (1 - tp_inp)

// 多仓操作
strategy.entry('多头仓位', strategy.long, when=buySignal)
strategy.exit('平仓多头', from_entry='多头仓位', stop=long_stop_level, limit=long_take_level)

// 空仓操作
strategy.entry('空头仓位', strategy.short, when=sellSignal)
strategy.exit('平仓空头', from_entry='空头仓位', stop=short_stop_level, limit=short_take_level)

// 绘制TP/SL线(仅对应仓位存在时显示)
plot(strategy.position_size > 0 ? long_stop_level : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=2, title='多头止损')
plot(strategy.position_size > 0 ? long_take_level : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=2, title='多头止盈')
plot(strategy.position_size < 0 ? short_stop_level : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=2, title='空头止损')
plot(strategy.position_size < 0 ? short_take_level : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=2, title='空头止盈')

关键修改说明

  • 新增long_entry_price和short_entry_price变量固定开仓价,避免动态仓位均价干扰TP/SL计算
  • 修正空头TP/SL计算公式,完全匹配空头交易的止损/止盈逻辑
  • 通过strategy.position_size判断仓位状态,仅在对应仓位存在时显示TP/SL线,优化图表清晰度
  • strategy.exit添加from_entry参数,明确绑定开仓ID,确保平仓逻辑精准触发

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:38:12