mcpField
O
openalgo

openalgo

github.com/marketcalls其他9223 次安装23 周前更新
代码仓库

关于 openalgo

openalgo 是面向印度市场交易者的 OpenAlgo Python SDK 使用技能,涵盖交易执行、行情数据、扫描、图表、回测和实时流。内容还包括辅助脚本与示例,并强调模拟分析、订单确认和 API 密钥管理等安全流程。

主要功能

  1. 01股票及衍生品订单执行
  2. 02行情查询与多标的扫描
  3. 03期权分析和图表可视化
  4. 04基于 vectorbt 的回测示例
  5. 05WebSocket 实时行情订阅
  6. 06订单安全流程与辅助脚本

适用场景

  1. 01构建印度市场的股票或期权交易脚本
  2. 02筛选多个标的并查看行情数据
  3. 03订阅实时行情并处理断线重连
  4. 04用历史数据和指标测试策略

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/marketcalls/openalgo-skills --skill openalgo

安装后在 Claude Code 中输入/openalgo确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

assets/
LotSize.csv
examples/01_execution/
basket_rebalance.py
iron_condor.py
order_with_sl_target_workflow.py
place_atm_straddle.py
place_equity_order.py
supertrend_live.py
examples/02_scanners/
breakout_scanner.py
nifty50_gainers_losers.py
pre_open_gap_scanner.py
rsi_oversold_scanner.py
volume_surge_scanner.py
examples/03_visualization/
oi_change_histogram.py
pcr_dashboard.py
sector_heatmap.py
ytd_heatmap.py
examples/04_backtesting/
ema_crossover_backtest.py
multi_symbol_screener_backtest.py
supertrend_backtest.py
examples/05_charting/
candlestick_with_indicators.py
market_depth_ladder.py
max_pain_chart.py
option_chain_oi_chart.py
examples/06_streaming/
depth_stream_20level.py
ltp_stream_basic.py
reconnect_loop_template.py
stream_with_telegram_alert.py
examples/07_execution_algos/
cancel_all_with_alert.py
conditional_bracket.py
iceberg_slicer.py

详细介绍

OpenAlgo — 印度市场交易技能

OpenAlgo 是一个与券商无关、可自托管的交易平台。一个 Python SDK(pip install openalgo)通过统一的 REST + WebSocket 接口连接 30 多家印度券商。此技能涵盖完整的 SDK 功能,以及面向交易者常见的七种核心工作流的生产就绪辅助工具和示例:

  1. 订单执行 — 股票、F&O、按偏移量选择期权、多腿、篮子、拆分、智能
  2. 自定义执行算法 — 限价单追单、自动修改、按时间/价格触发撤单
  3. 扫描器 — multiquotes + 历史数据 + 筛选管道
  4. 可视化 — 热力图、OI 图表、季节性、涨幅榜/跌幅榜、PCR 仪表板
  5. 回测 — vectorbt 胶水代码,采用贴近实际的印度费用、NIFTY 基准
  6. 图表 — 蜡烛图(分类 x 轴,无周末间隔)、深度阶梯、期权链 OI、IV 微笑曲线
  7. 实时流 — 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()

安全规则 — 始终遵守

  1. 先在分析器模式下迭代。 开启 client.analyzertoggle(mode=True),让 SDK 模拟响应而不触达券商。只有在策略经过审查后才关闭。
  2. 实盘下单前先确认。 打印清晰易读的预览(交易标的、方向、数量、产品、价格、名义金额),并等待用户确认;除非用户已明确授权当前会话自动执行。
  3. 默认优先使用 LIMIT,而非 MARKET。 先查询交易标的报价,再以 LTP ± 若干个最小变动价位设置可成交限价单。只有用户明确要求时才使用 MARKET。
  4. 验证 F&O 手数倍数。 加载捆绑的 assets/LotSize.csv(或调用 client.symbol() 获取当前 lotsize),并在下单前拒绝非整数倍的数量。
  5. 名义金额超过 Rs 50,000 时发出警告。 对于 F&O,若价格未知,则使用 lotsize × strike 作为最坏情况估算值。
  6. F&O/商品/货币交易绝不使用 CNC。 这些板块只能使用 MIS(日内)或 NRML(隔夜)。CNC 仅适用于股票交割。
  7. 绝不硬编码 API 密钥。 始终通过 find_dotenv() 从 .env 读取。拒绝包含字面量 64 位十六进制密钥的脚本。
  8. 实盘执行多腿订单时,每条腿都必须明确确认。 optionsmultiorder 和 basketorder 会将各订单分别发送给券商,可能出现部分失败 — 处理 results[] 数组,不要仅相信顶层 status。
  9. 注意速率限制。 订单 API 上限为每秒 10 次(智能订单每秒 2 次),数据 API 上限为每秒 50 次。请使用 scripts/orders.py 中带退避的重试辅助工具,避免紧密循环。
  10. 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=...)""
WebSocketconnect() / 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.pyget_client() — 使用 find_dotenv() 从 .env 引导初始化
symbols.pyresolve_symbol、build_fut_symbol、build_opt_symbol、parse_opt_symbol
lotsize.pyload_lot_sizes()、nearest_lot(symbol, quantity)、validate_fno_lot()
orders.pypreview_order、place_with_confirmation、retry_on_rate_limit
execution.pyLimitChaser(跟随盘口触价)、TWAPSlicer、IcebergSlicer、OrderManager
option_analytics.pyatm_strike、pcr、max_pain、iv_skew、payoff_diagram
scanner.pyScanner — 基于 multiquotes 和 history 的多标的筛选流水线
stream.pysubscribe() 上下文管理器 — 身份验证、心跳、自动重连
plotting.pycandlestick_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/)

需求文件
下单 / 修改 / 撤单 + GTTorder-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、verbosewebsocket-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 技能的约定,以确保数据帧往返转换顺畅)。

评论

支持 Markdown