解决 Indie v4 中 Parabolic SAR 指标无图形输出的问题

浅雪酱_9099

浅雪酱_9099

2026-10-14

855人浏览

原创

解决 Indie v4 中 Parabolic SAR 指标无图形输出的问题

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 稳定、准确地呈现在主图或副图中。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1751

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4464

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1709

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

26277

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3187

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3207

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2483

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习