TradingView策略问题:空头仓位TP/SL无法显示与生效
TradingView SuperTrend策略多空TP/SL修复方案
问题根源
当前代码中空头仓位的TP/SL计算逻辑完全错误,同时未结合仓位状态控制TP/SL线的显示,导致:
- 空头止损/止盈数值计算偏离实际交易逻辑
- 无仓位时仍会绘制无效的TP/SL线
strategy.exit无法正确关联空头仓位触发平仓
修复步骤与核心修改
- 固定开仓价格
用var变量分别存储多/空头的开仓价,在信号触发时更新,避免依赖strategy.position_avg_price的动态变化(加仓/减仓时该值会变动)。 - 修正空头TP/SL计算公式
空头交易逻辑:- 止损(SL):价格上涨到设定点位触发平仓,公式为
空头开仓价 * (1 + sl_inp) - 止盈(TP):价格下跌到设定点位触发平仓,公式为
空头开仓价 * (1 - tp_inp)
- 止损(SL):价格上涨到设定点位触发平仓,公式为
- 按需显示TP/SL线
仅在对应仓位存在时绘制TP/SL线,避免无仓位时的无效数值干扰图表。 - 绑定平仓指令到对应仓位
给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
相关产品推荐
相关产品推荐

