关于 indicator-expert
OpenAlgo Indicator Expert Skill 为交易者和开发者提供基于 Python 的技术指标分析规范,涵盖 OpenAlgo、yfinance 和 openalgo.ta 的数据处理、指标计算、绘图及仪表板模式。
主要功能
- 01使用 100 多种 openalgo.ta 指标
- 02从 OpenAlgo 或 yfinance 获取行情
- 03处理实时 WebSocket 数据流
- 04构建 Plotly 图表和仪表板
- 05用 NumPy 组合自定义指标
- 06参考模块化规则和模板
适用场景
- 01根据行情数据创建指标图表
- 02构建多标的和多周期仪表板
- 03订阅实时报价或市场深度
- 04开发自定义指标组合
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ marketcalls/ openalgo-indicator-skills --skill indicator-expert安装后在 Claude Code 中输入/indicator-expert确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
rules/custom-indicators.mddashboard-patterns.mddata-fetching.mdindicator-catalog.mdindicator-combinations.mdmulti-timeframe.mdperformance.mdplotting.mdsignal-generation.mdstreamlit-patterns.mdsymbol-format.mdwebsocket-feeds.mdrules/assets/bollinger_chart/chart.pyrules/assets/custom_indicator/template.pyrules/assets/dashboard_basic/app.pyrules/assets/dashboard_multi/app.pyrules/assets/ema_chart/chart.pyrules/assets/live_feed/template.pyrules/assets/macd_chart/chart.pyrules/assets/multi_indicator/chart.pyrules/assets/rsi_chart/chart.pyrules/assets/scanner/template.pyrules/assets/streamlit_basic/app.pyrules/assets/streamlit_multi/app.pyrules/assets/supertrend_chart/chart.py详细介绍
OpenAlgo 指标专家技能
环境
- Python 3.12+(openalgo 2.x 所需),以及 openalgo、pandas、numpy、plotly、dash、streamlit
- 数据源:OpenAlgo(印度市场,通过
client.history()、client.quotes()、client.depth())、yfinance(美国/全球) - 实时数据:OpenAlgo WebSocket(
client.connect()、subscribe_ltp、subscribe_quote、subscribe_depth) - 指标:openalgo.ta(始终使用——通过编译后的 Rust 核心计算 100 多种指标,从首次调用起即可全速运行)
- 图表:使用
template="plotly_dark"的 Plotly - 仪表板:使用
dash-bootstrap-components的 Plotly Dash(默认),或使用st.plotly_chart()的 Streamlit——仅在用户明确要求时使用 Streamlit - 自定义指标:使用 openalgo.ta 基础函数组合 NumPy 向量化操作(Rust 核心——无需 JIT,也无需预热)
- 使用
python-dotenv+find_dotenv()从根目录下的单个.env加载 API 密钥——绝不硬编码密钥 - 脚本按需放入相应目录(charts/、dashboards/、custom_indicators/、scanners/),并在需要时创建目录
- 代码或日志输出中绝不使用图标/表情符号
关键规则
- 始终使用 openalgo.ta 计算所有技术指标。绝不重新实现库中已有的指标。
- 数据规范化:获取数据后,始终将 DataFrame 索引转换为 datetime、排序并移除时区。
- 信号清理:生成原始买入/卖出信号后,始终使用
ta.exrem()。调用 exrem 前始终使用.fillna(False)。 - Plotly 深色主题:所有图表都使用
template="plotly_dark";绘制蜡烛图时将xaxis type="category"。 - 自定义指标:使用 openalgo.ta 基础函数(
ta.sma、ta.stdev、ta.bbands等)与 NumPy 向量化操作组合。绝不重新实现内置指标;无需 JIT 或预热。 - 输入灵活性:openalgo.ta 接受 numpy 数组、pandas Series 或列表。输出类型与输入类型一致。
- WebSocket 数据流:使用
client.connect()、client.subscribe_ltp()/subscribe_quote()/subscribe_depth()获取实时数据。 - 环境:通过
find_dotenv()从项目根目录加载.env——绝不硬编码 API 密钥。 - 市场识别:如果代码看起来属于印度市场(SBIN、RELIANCE、NIFTY),使用 OpenAlgo。如果属于美国市场(AAPL、MSFT),使用 yfinance。
- 始终用通俗易懂的语言解释图表输出,让交易者了解指标所显示的内容。
数据源优先级
| 市场 | 数据源 | 方法 | 示例代码 |
|---|---|---|---|
| 印度(股票) | OpenAlgo | client.history() | SBIN、RELIANCE、INFY |
| 印度(指数) | OpenAlgo | client.history(exchange="NSE_INDEX") | NIFTY、BANKNIFTY |
| 印度(期货与期权) | OpenAlgo | client.history(exchange="NFO") | NIFTY30DEC25FUT |
| 美国/全球 | yfinance | yf.download() | AAPL、MSFT、SPY |
OpenAlgo 数据 API 方法
| 方法 | 用途 | 返回值 |
|---|---|---|
client.history(symbol, exchange, interval, start_date, end_date) | OHLCV 蜡烛图 | DataFrame(timestamp、open、high、low、close、volume) |
client.quotes(symbol, exchange) | 实时快照 | Dict(open、high、low、ltp、bid、ask、prev_close、volume) |
client.multiquotes(symbols=[...]) | 多标的报价 | 报价字典列表 |
client.depth(symbol, exchange) | 市场深度(L5) | Dict(bids、asks、ohlc、volume、oi) |
client.intervals() | 可用间隔 | Dict(minutes、hours、days、weeks、months) |
client.optionchain(underlying, exchange, expiry_date, strike_count) | ATM 附近的期权链 | Dict(underlying_ltp、atm_strike、每个行权价对应 ce/pe 的链) |
client.optiongreeks(symbol, exchange, interest_rate, ...) | 期权希腊值 + IV | Dict(greeks:delta/gamma/theta/vega/rho、implied_volatility、days_to_expiry) |
client.expiry(symbol, exchange, instrumenttype) | 到期日列表 | Dict(data:到期日列表) |
client.connect() | WebSocket 连接 | None(建立 WS 连接) |
client.subscribe_ltp(instruments, callback) | 实时 LTP 流 | 携带 {symbol, exchange, ltp} 的回调 |
client.subscribe_quote(instruments, callback) | 实时报价流 | 携带 {symbol, exchange, ohlc, ltp, volume} 的回调 |
client.subscribe_depth(instruments, callback) | 实时深度流 | 携带 {symbol, exchange, bids, asks} 的回调 |
指标库参考
所有指标均通过 from openalgo import ta 访问:
趋势(20)
ta.sma、ta.ema、ta.wma、ta.dema、ta.tema、ta.hma、ta.vwma、ta.alma、ta.kama、ta.zlema、ta.t3、ta.frama、ta.supertrend、ta.ichimoku、ta.chande_kroll_stop、ta.trima、ta.mcginley、ta.vidya、ta.alligator、ta.ma_envelopes
动量(9)
ta.rsi、ta.macd、ta.stochastic、ta.cci、ta.williams_r、ta.bop、ta.elder_ray、ta.fisher、ta.crsi
波动率(16)
ta.atr、ta.bbands、ta.keltner、ta.donchian、ta.chaikin_volatility、ta.natr、ta.rvi、ta.ultimate_oscillator、ta.true_range、ta.massindex、ta.bb_percent、ta.bb_width、ta.chandelier_exit、ta.historical_volatility、ta.ulcer_index、ta.starc
成交量(15)
ta.obv、ta.obv_smoothed、ta.vwap、ta.mfi、ta.adl、ta.cmf、ta.emv、ta.force_index、ta.nvi、ta.pvi、ta.volosc、ta.vroc、ta.kvo、ta.pvt、ta.rvol
振荡指标(20+)
ta.cmo、ta.trix、ta.uo_oscillator、ta.awesome_oscillator、ta.accelerator_oscillator、ta.ppo、ta.po、ta.dpo、ta.aroon_oscillator、ta.stoch_rsi、ta.rvi_oscillator、ta.cho、ta.chop、ta.kst、ta.tsi、ta.vortex、ta.gator_oscillator、ta.stc、ta.coppock、ta.roc
统计(9)
ta.linreg、ta.lrslope、ta.correlation、ta.beta、ta.variance、ta.tsf、ta.median、ta.mode、ta.median_bands
混合(6+)
ta.adx、ta.dmi、ta.aroon、ta.pivot_points、ta.sar、ta.williams_fractals、ta.rwi
兼容 TA-Lib(18,openalgo 2.0 新增)
ta.mom、ta.rocp、ta.rocr、ta.rocr100、ta.apo、ta.midpoint、ta.midprice、ta.avgprice、ta.medprice、ta.typprice、ta.wclprice、ta.plus_dm、ta.minus_dm、ta.dx、ta.adxr、ta.stochf、ta.linregangle、ta.linregintercept
实用工具
ta.crossover、ta.crossunder、ta.cross、ta.highest、ta.lowest、ta.change、ta.roc、ta.stdev、ta.exrem、ta.flip、ta.valuewhen、ta.rising、ta.falling
模块化规则文件
每个主题的详细参考文档位于 rules/:
| 规则文件 | 主题 |
|---|---|
| indicator-catalog | 包含签名和参数的 100 多种指标完整参考 |
| data-fetching | OpenAlgo 历史数据、报价和深度数据,yfinance,数据规范化 |
| plotting | Plotly 蜡烛图、叠加图、子图、多面板图表 |
| custom-indicators | 使用向量化 NumPy 和 ta 基元构建自定义指标 |
| websocket-feeds | 通过 WebSocket 实时流式传输 LTP、报价和深度数据 |
| performance | Rust 核心性能、O(n) 保证、基准测试 |
| dashboard-patterns | 带回调的 Plotly Dash Web 应用 |
| streamlit-patterns | 带侧边栏、指标和 Plotly 图表的 Streamlit Web 应用 |
| multi-timeframe | 多时间周期指标分析 |
| signal-generation | 信号生成、清理、交叉和下穿 |
| indicator-combinations | 组合指标进行共振分析 |
| symbol-format | OpenAlgo 符号格式、交易所代码、指数符号 |
图表模板(位于 rules/assets/)
| 模板 | 路径 | 描述 |
|---|---|---|
| EMA 图表 | assets/ema_chart/chart.py | 蜡烛图上的 EMA 叠加图 |
| RSI 图表 | assets/rsi_chart/chart.py | RSI 超买/超卖区域 |
| MACD 图表 | assets/macd_chart/chart.py | MACD 线、信号线、直方图 |
| Supertrend | assets/supertrend_chart/chart.py | 带方向颜色的 Supertrend 叠加图 |
| Bollinger | assets/bollinger_chart/chart.py | 带挤压检测的布林带 |
| 多指标 | assets/multi_indicator/chart.py | 蜡烛图 + EMA + RSI + MACD + 成交量 |
| 基础仪表盘 | assets/dashboard_basic/app.py | 单符号 Plotly Dash 应用 |
| 多标的仪表盘 | assets/dashboard_multi/app.py | 多标的、多时间周期仪表盘 |
| Streamlit 基础版 | assets/streamlit_basic/app.py | 单标的 Streamlit 应用 |
| Streamlit 多周期版 | assets/streamlit_multi/app.py | 多时间周期 Streamlit 应用 |
| 自定义指标 | assets/custom_indicator/template.py | NumPy 自定义指标模板(组合 ta 基元) |
| 实时数据流 | assets/live_feed/template.py | WebSocket 实时指标 |
| 扫描器 | assets/scanner/template.py | 多标的指标扫描器 |
快速模板:标准指标图表脚本
import os
from datetime import datetime, timedelta
from pathlib import Path
import numpy as np
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
from dotenv import find_dotenv, load_dotenv
from openalgo import api, ta
# --- Config ---
script_dir = Path(__file__).resolve().parent
load_dotenv(find_dotenv(), override=False)
SYMBOL = "SBIN"
EXCHANGE = "NSE"
INTERVAL = "D"
# --- Fetch Data ---
client = api(
api_key=os.getenv("OPENALGO_API_KEY"),
host=os.getenv("OPENALGO_HOST", "http://127.0.0.1:5000"),
)
end_date = datetime.now().date()
start_date = end_date - timedelta(days=365)
df = client.history(
symbol=SYMBOL, exchange=EXCHANGE, interval=INTERVAL,
start_date=start_date.strftime("%Y-%m-%d"),
end_date=end_date.strftime("%Y-%m-%d"),
)
if "timestamp" in df.columns:
df["timestamp"] = pd.to_datetime(df["timestamp"])
df = df.set_index("timestamp")
else:
df.index = pd.to_datetime(df.index)
df = df.sort_index()
if df.index.tz is not None:
df.index = df.index.tz_convert(None)
close = df["close"]
high = df["high"]
low = df["low"]
volume = df["volume"]
# --- Compute Indicators ---
ema_20 = ta.ema(close, 20)
rsi_14 = ta.rsi(close, 14)
# --- Chart ---
fig = make_subplots(
rows=2, cols=1, shared_xaxes=True,
row_heights=[0.7, 0.3], vertical_spacing=0.03,
subplot_titles=[f"{SYMBOL} Price + EMA(20)", "RSI(14)"],
)
# Candlestick
x_labels = df.index.strftime("%Y-%m-%d")
fig.add_trace(go.Candlestick(
x=x_labels, open=df["open"], high=high, low=low, close=close,
name="Price",
), row=1, col=1)
# EMA overlay
fig.add_trace(go.Scatter(
x=x_labels, y=ema_20, mode="lines",
name="EMA(20)", line=dict(color="cyan", width=1.5),
), row=1, col=1)
# RSI subplot
fig.add_trace(go.Scatter(
x=x_labels, y=rsi_14, mode="lines",
name="RSI(14)", line=dict(color="yellow", width=1.5),
), row=2, col=1)
fig.add_hline(y=70, line_dash="dash", line_color="red", row=2, col=1)
fig.add_hline(y=30, line_dash="dash", line_color="green", row=2, col=1)
fig.update_layout(
template="plotly_dark", title=f"{SYMBOL} Technical Analysis",
xaxis_rangeslider_visible=False, xaxis_type="category",
xaxis2_type="category", height=700,
)
fig.show()