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
相关产品推荐
相关产品推荐

