Pine Script指标组合问题:Stoch标签残留及互锁失效排查
Pivot与Stochastic指标组合逻辑修复(Pine Script)
问题描述
将Pivot指标与Stochastic指标组合编写Pine Script代码后,单独运行绘图正常,但组合后Stoch_Buy标签仍会错误显示,无法判断是重绘还是逻辑问题。需求明确:
- 保留
Pivot_Ready的绘图形状 - 若Stochastic先触发交易,禁用Pivot交易信号
- 若Pivot先触发交易,禁用Stochastic交易信号
原代码
traded_today = false traded_today1 = false stop_pivot = false stop_stoch = false var longOn = false trade_Pivot = input.bool(false, "turn Pivot trading On", group=g_4, inline="", tooltip="turn Pivot trading On") trade_Stoch = input.bool(false, "turn Stoch roll over On", group=g_4, inline="", tooltip="turn Stoch Roll over On") //pivot_buy pivot_buy = open >= vPP and close < vPP //stoch cond2_long = ta.crossover(k,d) and k < stochOS and barstate.isconfirmed // // Pivots if newDay and open > vPP startAboveP := true // - TRADE CONDITIONS - //Pivots Pivot_Ready = not traded_today and startAboveP and trade_Pivot Pivot_Entry = not traded_today1 and pivot_buy and not stop_pivot and trade_Pivot //stoch validLong = not longOn and cond2_long and not stop_stoch and trade_Stoch // - ALERTS FUNCTIONS - if Pivot_Ready traded_today := true // Pivot if Pivot_Entry traded_today1 := true stop_stoch := true alert("Buy " + syminfo.ticker + " at " + str.tostring(vPP, format.mintick) + "\n TP1 " + str.tostring(vR1, format.mintick) + "\n SL " + str.tostring(vS1, format.mintick) + "\n Pivot_Buy" + "\n\n Time Stamp of trigger\n" + "\n\n Time of trade " + str.tostring(t) , alert.freq_once_per_bar) // Stoch if validLong longOn := true stop_pivot := true longSL := close - i_Stop_Loss * 10 * syminfo.mintick longTP := close + i_Take_Profit * 10 * syminfo.mintick alert("Buy " + syminfo.ticker + " at " + str.tostring(close, format.mintick) + "\n TP1 " + str.tostring(longTP, format.mintick) + "\n SL " + str.tostring(longSL, format.mintick) + "\n Stoch" + "\n\n Time Stamp of trigger\n" + "\n\n Time of trade " + str.tostring(barTimeFormatted) , alert.freq_once_per_bar) // TRADES SHAPES plotshape(Pivot_Ready , title="Pivot_Ready" , text="Pivot\nsetup " , color=color.rgb(34, 185, 39), style=shape.labeldown , location=location.abovebar, size=size.tiny, textcolor=color.rgb(0, 0, 0)) plotshape(Pivot_Entry , title="Pivot_Entry" , text="Pivot Buy " , color=color.rgb(34, 185, 39), style=shape.labelup , location = location.belowbar, size=size.tiny, textcolor=color.rgb(0, 0, 0)) //stoch plotshape(validLong , title="Stoch_Buy" , text="Stoch_Buy" , color=color.rgb(34, 185, 39), style=shape.labelup , location=location.belowbar, size=size.small, textcolor=color.black)
问题根源
- 变量未用
var声明:traded_today、traded_today1、stop_pivot、stop_stoch这些控制信号禁用的变量,每根K线都会被重置为false,导致禁用逻辑失效。 - 无交易日重置机制:控制变量未在新交易日开始时重置,可能导致跨交易日的信号干扰。
- 信号条件未持续生效:触发信号后设置的禁用标记,会因变量重置在下一根K线失效,无法持续阻断另一指标的信号。
修复后的代码
//@version=5 indicator("Pivot + Stoch Combo", overlay=true) // 全局设置分组 g_4 = "交易开关" stoch_group = "Stoch参数" trade_group = "交易参数" // 输入参数 trade_Pivot = input.bool(false, "启用Pivot交易", group=g_4) trade_Stoch = input.bool(false, "启用Stoch交易", group=g_4) stochOS = input(20, "Stoch超卖阈值", group=stoch_group) i_Stop_Loss = input(1.0, "止损点数", group=trade_group) i_Take_Profit = input(2.0, "止盈点数", group=trade_group) // Pivot相关逻辑(假设vPP/vR1/vS1为已定义的枢轴点变量) var bool startAboveP = false // 新交易日判断 newDay = ta.change(time("D")) if newDay and open > vPP startAboveP := true // Stoch指标计算 k = ta.sma(ta.rsi(close, 14), 3) d = ta.sma(k, 3) cond2_long = ta.crossover(k, d) and k < stochOS and barstate.isconfirmed // 核心控制变量(用var保持跨K线状态) var bool traded_today = false var bool traded_today1 = false var bool stop_pivot = false var bool stop_stoch = false var bool longOn = false // 每日重置控制变量 if newDay traded_today := false traded_today1 := false stop_pivot := false stop_stoch := false longOn := false startAboveP := false // 交易条件 Pivot_Ready = not traded_today and startAboveP and trade_Pivot Pivot_Entry = not traded_today1 and (open >= vPP and close < vPP) and not stop_pivot and trade_Pivot validLong = not longOn and cond2_long and not stop_stoch and trade_Stoch // 信号触发逻辑 if Pivot_Ready traded_today := true if Pivot_Entry traded_today1 := true stop_stoch := true alert("买入 " + syminfo.ticker + " 价格: " + str.tostring(vPP, format.mintick) + "\n 止盈1: " + str.tostring(vR1, format.mintick) + "\n 止损: " + str.tostring(vS1, format.mintick) + "\n 信号类型: Pivot买入" + "\n 触发时间: " + str.tostring(ta.time, "yyyy-MM-dd HH:mm"), alert.freq_once_per_bar) if validLong longOn := true stop_pivot := true longSL = close - i_Stop_Loss * 10 * syminfo.mintick longTP = close + i_Take_Profit * 10 * syminfo.mintick alert("买入 " + syminfo.ticker + " 价格: " + str.tostring(close, format.mintick) + "\n 止盈1: " + str.tostring(longTP, format.mintick) + "\n 止损: " + str.tostring(longSL, format.mintick) + "\n 信号类型: Stoch买入" + "\n 触发时间: " + str.tostring(ta.time, "yyyy-MM-dd HH:mm"), alert.freq_once_per_bar) // 绘图 plotshape(Pivot_Ready, title="Pivot准备", text="Pivot\n准备", color=color.new(color.green, 0), style=shape.labeldown, location=location.abovebar, size=size.tiny, textcolor=color.black) plotshape(Pivot_Entry, title="Pivot买入", text="Pivot买入", color=color.new(color.green, 0), style=shape.labelup, location=location.belowbar, size=size.tiny, textcolor=color.black) plotshape(validLong, title="Stoch买入", text="Stoch买入", color=color.new(color.blue, 0), style=shape.labelup, location=location.belowbar, size=size.small, textcolor=color.black)
关键修复点
- 用
var声明控制变量:确保stop_pivot、stop_stoch等变量在K线之间保持状态,不会被自动重置。 - 新增交易日重置逻辑:通过
ta.change(time("D"))在新交易日开始时重置所有控制变量,避免跨交易日的信号残留。 - 强化信号互斥逻辑:在
Pivot_Entry和validLong的条件中,严格检查对方的禁用标记,确保触发一个信号后,另一指标的信号被彻底阻断。 - 清理冗余代码:移除原代码中无效的注释文本,整合Pivot买入条件,提升代码可读性。
内容的提问来源于stack exchange,提问作者slipery
相关产品推荐
相关产品推荐

