
Indie 脚本禁止使用 global 关键字,但可通过类成员变量(如 self.global_value)安全实现跨K线状态保持;需根据是否需要支持回溯(intrabar rollback)选择普通字段、Var 或 MutSeriesF。
indie 脚本禁止使用 `global` 关键字,但可通过类成员变量(如 `self.global_value`)安全实现跨k线状态保持;需根据是否需要支持回溯(intrabar rollback)选择普通字段、`var` 或 `mutseriesf`。
在 Indie 脚本中,global 语句被明确禁止(报错 “global statements are prohibited”),这是出于确定性执行与历史回溯(replay)机制的设计要求——全局变量无法参与回滚,会破坏策略在历史数据重放或实时行情微调时的一致性。
✅ 正确做法是:将状态封装在指标类中,作为实例属性(self.xxx)维护。Indie 的 MainContext 类提供了生命周期管理能力,__init__ 中初始化状态,calc() 方法中更新并返回结果:
# indie:lang_version = 5
from indie import indicator, param, plot, color, MainContext
@indicator("Persistent Value Demo")
@param.int("length", default=10, min=1, title="Length")
@plot.line("trend_line", color=color.BLUE, title="Trend Line")
class Main(MainContext):
def __init__(self):
self.last_close = 0.0 # 初始化为浮点数,确保类型安全
def calc(self, length):
self.last_close = self.close[0] # 每根K线更新为最新收盘价
return self.last_close? 关键说明:
-
self.last_close是跨K线持久的,每根新K线都会覆盖该值,旧值自动保留至下一根K线; - 若需支持 intrabar 回滚(例如在 tick 级别调试、模拟订单触发时要求状态可逆),应改用
Var或MutSeriesF:from indie import Var # … 在 __init__ 中: self.last_close = Var(0.0) # 支持回滚的单值容器 # 在 calc 中: self.last_close.set(self.close[0]) return self.last_close.get()
-
MutSeriesF更适用于需保存整个序列(如移动平均的中间数组),而单值状态首选Var或直接self.xxx。
⚠️ 注意事项:
- 避免在
calc()外部(如模块顶层)定义变量,所有状态必须绑定到self; - 初始化值类型建议显式声明(如
0.0而非0),避免隐式类型转换异常; -
calc()方法名不可更改,且必须有且仅有一个参数(即第一个@param定义的参数,其余参数按声明顺序自动注入)。
总之,Indie 的设计哲学是“状态即对象属性”,用面向对象方式管理持久化数据,既保证执行可靠性,又天然兼容回测与实时双模式。

















