关于 openalgo
openalgo 是面向印度市场交易者的 OpenAlgo Python SDK 使用技能,涵盖交易执行、行情数据、扫描、图表、回测和实时流。内容还包括辅助脚本与示例,并强调模拟分析、订单确认和 API 密钥管理等安全流程。
主要功能
- 01股票及衍生品订单执行
- 02行情查询与多标的扫描
- 03期权分析和图表可视化
- 04基于 vectorbt 的回测示例
- 05WebSocket 实时行情订阅
- 06订单安全流程与辅助脚本
适用场景
- 01构建印度市场的股票或期权交易脚本
- 02筛选多个标的并查看行情数据
- 03订阅实时行情并处理断线重连
- 04用历史数据和指标测试策略
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ marketcalls/ openalgo-skills --skill openalgo安装后在 Claude Code 中输入/openalgo确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/LotSize.csvexamples/01_execution/basket_rebalance.pyiron_condor.pyorder_with_sl_target_workflow.pyplace_atm_straddle.pyplace_equity_order.pysupertrend_live.pyexamples/02_scanners/breakout_scanner.pynifty50_gainers_losers.pypre_open_gap_scanner.pyrsi_oversold_scanner.pyvolume_surge_scanner.pyexamples/03_visualization/oi_change_histogram.pypcr_dashboard.pysector_heatmap.pyytd_heatmap.pyexamples/04_backtesting/ema_crossover_backtest.pymulti_symbol_screener_backtest.pysupertrend_backtest.pyexamples/05_charting/candlestick_with_indicators.pymarket_depth_ladder.pymax_pain_chart.pyoption_chain_oi_chart.pyexamples/06_streaming/depth_stream_20level.pyltp_stream_basic.pyreconnect_loop_template.pystream_with_telegram_alert.pyexamples/07_execution_algos/cancel_all_with_alert.pyconditional_bracket.pyiceberg_slicer.py详细介绍
OpenAlgo — 印度市场交易技能
OpenAlgo 是一个与券商无关、可自托管的交易平台。一个 Python
SDK(pip install openalgo)通过统一的 REST + WebSocket 接口连接 30 多家印度券商。此技能涵盖完整的 SDK 功能,以及面向交易者常见的七种核心工作流的生产就绪辅助工具和示例:
- 订单执行 — 股票、F&O、按偏移量选择期权、多腿、篮子、拆分、智能
- 自定义执行算法 — 限价单追单、自动修改、按时间/价格触发撤单
- 扫描器 —
multiquotes+ 历史数据 + 筛选管道 - 可视化 — 热力图、OI 图表、季节性、涨幅榜/跌幅榜、PCR 仪表板
- 回测 — vectorbt 胶水代码,采用贴近实际的印度费用、NIFTY 基准
- 图表 — 蜡烛图(分类 x 轴,无周末间隔)、深度阶梯、期权链 OI、IV 微笑曲线
- 实时流 — LTP / Quote / Depth WebSocket、重连循环、回调路由
设置
pip install -U "openalgo[indicators]"
pip install -r requirements.txt # includes vectorbt, TA-Lib, plotly, duckdb, dotenv
cp .env.sample .env # fill in OPENALGO_API_KEY and host/ws URLs
最简初始化(此技能中的每个脚本都以相同方式开始):
import os
from dotenv import find_dotenv, load_dotenv
from openalgo import api
load_dotenv(find_dotenv(), override=False)
client = api(
api_key=os.environ["OPENALGO_API_KEY"],
host=os.environ.get("OPENALGO_HOST", "http://127.0.0.1:5000"),
ws_url=os.environ.get("OPENALGO_WS_URL", "ws://127.0.0.1:8765"),
)
对于仓库内的脚本,优先使用共享辅助工具:
from scripts.openalgo_client import get_client
client = get_client()
安全规则 — 始终遵守
- 先在分析器模式下迭代。 开启
client.analyzertoggle(mode=True),让 SDK 模拟响应而不触达券商。只有在策略经过审查后才关闭。 - 实盘下单前先确认。 打印清晰易读的预览(交易标的、方向、数量、产品、价格、名义金额),并等待用户确认;除非用户已明确授权当前会话自动执行。
- 默认优先使用
LIMIT,而非MARKET。 先查询交易标的报价,再以 LTP ± 若干个最小变动价位设置可成交限价单。只有用户明确要求时才使用 MARKET。 - 验证 F&O 手数倍数。 加载捆绑的
assets/LotSize.csv(或调用client.symbol()获取当前lotsize),并在下单前拒绝非整数倍的数量。 - 名义金额超过 Rs 50,000 时发出警告。 对于 F&O,若价格未知,则使用
lotsize × strike作为最坏情况估算值。 - F&O/商品/货币交易绝不使用
CNC。 这些板块只能使用MIS(日内)或NRML(隔夜)。CNC仅适用于股票交割。 - 绝不硬编码 API 密钥。 始终通过
find_dotenv()从.env读取。拒绝包含字面量 64 位十六进制密钥的脚本。 - 实盘执行多腿订单时,每条腿都必须明确确认。
optionsmultiorder和basketorder会将各订单分别发送给券商,可能出现部分失败 — 处理results[]数组,不要仅相信顶层status。 - 注意速率限制。 订单 API 上限为每秒 10 次(智能订单每秒 2 次),数据 API 上限为每秒 50 次。请使用
scripts/orders.py中带退避的重试辅助工具,避免紧密循环。 - WebSocket 重连由用户负责。 使用
scripts/stream.py中的subscribe()上下文管理器 — 它会处理身份验证、心跳,以及断开连接后的重新订阅。
文件输出约定
此技能为特定操作生成代码时,将输出写入按需创建的专属子文件夹(绝不预先创建):
openalgo_workspace/
├── execution/
│ ├── atm_straddle/ # straddle.py, run.log, trade_journal.csv
│ └── iron_condor/
├── execution_algos/
│ ├── limit_chaser_reliance/ # chaser.py, fills.csv
│ └── twap_slicer_sbin/
├── scanners/
│ ├── rsi_oversold/ # scan.py, results_2026-05-24.csv
│ └── breakout/
├── visualization/
│ └── sector_heatmap/ # heatmap.py, heatmap_2026-05-24.html
├── backtesting/
│ ├── supertrend_sbin/ # backtest.py, trades.csv, equity.html
│ └── ema_crossover_nifty50/
├── charting/
│ └── nifty_option_chain_oi/ # chart.py, oi_27jan26.html
└── streaming/
└── nifty_depth_stream/ # stream.py, ticks.parquet
每个子文件夹都是独立完整的 — 包含脚本、生成的数据、绘图和日志。
用户可以对任意文件夹执行 rm -rf,而不会影响其他文件夹。
常量 — 订单接口
| 类别 | 值 |
|---|---|
| 交易所 | NSE BSE(股票);NFO BFO(F&O);CDS BCD(货币);MCX NCDEX NCO(商品);NSE_INDEX BSE_INDEX MCX_INDEX GLOBAL_INDEX(仅报价) |
| 操作 | BUY SELL |
| 产品 | CNC(仅股票交割),MIS(所有板块的日内交易),NRML(F&O / 商品隔夜) |
| 价格类型 | MARKET、LIMIT、SL(止损限价)、SL-M(止损市价) |
| 有效期 | DAY(默认),IOC |
| 期权偏移 | ATM、ITM1..ITM20、OTM1..OTM20(由 SDK 根据 ATM 行权价解析) |
| WS 模式 | 1 = LTP,2 = 报价(OHLC+成交量),3 = 深度(depth_level 为 5/20/30/50) |
| WS 详细程度 | 0/False 静默,1/True 连接日志,2 所有数据更新 |
完整语法见 references/order-constants.md 和 references/symbol-format.md。F&O 手数以 CSV 文件形式附带在 assets/LotSize.csv 中(参见 references/lot-sizes.md)。
符号格式速查
Equity: RELIANCE (just the base symbol)
Futures: NIFTY30JUN26FUT [base][DDMMMYY]FUT
Options: NIFTY30JUN2626500CE [base][DDMMMYY][strike][CE/PE]
仅用于报价的指数符号(不可交易,用于 quotes/history/ws):
NIFTY BANKNIFTY FINNIFTY MIDCPNIFTY NIFTYNXT50 SENSEX BANKEX(以及 80 多个其他符号,见 references/symbol-format.md)
SDK 方法完整映射表
| 分组 | 方法 | 文档 |
|---|---|---|
| 下单 | placeorder | 订单管理 |
placesmartorder | "" — 根据持仓调整仓位大小 | |
optionsorder | "" — 按 offset(ATM/ITMn/OTMn) | |
optionsmultiorder | "" — 多腿(铁鹰式、跨式、对角式) | |
basketorder | "" — 订单列表,结果为 results[] | |
splitorder | "" — 将大数量拆分为 N 个批次 | |
| 订单管理 | modifyorder | "" |
cancelorder | "" | |
cancelallorder | "" | |
closeposition | "" — 平掉所有仓位 | |
| GTT(仅限 REST) | placegttorder / modifygttorder / cancelgttorder / gttorderbook | 订单管理 |
| 订单信息 | orderstatus | 订单信息 |
openposition | "" — 针对特定标的 | |
| 市场数据 | quotes | 市场数据 |
multiquotes | "" — 支持多个标的,供扫描器使用 | |
depth | "" — 完整的 Level-2 订单簿 | |
history | "" — source="api"(经纪商)或 source="db"(Historify DuckDB) | |
intervals | "" | |
| 标的服务 | symbol | 标的服务 |
search | "" — 模糊查找 | |
expiry | "" — F&O 到期日 | |
instruments | "" — 完整主数据 | |
| 期权分析 | optionsymbol | 期权服务 |
optionchain | "" — 含 OI 的完整 CE/PE 链 | |
syntheticfuture | "" | |
optiongreeks | "" — delta/gamma/theta/vega/rho + IV | |
| 账户 | funds | 账户服务 |
margin | "" — 多腿保证金计算器 | |
orderbook | "" | |
tradebook | "" | |
positionbook | "" | |
holdings | "" | |
| 日历 | holidays(year) | 市场日历 |
timings(date) | "" | |
checkholiday(date) | "" | |
| 分析器 | analyzerstatus / analyzertoggle(mode=True) | 分析器服务 |
| 提醒 | telegram(username, message) | 提醒 |
whatsapp(text, to=..., image=..., document=...) | "" | |
| WebSocket | connect() / disconnect() | WebSocket 流式传输 |
subscribe_ltp / subscribe_quote / subscribe_depth(以及对应的取消订阅变体) | "" | |
get_quotes() — 拉取最新的缓存快照 | "" | |
| 指标 | from openalgo import ta → ta.supertrend、ta.donchian、ta.ichimoku、ta.hma、ta.kama、ta.alma、ta.zlema、ta.vwma、ta.exrem、ta.crossover、ta.crossunder、ta.flip | 指标 |
Python SDK 的文档字符串并未列出所有关键字参数——如果缺少某个参数或其含义不明确,请参阅 /Users/openalgo/test-zerodha/openalgo/docs/api/<group>/<endpoint>.md 中对应端点的 REST 文档。该目录中的参数信息完整。
快速模板 — 下单并进行预览和分析器安全检查
import os
from dotenv import find_dotenv, load_dotenv
from openalgo import api
load_dotenv(find_dotenv(), override=False)
client = api(
api_key=os.environ["OPENALGO_API_KEY"],
host=os.environ.get("OPENALGO_HOST", "http://127.0.0.1:5000"),
)
SYMBOL, EXCHANGE = "RELIANCE", "NSE"
ACTION, QTY, PRODUCT = "BUY", 1, "MIS"
# 1. Quote to anchor a marketable limit price (safer than MARKET)
q = client.quotes(symbol=SYMBOL, exchange=EXCHANGE)["data"]
limit_price = round(q["ltp"] * 1.001, 2) if ACTION == "BUY" else round(q["ltp"] * 0.999, 2)
notional = limit_price * QTY
print(f"--- Order Preview ---")
print(f" {ACTION} {QTY} {SYMBOL} @ LIMIT {limit_price} notional Rs {notional:,.2f}")
print(f" Product: {PRODUCT} LTP: {q['ltp']}")
if input("Proceed? [y/N] ").strip().lower() != "y":
raise SystemExit("aborted")
response = client.placeorder(
strategy=os.environ.get("OPENALGO_DEFAULT_STRATEGY", "python"),
symbol=SYMBOL,
exchange=EXCHANGE,
action=ACTION,
price_type="LIMIT",
product=PRODUCT,
quantity=str(QTY),
price=str(limit_price),
)
print("ORDER:", response)
快速模板 — 带重连功能的 LTP 流式传输
import os, time
from dotenv import find_dotenv, load_dotenv
from openalgo import api
load_dotenv(find_dotenv(), override=False)
client = api(
api_key=os.environ["OPENALGO_API_KEY"],
host=os.environ.get("OPENALGO_HOST", "http://127.0.0.1:5000"),
ws_url=os.environ.get("OPENALGO_WS_URL", "ws://127.0.0.1:8765"),
verbose=True,
)
instruments = [
{"exchange": "NSE_INDEX", "symbol": "NIFTY"},
{"exchange": "NSE", "symbol": "RELIANCE"},
]
def on_ltp(msg):
d = msg["data"]
print(f"{d['symbol']:<12} LTP {d['ltp']} @ {d['timestamp']}")
client.connect()
client.subscribe_ltp(instruments, on_data_received=on_ltp)
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
client.unsubscribe_ltp(instruments)
client.disconnect()
快速模板 — 直接从 DuckDB 获取历史数据(Historify)
client.history(..., source="db") 会通过 REST 路由。对于批量多标的拉取或回测,请直接访问 DuckDB 文件:
import os, duckdb, pandas as pd
from dotenv import find_dotenv, load_dotenv
load_dotenv(find_dotenv(), override=False)
DB = os.environ["HISTORIFY_DUCKDB_PATH"] # e.g. /srv/openalgo/db/historify.duckdb
con = duckdb.connect(DB, read_only=True)
# Historify schema: table `market_data` with epoch timestamps
df = con.execute("""
SELECT
symbol,
exchange,
to_timestamp(timestamp) AT TIME ZONE 'Asia/Kolkata' AS ts,
open, high, low, close, volume
FROM market_data
WHERE symbol = ?
AND exchange = ?
AND timestamp >= EXTRACT(EPOCH FROM TIMESTAMP '2024-01-01')
ORDER BY timestamp
""", ["SBIN", "NSE"]).fetchdf()
con.close()
df["ts"] = pd.to_datetime(df["ts"]).dt.tz_localize(None)
df = df.set_index("ts")
print(df.tail())
Historify 的完整用法、多标的联接,以及与 NSE 09:15 IST 对齐的重采样,参见 references/duckdb-historify.md。
指标规则(与 vectorbt-backtesting-skills 一致)
- TA-Lib 用于标准指标集:
EMA、SMA、RSI、MACD、ATR、BBANDS、ADX、STDDEV、MOM。 openalgo.ta用于:supertrend、donchian、ichimoku、hma、kama、alma、zlema、vwma。openalgo.ta用于信号清理:exrem、crossover、crossunder、flip——调用exrem前始终先执行.fillna(False)。
切勿使用 VectorBT 内置指标(如 vbt.MA.run)。
辅助脚本(scripts/)
| 文件 | 用途 |
|---|---|
openalgo_client.py | get_client() — 使用 find_dotenv() 从 .env 引导初始化 |
symbols.py | resolve_symbol、build_fut_symbol、build_opt_symbol、parse_opt_symbol |
lotsize.py | load_lot_sizes()、nearest_lot(symbol, quantity)、validate_fno_lot() |
orders.py | preview_order、place_with_confirmation、retry_on_rate_limit |
execution.py | LimitChaser(跟随盘口触价)、TWAPSlicer、IcebergSlicer、OrderManager |
option_analytics.py | atm_strike、pcr、max_pain、iv_skew、payoff_diagram |
scanner.py | Scanner — 基于 multiquotes 和 history 的多标的筛选流水线 |
stream.py | subscribe() 上下文管理器 — 身份验证、心跳、自动重连 |
plotting.py | candlestick_no_gaps、oi_histogram、heatmap、depth_ladder |
duckdb_data.py | 从 Historify 加载 load_ohlcv(symbol, ...)、批量拉取多个标的数据、重采样 |
fees.py | 印度市场成本模型(股票 / F&O / 日内 / 交割) |
ta_helpers.py | 便捷封装 — 组合 TA-Lib 和 openalgo.ta |
trade_logger.py | 持久化 CSV/SQLite 交易日志 |
示例目录(examples/)
| 文件夹 | 覆盖内容 |
|---|---|
01_execution/ | 股票、ATM 跨式组合、铁鹰式组合、篮子再平衡、智能订单规模调整、Supertrend 实时策略、GTT OCO |
02_scanners/ | 涨幅榜 / 跌幅榜、突破、RSI 超卖、成交量激增、OI 变化、盘前跳空 |
03_visualization/ | 行业热力图、年初至今热力图、CAGR 热力图、季节性、OI 直方图、PCR 仪表板 |
04_backtesting/ | EMA 交叉、Supertrend、开盘区间突破、多标的筛选器回测 |
05_charting/ | 带指标的蜡烛图、期权链 OI 图表、最大痛点、IV 微笑、深度阶梯图 |
06_streaming/ | LTP、报价、深度(20 档)、回调路由器、流数据 → Telegram 提醒、重连循环 |
07_execution_algos/ | 限价单追单器、TWAP 切片器、通过 splitorder 执行冰山单、基于时间的撤单、基于价格的撤单并替换、有条件的括号订单 |
参考文件(references/)
| 需求 | 文件 |
|---|---|
| 下单 / 修改 / 撤单 + GTT | order-management.md |
| 订单状态和未平仓头寸 | order-information.md |
| 报价、深度、历史数据、周期 | market-data.md |
| 标的、搜索、到期日、合约 | symbol-services.md |
| 期权链、Greeks、合成期货、ATM/ITM/OTM 偏移 | options-services.md |
| 资金、保证金、账簿、持仓 | account-services.md |
| 假日、交易时间、假日检查 | market-calendar.md |
| 沙盒 / 分析器模式 | analyzer-services.md |
| WebSocket 协议、模式、depth_level、verbose | websocket-streaming.md |
| Telegram + WhatsApp 提醒 | alerts.md |
openalgo.ta 完整参考 | indicators.md |
| 自定义限价单执行算法(追单器、TWAP、冰山单) | execution-algos.md |
| 直接使用 DuckDB 访问 Historify 市场数据 | duckdb-historify.md |
| 股票 / 期货 / 期权标的语法 + 指数列表 | symbol-format.md |
| F&O 合约乘数(2026 年 4 月 / 5 月 / 6 月 + 更新方法) | lot-sizes.md |
| 常量(交易所、产品、价格类型、操作) | order-constants.md |
| 速率限制和重试指南 | rate-limits.md |
| 常见多步骤操作方案 | common-workflows.md |
| 错误模式和故障排查 | error-codes.md |
如何选择实盘模式或分析模式
status = client.analyzerstatus()["data"]
if status["analyze_mode"]:
print(f"[ANALYZER] simulated mode — orders will not reach broker. logs: {status['total_logs']}")
else:
print("[LIVE] orders will execute on the broker")
开发新策略时:client.analyzertoggle(mode=True)。用户满意后:先征求用户明确确认是否开始实盘,然后再运行 client.analyzertoggle(mode=False)。
输出编码规则
- 生成的代码或日志输出中绝不使用表情符号。仅使用纯 ASCII 字符。
- Plotly 图表使用
template="plotly_dark",K 线图使用xaxis_type="category",以跳过周末间隔。 - 交易日志 / 扫描结果写入 CSV,文件名带日期,并保存在对应操作的工作区文件夹中。
- 删除
Asia/Kolkata时区后,所有日期时间索引均为无时区状态(遵循 vectorbt 技能的约定,以确保数据帧往返转换顺畅)。