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

Indie v5指标开发中提取Color对象RGB组件报错的解决方法求助

Indie v5指标开发中提取Color对象RGB组件报错的解决方法求助

我最近在开发Indie v5指标的时候,碰到了个棘手的问题——想从Color参数里提取红、绿、蓝三个分量时总是报错。

收到的错误提示是:

Error: 96:12 symbol trend_col.red not found

我原本是这么写代码,想生成一个带透明度的填充色:

fill_color = color.rgba(
    trend_col.red(),
    trend_col.green(),
    trend_col.blue(),
    0.2
)

这里的trend_col是根据趋势状态切换的Color变量,代码逻辑是:

trend_col = upper_col if trend_up else lower_col

而upper_col和lower_col都是用户自定义的Color类型参数:

@param.color("upper_col", default=color.GREEN, title="Up Color")
@param.color("lower_col", default=color.RED, title="Down Color")

我已经试过好几种方法,但全失败了:

  • 尝试color.red(trend_col):报错symbol indie.color.red not found
  • 尝试trend_col.red():就是开头提到的symbol trend_col.red not found错误
  • 尝试color.r(trend_col):同样行不通

有没有懂行的朋友知道,在Indie里应该怎么正确提取Color对象的RGB值啊?

附上完整的报错代码供参考:

# indie:lang_version = 5

from indie import indicator, MainContext, param, plot, color, MutSeriesF, algorithm, SeriesF, Optional, Color
from indie.algorithms import Atr
import math

@algorithm
def KalmanFilter(self, src: SeriesF, length: int, R: float = 0.01, Q: float = 0.1) -> SeriesF:
    estimate = MutSeriesF.new(init=float('nan'))
    error_est = MutSeriesF.new(init=1.0)
    error_meas = MutSeriesF.new(init=R * length)
    kalman_gain = MutSeriesF.new(init=0.0)
    
    if math.isnan(estimate[0]):
        estimate[0] = src[1]
    
    prediction = estimate[0]
    kalman_gain[0] = error_est[0] / (error_est[0] + error_meas[0])
    estimate[0] = prediction + kalman_gain[0] * (src[0] - prediction)
    error_est[0] = (1 - kalman_gain[0]) * error_est[0] + Q / length
    
    return estimate

@indicator("Kalman Trend Levels [BigBeluga]", overlay_main_pane=True)
@param.int("short_len", default=50, title="Short Length")
@param.int("long_len", default=150, title="Long Length")
@param.bool("retest_sig", default=False, title="Retest Signals")
@param.bool("candle_color", default=True, title="Candle Color")
@param.color("upper_col", default=color.GREEN, title="Up Color")
@param.color("lower_col", default=color.RED, title="Down Color")
@plot.line("p1", title="Short Kalman")
@plot.line("p2", title="Long Kalman", line_width=2)
@plot.fill("p1", "p2")
class Main(MainContext):
    def __init__(self):
        self.prev_short_kalman = 0.0
        self.prev_trend_up = False
        self.lower_box_start = 0
        self.lower_box_top = 0.0
        self.lower_box_bottom = 0.0
        self.upper_box_start = 0
        self.upper_box_top = 0.0
        self.upper_box_bottom = 0.0
        
    def calc(self, short_len, long_len, retest_sig, candle_color, upper_col, lower_col):
        atr = Atr.new(200, "RMA")[0] * 0.5
        
        short_kalman_series = KalmanFilter.new(self.close, short_len)
        long_kalman_series = KalmanFilter.new(self.close, long_len)
        
        short_kalman = short_kalman_series[0]
        long_kalman = long_kalman_series[0]
        
        short_kalman_2 = self.prev_short_kalman
        self.prev_short_kalman = short_kalman
        
        trend_up = short_kalman > long_kalman
        prev_trend_up = self.prev_trend_up
        trend_changed = trend_up != prev_trend_up
        
        trend_col = upper_col if trend_up else lower_col
        trend_col1 = upper_col if short_kalman > short_kalman_2 else lower_col
        
        candle_col: Optional[Color] = None
        if candle_color:
            if trend_up and short_kalman > short_kalman_2:
                candle_col = upper_col
            elif not trend_up and short_kalman < short_kalman_2:
                candle_col = lower_col
            else:
                candle_col = color.GRAY
        
        if trend_up and not prev_trend_up:
            self.lower_box_start = self.bar_index
            self.lower_box_top = self.low[0] + atr
            self.lower_box_bottom = self.low[0]
            close_rounded = round(self.close[0], 1)
        
        if prev_trend_up and not trend_up:
            self.upper_box_start = self.bar_index
            self.upper_box_top = self.high[0]
            self.upper_box_bottom = self.high[0] - atr
            close_rounded = round(self.close[0], 1)
        
        if retest_sig:
            if self.high[0] < self.upper_box_bottom and self.high[1] >= self.upper_box_bottom:
                pass
            if self.low[0] > self.lower_box_top and self.low[1] <= self.lower_box_top:
                pass
        
        self.prev_trend_up = trend_up
        
        fill_color = color.rgba(
            trend_col.r,
            trend_col.g,
            trend_col.b,
            0.2
        )
        
        return (
            plot.Line(short_kalman, color=trend_col1),
            plot.Line(long_kalman, color=trend_col),
            plot.Fill(color=fill_color)
        )

备注:内容来源于stack exchange,提问作者crysisen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:12:59