Indie v5指标开发中提取Color对象RGB组件报错的解决方法求助
Indie v5指标开发中提取Color对象RGB组件报错的解决方法求助
我最近在开发Indie v5指标的时候,碰到了个棘手的问题——想从Color参数里提取红、绿、蓝三个分量时总是报错。
收到的错误提示是:
Error: 96:12 symbol
trend_col.rednot 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
相关产品推荐
相关产品推荐

