Pine Script背离策略入场延迟问题排查求助
问题描述
我开发了一款基于背离(Divergence)的TradingView交易策略,能在指标图表上及时识别并标记背离信号,但实际入场操作会延迟若干K线。策略核心是捕捉价格与指标反向运行的背离形态,包括常规多空背离、隐藏多空背离,信号出现后会在图表上高亮显示,但交易不会立即执行,存在明显的延迟等待期。调整回溯范围参数后问题仍未解决,求入场延迟的原因及优化方案。
延迟原因分析
- 入场信号的双重滞后:代码中入场信号判断使用了
bull = bullCond[lbR] or hiddenBullCond[lbR],这里的[lbR]会让信号滞后lbR根K线(默认5根)。而图表标记用offset=-lbR把信号回溯显示到实际触发的K线,导致视觉上信号即时显示,但入场逻辑却额外延迟了lbR根K线。 - 枢轴点确认的叠加延迟:
ta.pivotlow()/ta.pivothigh()本身需要等待lbR根K线走完才能确认当前K线是枢轴点,这是合理的延迟,但入场逻辑额外叠加的[lbR]引用,让延迟翻倍。
优化方案
- 移除入场信号的滞后引用:将
bull = bullCond[lbR] or hiddenBullCond[lbR]修改为bull = bullCond or hiddenBullCond,同理修改bear的定义,让入场信号在背离条件满足的同一根K线触发。 - 保留图表标记的回溯显示:继续使用
offset=-lbR让标记显示在实际枢轴点K线上,保持视觉上的信号及时性,同时让入场逻辑与条件判断同步。 - 平衡延迟与信号准确性:若想进一步降低延迟,可减小
lbR(Pivot Lookback Right)参数,但这会增加假信号概率,需根据品种特性调整。
修正后的完整代码
maType = input.string(title='Moving Average Type', options=['DPO', 'Momentum', 'MACD', 'RSI', 'Stoch'], defval='DPO') len = input.int(title='LookBack Period', minval=1, defval=117) lbR = input(title='Pivot Lookback Right', defval=5) lbL = input.int(title='Pivot Lookback Left', defval=5, maxval=21) rangeUpper = input(title='Max of Lookback Range', defval=500) rangeLower = input(title='Min of Lookback Range', defval=7) plotBull = input(title='Plot Bullish', defval=true) plotHiddenBull = input(title='Plot Hidden Bullish', defval=true) plotBear = input(title='Plot Bearish', defval=true) plotHiddenBear = input(title='Plot Hidden Bearish', defval=true) bearColor = color.red bullColor = color.green hiddenBullColor = color.new(color.yellow, 70) hiddenBearColor = color.new(color.orange, 70) textColor = color.white noneColor = color.new(color.white, 100) // 补充原代码缺失的mom指标生成逻辑 mom = switch maType 'DPO' => ta.dpo(close, len) 'Momentum' => ta.momentum(close, len) 'MACD' => ta.macd(close)[0] - ta.macd(close)[1] 'RSI' => ta.rsi(close, len) 'Stoch' => ta.stoch(close, high, low, len) plFound = na(ta.pivotlow(mom, lbL, lbR)) ? false : true phFound = na(ta.pivothigh(mom, lbL, lbR)) ? false : true _inRange(cond) => bars = ta.barssince(cond == true) rangeLower <= bars and bars <= rangeUpper //------------------------------------------------------------------------------ // Regular Bullish oscHL = mom[lbR] > ta.valuewhen(plFound, mom[lbR], 1) and _inRange(plFound[1]) priceLL = low[lbR] < ta.valuewhen(plFound, low[lbR], 1) bullCond = plotBull and priceLL and oscHL and plFound plot(plFound ? mom[lbR] : na, offset=-lbR, title='Regular Bullish', linewidth=2, color=bullCond ? bullColor : noneColor) plotshape(bullCond ? mom[lbR] : na, offset=-lbR, title='Regular Bullish Label', text=' Bull ', style=shape.labelup, location=location.bottom, color=color.new(bullColor, 0), size=size.small, textcolor=color.new(textColor, 0)) //------------------------------------------------------------------------------ // Hidden Bullish oscLL = mom[lbR] < ta.valuewhen(plFound, mom[lbR], 1) and _inRange(plFound[1]) priceHL = low[lbR] > ta.valuewhen(plFound, low[lbR], 1) hiddenBullCond = plotHiddenBull and priceHL and oscLL and plFound plot(plFound ? mom[lbR] : na, offset=-lbR, title='Hidden Bullish', linewidth=2, color=hiddenBullCond ? hiddenBullColor : noneColor) plotshape(hiddenBullCond ? mom[lbR] : na, offset=-lbR, title='Hidden Bullish Label', text=' H Bull ', style=shape.labelup, location=location.bottom, color=hiddenBullColor, size=size.small, textcolor=color.new(textColor, 0)) //------------------------------------------------------------------------------ // Regular Bearish oscLH = mom[lbR] < ta.valuewhen(phFound, mom[lbR], 1) and _inRange(phFound[1]) priceHH = high[lbR] > ta.valuewhen(phFound, high[lbR], 1) bearCond = plotBear and priceHH and oscLH and phFound plot(phFound ? mom[lbR] : na, offset=-lbR, title='Regular Bearish', linewidth=2, color=bearCond ? bearColor : noneColor) plotshape(bearCond ? mom[lbR] : na, offset=-lbR, title='Regular Bearish Label', text=' Bear ', style=shape.labeldown, location=location.top, color=color.new(bearColor, 0), size=size.small, textcolor=color.new(textColor, 0)) //------------------------------------------------------------------------------ // Hidden Bearish oscHH = mom[lbR] > ta.valuewhen(phFound, mom[lbR], 1) and _inRange(phFound[1]) priceLH = high[lbR] < ta.valuewhen(phFound, high[lbR], 1) hiddenBearCond = plotHiddenBear and priceLH and oscHH and phFound plot(phFound ? mom[lbR] : na, offset=-lbR, title='Hidden Bearish', linewidth=2, color=hiddenBearCond ? hiddenBearColor : noneColor) plotshape(hiddenBearCond ? mom[lbR] : na, offset=-lbR, title='Hidden Bearish Label', text=' H Bear ', style=shape.labeldown, location=location.top, color=hiddenBearColor, size=size.tiny, textcolor=color.new(textColor, 0)) // 移除[lbR]滞后引用,同步入场信号与条件触发 bull = bullCond or hiddenBullCond bear = bearCond or hiddenBearCond tp = input(110,"tp1") sl = input(1000,"sl1") longCondition = bull if (longCondition) strategy.entry("Calls", strategy.long) strategy.exit("TP1", from_entry="Calls", qty_percent = 100, profit = tp, loss = sl) shortCondition = bear if (shortCondition) strategy.entry("Puts", strategy.short) strategy.exit("TP1", from_entry="Puts", qty_percent = 100, profit = tp, loss = sl)
内容的提问来源于stack exchange,提问作者Dalton Trevino
相关产品推荐
相关产品推荐

