
在 Indie 5 中定义指标参数(如 @param.int("length"))后,该参数会以普通函数参数形式传入 calc() 方法,而非自动挂载为 self.length 实例属性;直接使用参数名 length 即可,无需加 self. 前缀。
在 indie 5 中定义指标参数(如 `@param.int("length")`)后,该参数会以普通函数参数形式传入 `calc()` 方法,而非自动挂载为 `self.length` 实例属性;直接使用参数名 `length` 即可,无需加 `self.` 前缀。
Indie 的参数注入机制与传统面向对象编程中的实例属性初始化不同:所有带 @param.* 装饰器声明的参数,在运行时会自动作为位置或关键字参数传递给 calc() 方法,而不是绑定到 self 对象上。因此,self.length 在运行时并不存在,导致编译器报错 Symbol self.length not found。
✅ 正确做法是直接在 calc() 函数体内使用参数名 length —— 它已由 Indie 运行时准确传入,行为完全符合 Python 函数参数规范。
以下是修正后的完整指标代码(关键修改已高亮):
# indie:lang_version = 5
from indie import indicator, param, plot, color, MainContext
from indie.algorithms import Highest, Lowest
@indicator("Support, Resistance and Median with Trend", overlay_main_pane=True)
@param.int("length", default=22, min=1, title="Historical Length")
@plot.line("resistance", color=color.RED, line_width=2, title="Resistance")
@plot.line("support", color=color.GREEN, line_width=2, title="Support")
@plot.line("median", color=color.WHITE, line_width=1, title="Median")
class Main(MainContext):
def calc(self, length): # ← length 是函数参数,非 self 属性
# ✅ 正确:直接使用 length 变量
highest_high = Highest.new(self.high, length)[0]
lowest_low = Lowest.new(self.low, length)[0]
resistance_level = highest_high
support_level = lowest_low
median_level = (resistance_level + support_level) / 2
return resistance_level, support_level, median_level⚠️ 注意事项:
- 不要尝试在
calc()外部(如__init__或类体中)访问length—— Indie 不支持此类提前解析; - 若需在
calc()外复用参数值(例如预计算静态配置),应通过@param.*配合@property或延迟初始化逻辑实现,但绝大多数场景下,仅在calc()内按需使用参数即可; - 所有
@param.*声明的参数均遵循相同规则:它们是calc()的显式参数,不是self的成员变量。
该设计提升了指标的纯函数特性与线程安全性,也更契合 Indie 的向量化计算模型。掌握这一约定,可避免大量因误用 self. 引发的符号未定义错误。

















