Indie中调用Var[int].new()报错,求正确使用位置及“特定上下文”含义
Indie中调用Var[int].new()报错,求正确使用位置及“特定上下文”含义
我来给你拆解这个问题,帮你彻底搞清楚怎么解决:
先理解错误的核心原因
这个报错的本质是:Var是Indie里用来保存跨周期状态的变量(比如你要统计连续上涨的K线数、记录上一个周期的指标值,就需要这种能“记住”历史值的变量),它绝对不能在全局作用域创建——因为全局作用域是脚本初始化的阶段,还没进入指标/算法的实际运行环境,没法把这个变量绑定到正确的运行上下文里。
什么是报错里的“特定上下文”?
报错里提到的这些“特定上下文”,其实就是Indie专门为指标、算法准备的合法执行环境,只有在这些环境里,Indie才能正确管理Var的生命周期和状态:
- 被
@indie.indicator、@indie.algorithm、@indie.sec_context装饰的函数(比如你的Main函数就属于被@indicator装饰的合法上下文) - 继承自
indie.MainContext/indie.SecContext/indie.Algorithm的类的非__init__方法
修复代码的具体操作
你只需要把trend_counter = Var[int].new(0)移到被@indicator装饰的Main函数里面就行。修改后的完整代码如下:
# indie:lang_version = 5 from indie import indicator, plot, color, param, MutSeriesF, Var from indie.algorithms import Ema @indicator("Elder's Force Index (FI)", overlay_main_pane=False) @param.int('length', default=13, min=1, title='EMA Length') def Main(self, length): # 把Var的创建移到这里——Main函数被@indicator装饰,属于合法上下文 trend_counter = Var[int].new(0) # 如果你需要使用这个状态变量,比如更新计数逻辑可以这么写 # 示例:trend_counter.set(trend_counter.get() + 1) # Create a mutable time series for the Force Index fi_series = MutSeriesF.new((self.close[0] - self.close[1]) * self.volume[0]) smoothed_fi = Ema.new(fi_series, length)[0] fi_color = color.GREEN if smoothed_fi > 0 else color.RED return plot.Line(smoothed_fi, color=fi_color)
额外补充:为什么不能在全局创建Var?
Var是带状态的绑定变量,它的值会在每个K线周期之间持续保留。Indie需要把这个变量和当前的指标运行实例绑定,才能保证每个指标的状态是独立的。如果在全局创建,就会导致不同的指标实例共享同一个变量,直接造成状态混乱,这也是Indie禁止全局创建Var的根本原因。
备注:内容来源于stack exchange,提问作者Pavlito
相关产品推荐
相关产品推荐

