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

Indie脚本语言中Var变量初始化报错“fields can only be created on the top level of __init__ methods”的解决咨询

Indie脚本语言中Var变量初始化报错“fields can only be created on the top level of init methods”的解决咨询

嘿,我来帮你搞定这个Indie脚本的报错问题~

首先,这个报错的意思其实非常明确:Var类型的字段只能在__init__方法的顶层作用域里创建,你之前把Var[bool]和Var[int]移到calc方法里,刚好踩了这个语法规则的红线。

为什么会有这个限制?

Indie脚本里的Var是用来定义指标的状态变量的,这类变量需要在指标初始化阶段(也就是__init__方法执行时)就完成声明,因为它们会在整个指标的生命周期里持续保存状态值。而calc方法是每次行情数据更新都会被调用的计算逻辑块,如果在里面创建Var字段,会导致每次计算都重新生成新的状态变量,完全破坏了指标状态管理的机制,所以编译器直接报错阻止了这种操作。

怎么解决?

给你一套清晰的修正步骤:

  • 第一步:把所有Var类型的变量声明移回__init__方法的最外层,注意不能嵌套在任何条件判断、循环或者其他代码块里,必须直接放在__init__的顶层作用域。
  • 第二步:如果你的需求是在calc方法里修改这些Var变量的值,那完全没问题——声明放在__init__,赋值和逻辑操作放在calc里就可以了。

举个简单的示例对比:

正确写法(符合规则)

class MyIndicator(Indicator):
    def __init__(self):
        # 正确:Var在__init__顶层声明
        self.my_bool = Var[bool](False)
        self.my_int = Var[int](0)
    
    def calc(self):
        # 正确:在calc里修改Var的数值
        self.my_bool.value = True
        self.my_int.value = self.my_int.value + 1

错误写法(就是你当前的情况)

class MyIndicator(Indicator):
    def __init__(self):
        pass
    
    def calc(self):
        # 错误:Var不能在calc方法内声明
        self.my_bool = Var[bool](False)
        self.my_int = Var[int](0)

额外提醒

你提到之前是根据Indie的文档把Var移到calc里的,可能是误解了文档的表述。大概率文档是说Var属于指标的核心状态字段,需要和指标的初始化逻辑绑定,而非让你放到calc方法中。建议再核对下文档里的官方示例,应该都是在__init__里声明Var的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:00:28