
Indie v4 中实现 Parabolic SAR 时,即使 sar[0] 数值有效,图表仍不显示点或线——根本原因在于初始索引越界导致 NaN 传播,而 NaN 值无法渲染;正确做法是使用 .get(offset, default) 安全访问历史数据,并返回完整序列而非单点。
indie v4 中实现 parabolic sar 时,即使 `sar[0]` 数值有效,图表仍不显示点或线——根本原因在于初始索引越界导致 `nan` 传播,而 `nan` 值无法渲染;正确做法是使用 `.get(offset, default)` 安全访问历史数据,并返回完整序列而非单点。
在 Indie v4 中开发自定义 Parabolic SAR 指标时,一个常见却隐蔽的陷阱是:对历史数据的非法前向索引引发全局 NaN 污染。你的代码中 self.close[1] 在第一根K线(即 bar_index == 0)处实际访问的是 close[-1](即未来/未定义值),Indie 默认将其填充为 NaN。由于 NaN + anything == NaN 是 IEEE 754 标准行为,后续所有 sar[0] = sar[1] + af[1] * (ep[1] - sar[1]) 运算均持续产出 NaN——而 Indie 的绘图引擎会自动跳过 NaN 值,导致“计算正常但图表空白”。
✅ 正确解决方案是 避免直接使用方括号索引历史数据,改用 .get() 方法提供安全回退:
#indie:lang_version = 5
from indie import indicator, param, plot, MutSeriesF, color
import math
@indicator('My Parabolic SAR', overlay_main_pane=True)
@param.float('start_AF', default=0.02, min=0.01, max=0.2)
@plot.line('SAR', color=color.WHITE, width=1.2)
def Main(self, start_AF):
# 初始化 SAR 序列,首值取 close[1] 的安全访问结果
sar = MutSeriesF.new(self.close.get(1, self.close[0]))
# 初始化辅助变量(需根据标准 SAR 逻辑补充)
ep = MutSeriesF.new(self.high[0]) # 极值点
af = MutSeriesF.new(start_AF) # 加速因子
trend = MutSeriesF.new(1.0) # 趋势方向:1=上升,-1=下降
# 主循环:从 bar_index = 1 开始逐根计算(确保有足够前置数据)
for i in range(1, len(self.close)):
prev_sar = sar.get(i-1, 0.0)
prev_ep = ep.get(i-1, 0.0)
prev_af = af.get(i-1, start_AF)
prev_trend = trend.get(i-1, 1.0)
# 【此处插入完整的 SAR 趋势判断与更新逻辑】
# 示例简化版(实际需严格遵循 SAR 规则):
if prev_trend > 0:
# 上升趋势:SAR 不能高于前两期最低价,且需低于当前 high
new_sar = prev_sar + prev_af * (prev_ep - prev_sar)
new_sar = min(new_sar, self.low.get(i-2, self.low[i-1]))
new_sar = min(new_sar, self.low.get(i-1, self.low[i-1]))
if self.low[i] new_sar:
new_sar = self.low[i]
new_ep = self.low[i]
new_af = start_AF
new_trend = 1.0
else:
new_ep = min(prev_ep, self.low[i])
new_af = min(prev_af + start_AF, 0.2)
new_trend = -1.0
sar[i] = new_sar
ep[i] = new_ep
af[i] = new_af
trend[i] = new_trend
# ✅ 关键:返回整个序列,而非仅 sar[0]
return plot.Line(sar)
? 关键注意事项:
-
永远不要返回
Plot(sar[0]):plot.Line()/plot.Dot()等函数期望接收Series[T]类型(如MutSeriesF),传入标量(如float)将被忽略; -
起始索引必须 ≥ 1:SAR 是递推指标,至少需要
close[0]和close[1]才能启动,因此主循环应从i = 1开始; -
优先复用内置实现:Indie 已提供经验证的
algorithms.SAR函数和 预置 Parabolic SAR 指标,建议直接调用以规避实现误差; -
调试技巧:添加
print(f"Bar {i}: SAR={sar[i]:.4f}, NaN?={math.isnan(sar[i])}")可快速定位首个NaN出现位置。
遵循以上原则,即可彻底解决“数值正确却无图形”的问题,让 Parabolic SAR 稳定、准确地呈现在主图或副图中。










