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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:07:57