用途 custom-indicator 用于创建自定义技术指标。其方式是在 openalgo 的 Rust 核心 ta 原语之上组合向量化 NumPy,产出生产级、O(n) 复杂度的指标函数。
参数与触发方式 接受 $0 = 指标名称(例如 zscore、squeeze、vwap-bands、custom-rsi、mean-reversion),该参数为必需项。如果没有提供参数,则会询问用户想要构建什么指标。
执行流程与规则 创建前会先阅读指标专家规则,尤其是 rules/custom-indicators.md(NumPy + ta 原语模式与模板)、rules/performance.md(Rust 核心性能、O(n) 保证、基准测试)、rules/indicator-catalog.md(检查 openalgo.ta 中是否已存在该指标)。会先检查该指标是否已存在于 openalgo.ta(100+ 指标)中,若存在则告知用户并展示现有 API。之后按需创建 custom_indicators/{indicator_name}/ 目录,并创建 {indicator_name}.py。
文件结构 生成的 {indicator_name}.py 包含文件说明、核心计算函数与公开 API。核心计算函数以向量化 NumPy 建立在 ta 原语之上,使用 ta.sma、ta.stdev 等原语,再用 NumPy 数组运算(np.where、掩码)组合。公开 API 接收 data 与 period 参数(period 默认 20),支持 numpy 数组、pandas Series 或 list 输入,并返回与输入相同类型的结果。
同时会创建 chart.py 用于使用 Plotly 可视化该自定义指标,以及 benchmark.py 用于性能测试。基准测试无需预热,因为 Rust 核心从第一次调用起即全速运行,并会针对 10,000、100,000、500,000 等不同数据量输出耗时。
NumPy 规则(关键) 必须做到:尽可能从 ta 原语组合(它们在 Rust 核心中运行);使用 np.full(n, np.nan) 初始化输出数组;使用数组表达式、np.where 和布尔掩码进行向量化;对除法进行保护(np.errstate(invalid="ignore", divide="ignore") 加上安全分母掩码);遵循原语的 NaN 预热期(用 ~np.isnan(...) 掩码);所有数值数组使用 Float64;仅使用 O(n) 算法。 绝对禁止:绝不重新实现 openalgo.ta 中已存在的指标;绝不对大数组编写逐 bar 的 Python 循环,而应向量化;绝不在未对零/NaN 分母进行掩码的情况下做除法。如果指标确实是路径依赖的(没有原语覆盖的顺序状态),先检查 ta.ema / Wilder 风格原语是否已提供该递归;普通 Python 循环是最后手段,需保持 O(n) 并记录权衡。
可用构建块(在 Rust 核心中运行的公开 ta 方法) 滚动数学:ta.sma, ta.ema, ta.wma, ta.stdev, ta.highest, ta.lowest;价格行为:ta.true_range, ta.atr, ta.change, ta.roc;通道与带:ta.bbands, ta.keltner, ta.donchian;信号:ta.crossover, ta.crossunder, ta.exrem, ta.rising, ta.falling。
常见自定义指标模式 Z-Score:(value - rolling_mean) / rolling_stdev;Squeeze:Bollinger 在 Keltner 通道内;VWAP Bands:VWAP + N * (close - vwap) 的滚动 stdev;Momentum Score:RSI + MACD + ADX 条件的加权和;Mean Reversion:相对 SMA 的距离百分比 + 阈值;Range Filter:基于 ATR 对 close 的动态过滤;Trend Strength:ADX + 方向运动的组合。
示例用法 /custom-indicator zscore;/custom-indicator squeeze-momentum;/custom-indicator vwap-bands;/custom-indicator range-filter。