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

策略回测技术求助:导入的指标值无法历史同步更新

问题:从独立指标导入市场状态信号回测结果不准确

我正在开发一款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

问题原因与修复方案

核心问题

  1. 指标逻辑冲突:原指标用两个独立if分支更新状态,会导致当bullishCondition不成立时先重置isBullish,若后续bearishCondition也不成立又重置isBearish,且状态没有持续保留逻辑,无法维持连贯的市场状态。
  2. 策略变量重置:策略中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:42:07