openalgo について
openalgoは、インド市場向けのOpenAlgo Python SDKを扱うスキルです。注文執行、マーケットデータ、スキャナー、チャート、バックテスト、リアルタイム配信を網羅し、アナライザーモードや注文確認、APIキー管理を含む手順とサンプルを提供します。
主な機能
- 01株式・デリバティブの注文執行
- 02相場情報の取得と複数銘柄スキャン
- 03オプション分析とチャート表示
- 04vectorbtを使ったバックテスト例
- 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 は、ブローカーに依存しないセルフホスト可能なトレーディングプラットフォームです。1 つの Python
SDK(pip install openalgo)で、統一された REST + WebSocket インターフェースを介して、30 社以上のインドのブローカーに接続できます。このスキルでは、SDK の全機能に加え、トレーダーからよく求められる 7 つの主要なワークフロー向けに、実運用可能なヘルパーとサンプルを網羅しています。
- 注文執行 — 株式、F&O、オフセット指定のオプション、マルチレッグ、バスケット、分割、スマート
- カスタム執行アルゴリズム — 指値注文の追跡、自動変更、時間・価格をトリガーとするキャンセル
- スキャナー —
multiquotes+ 履歴 + フィルターパイプライン - 可視化 — ヒートマップ、OI チャート、季節性、値上がり銘柄/値下がり銘柄、PCR ダッシュボード
- バックテスト — 現実的なインドの手数料と NIFTY ベンチマークを用いた vectorbt 連携
- チャート作成 — ローソク足(カテゴリー 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 はブローカーに接続せずに応答をシミュレートします。戦略をレビューした後にのみオフにしてください。 - ライブ注文の前に確認してください。 読みやすいプレビュー(銘柄、売買区分、数量、商品、価格、想定元本)を表示し、現在のセッションでの自動執行をユーザーが明示的に許可していない限り、ユーザーの確認を待ってください。
MARKETよりLIMITを優先してください。 まず銘柄の気配値を取得し、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 文字の 16 進数キーをリテラルで含むスクリプトは拒否してください。 - マルチレッグ執行では、ライブ実行時にレッグごとの明示的な確認が必要です。
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 | "" — デルタ/ガンマ/シータ/ベガ/ローおよび 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(および 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.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、Quote、板(20 レベル)、コールバックルーター、ストリームから Telegram アラートへの連携、再接続ループ |
07_execution_algos/ | 指値注文チェイサー、TWAP スライサー、splitorder によるアイスバーグ注文、時間ベースのキャンセル、価格ベースのキャンセルと置換、条件付きブラケット |
リファレンスファイル(references/)
| 用途 | ファイル |
|---|---|
| 注文の発注/変更/キャンセル+GTT | order-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、verbose | websocket-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 スキルの規約に合わせています)。