mcpField
O
openalgo

openalgo

github.com/marketcallsその他9223 回インストール23 週間前に更新
リポジトリ

openalgo について

openalgoは、インド市場向けのOpenAlgo Python SDKを扱うスキルです。注文執行、マーケットデータ、スキャナー、チャート、バックテスト、リアルタイム配信を網羅し、アナライザーモードや注文確認、APIキー管理を含む手順とサンプルを提供します。

主な機能

  1. 01株式・デリバティブの注文執行
  2. 02相場情報の取得と複数銘柄スキャン
  3. 03オプション分析とチャート表示
  4. 04vectorbtを使ったバックテスト例
  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 は、ブローカーに依存しないセルフホスト可能なトレーディングプラットフォームです。1 つの Python SDK(pip install openalgo)で、統一された REST + WebSocket インターフェースを介して、30 社以上のインドのブローカーに接続できます。このスキルでは、SDK の全機能に加え、トレーダーからよく求められる 7 つの主要なワークフロー向けに、実運用可能なヘルパーとサンプルを網羅しています。

  1. 注文執行 — 株式、F&O、オフセット指定のオプション、マルチレッグ、バスケット、分割、スマート
  2. カスタム執行アルゴリズム — 指値注文の追跡、自動変更、時間・価格をトリガーとするキャンセル
  3. スキャナー — multiquotes + 履歴 + フィルターパイプライン
  4. 可視化 — ヒートマップ、OI チャート、季節性、値上がり銘柄/値下がり銘柄、PCR ダッシュボード
  5. バックテスト — 現実的なインドの手数料と NIFTY ベンチマークを用いた vectorbt 連携
  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. MARKET より LIMIT を優先してください。 まず銘柄の気配値を取得し、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 文字の 16 進数キーをリテラルで含むスクリプトは拒否してください。
  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"" — デルタ/ガンマ/シータ/ベガ/ローおよび 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(および unsubscribe の各バリアント)""
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 の docstring には、すべての kwarg が記載されているわけではありません。パラメーターが見つからない場合や不明確な場合は、エンドポイントごとの REST ドキュメント /Users/openalgo/test-zerodha/openalgo/docs/api/<group>/<endpoint>.md を参照してください。このツリーにはすべてのパラメーターが記載されています。

クイックテンプレート — プレビューとアナライザーの安全対策を使った注文発注

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.pyHistorify からの load_ohlcv(symbol, ...)、複数銘柄の一括取得、リサンプリング
fees.pyインド市場のコストモデル(株式/F&O/日中取引/受け渡し)
ta_helpers.py使いやすいラッパー — TA-Lib と openalgo.ta を組み合わせます
trade_logger.pyCSV/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、Quote、板(20 レベル)、コールバックルーター、ストリームから Telegram アラートへの連携、再接続ループ
07_execution_algos/指値注文チェイサー、TWAP スライサー、splitorder によるアイスバーグ注文、時間ベースのキャンセル、価格ベースのキャンセルと置換、条件付きブラケット

リファレンスファイル(references/)

用途ファイル
注文の発注/変更/キャンセル+GTTorder-management.md
注文ステータスと保有ポジションorder-information.md
気配値、板、履歴、時間間隔market-data.md
銘柄、検索、満期、金融商品symbol-services.md
オプションチェーン、グリークス、合成先物、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
Historify の市場データへの DuckDB による直接アクセス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

Live モードと Analyzer モードの選び方

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"を使用し、週末の空白を省くため、ローソク足ではxaxis_type="category"を使用してください。
  • 取引ジャーナル/スキャン結果は、アクションのワークスペースフォルダー内に、日付入りのファイル名で CSV に書き込んでください。
  • すべての日時インデックスは、Asia/Kolkataを削除した後、タイムゾーン情報なしにしてください(データフレームを問題なく往復できるようにするため、vectorbt スキルの規約に合わせています)。

コメント