策略回测技术求助:导入的指标值无法历史同步更新
问题:从独立指标导入市场状态信号回测结果不准确
我正在开发一款TradingView策略,流程是从独立Indicator导出代表市场状态(看涨=1、看跌=-1、中性=0)的数值,再在策略中通过input.source导入并转换为布尔标记。但深度回测时,状态标记无法反映真实历史状态,仿佛回测只回溯了策略逻辑而非指标的历史值。我尝试用barstate.ishistory限定仅在历史数据更新标记,问题仍存在。
指标导出代码
indicator("Regime Signal Exporter", overlay=true) // Example conditions for regime detection bool bullishCondition = close > open[1] bool bearishCondition = close < open[1] // Regime flags var bool isBullish = false var bool isBearish = false // Update regime flags based on conditions (mutual exclusivity) if bullishCondition isBullish := true isBearish := false else isBullish := false if bearishCondition isBearish := true isBullish := false else isBearish := false // Numerical values for export exportBullRegime = isBullish ? 1 : 0 exportBearRegime = isBearish ? -1 : 0 plot(exportBullRegime, title="Mr. Bull", style=plot.style_line, display=display.none) plot(exportBearRegime, title="Mr. Bear", style=plot.style_line, display=display.none)
策略导入代码
strategy("Regime imports", overlay=true) // Input source imported_BullRegime = input.source(title="Mr. Bull", group="Market Regime Imports", defval=close) imported_BearRegime = input.source(title="Mr. Bear", group="Market Regime Imports", defval=close) // Market Regime Variables bool isBull = false bool isBear = false if barstate.ishistory if imported_BullRegime == 1 isBull := true isBear := false else if imported_BearRegime == -1 isBear := true isBull := false else // Neither regime is active, reset the flags isBull := false isBear := false
问题原因与修复方案
核心问题
- 指标逻辑冲突:原指标用两个独立
if分支更新状态,会导致当bullishCondition不成立时先重置isBullish,若后续bearishCondition也不成立又重置isBearish,且状态没有持续保留逻辑,无法维持连贯的市场状态。 - 策略变量重置:策略中
isBull/isBear未用var声明,每根K线都会被重置为false;同时barstate.ishistory的限定会导致实时K线无法更新状态,且未正确同步指标的历史信号。
修复后的指标代码
indicator("Regime Signal Exporter", overlay=true) // 市场状态判断条件 bool bullishCondition = close > open[1] bool bearishCondition = close < open[1] // 用var声明保持状态 var bool isBullish = false var bool isBearish = false // 互斥更新逻辑:优先判断看涨,再看跌,中性时可选择是否保留上一状态 if bullishCondition isBullish := true isBearish := false else if bearishCondition isBearish := true isBullish := false // 若需要中性时强制重置状态,取消以下注释 // else // isBullish := false // isBearish := false // 导出数值信号 exportBullRegime = isBullish ? 1 : 0 exportBearRegime = isBearish ? -1 : 0 plot(exportBullRegime, title="Mr. Bull", style=plot.style_line, display=display.none) plot(exportBearRegime, title="Mr. Bear", style=plot.style_line, display=display.none)
修复后的策略代码
strategy("Regime imports", overlay=true) // 导入指标信号(需在策略设置中选择对应指标的plot项) imported_BullRegime = input.source(title="Mr. Bull", group="Market Regime Imports") imported_BearRegime = input.source(title="Mr. Bear", group="Market Regime Imports") // 用var声明保持状态 var bool isBull = false var bool isBear = false // 同步指标信号,无需限定barstate.ishistory if imported_BullRegime == 1 isBull := true isBear := false else if imported_BearRegime == -1 isBear := true isBull := false else // 中性情况,可选是否重置 isBull := false isBear := false // 调试用:绘制状态标记验证 plotshape(isBull, title="Bullish", location=location.belowbar, color=color.green, style=shape.labelup, text="BULL") plotshape(isBear, title="Bearish", location=location.abovebar, color=color.red, style=shape.labeldown, text="BEAR")
关键注意事项
- 策略导入
input.source时,必须在设置中选择对应指标的plot项(即"Mr. Bull"和"Mr. Bear"),而非默认的close。 - 确保指标与策略使用相同时间周期,避免信号错位。
- 若需要状态持续保留(如看涨状态维持至看跌信号出现),不要在中性分支重置
isBull/isBear。
内容的提问来源于stack exchange,提问作者Pokeas
相关产品推荐
相关产品推荐

