live-feed について
live-feedは、OpenAlgo WebSocketストリーミングを使ったリアルタイム指標フィードのスクリプトを作成するスキルです。最終取引価格から板情報や複数銘柄の表示まで、複数のモードに対応します。
主な機能
- 01LTP・quote・depth・multiフィードの設定
- 02ローリングティックバッファの維持
- 03ストリーミングデータでの指標計算
- 04板情報と注文不均衡の表示
- 05購読解除とWebSocketの後処理
活用シーン
- 01銘柄のリアルタイム指標の追跡
- 02強気・弱気の色分けによる気配値の確認
- 03売買スプレッドと注文不均衡の分析
- 04複数銘柄のウォッチリスト監視
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ marketcalls/ openalgo-indicator-skills --skill live-feedインストール後、Claude Code で/live-feedを入力して読み込まれたか確認します。
詳細
OpenAlgo WebSocket ストリーミングを使用して、リアルタイムのインジケーターフィードを作成します。
引数
$ARGUMENTS を次の形式で解析します:symbol exchange mode
$0= symbol(例:SBIN、RELIANCE、NIFTY)。デフォルト:SBIN$1= exchange(例:NSE、NSE_INDEX)。デフォルト:NSE$2= mode(例:ltp、quote、depth、multi)。デフォルト:quote
引数がない場合は、symbol と必要なデータをユーザーに尋ねます。
手順
- indicator-expert のルールを読みます。特に以下を確認してください:
rules/websocket-feeds.md— WebSocket 接続と購読rules/data-fetching.md— バッファ初期化用の過去データ
charts/live/ディレクトリを(必要に応じて)作成します{symbol}_live_feed.pyを作成しますrules/assets/live_feed/template.pyのテンプレートを使用します
フィードの種類
ltp — 最終取引価格 + インジケーター
- LTP フィードを購読します
- ローリングバッファ(直近 200 ティック)を維持します
- バッファ上で EMA、RSI を計算します
- リアルタイムのインジケーター値を出力します
quote — フルクオート + インジケーター
- クオートフィードを購読します
- OHLC + LTP + 出来高を表示します
- 終値バッファ上でインジケーターを計算します
- 強気/弱気を色分けして表示します
depth — マーケットデプス分析
- Depth フィードを購読します
- L5 の買い板/売り板を表示します
- 買値と売値のスプレッド、注文の不均衡を計算します
- 買い数量と売り数量の合計を表示します
multi — マルチシンボルフィード
- 複数の symbol を購読します
- LTP と主要なインジケーターを含むウォッチリストテーブルを表示します
- 表示を自動更新します
スクリプト構成
"""
Real-Time Indicator Feed for {SYMBOL}
Mode: {mode}
"""
import os
import time
import numpy as np
from datetime import datetime, timedelta
from dotenv import find_dotenv, load_dotenv
from openalgo import api, ta
load_dotenv(find_dotenv(), override=False)
SYMBOL = "{symbol}"
EXCHANGE = "{exchange}"
client = api(
api_key=os.getenv("OPENALGO_API_KEY"),
host=os.getenv("OPENALGO_HOST", "http://127.0.0.1:5000"),
verbose=1,
)
# Pre-fetch historical data for buffer initialization
df = client.history(
symbol=SYMBOL, exchange=EXCHANGE, interval="1m",
start_date=(datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d"),
end_date=datetime.now().strftime("%Y-%m-%d"),
)
close_buffer = list(df["close"].values[-200:])
instruments = [{"exchange": EXCHANGE, "symbol": SYMBOL}]
def on_data(data):
ltp = data["data"].get("ltp")
if ltp is None:
return
close_buffer.append(float(ltp))
if len(close_buffer) > 200:
close_buffer.pop(0)
if len(close_buffer) >= 20:
arr = np.array(close_buffer, dtype=np.float64)
ema_val = ta.ema(arr, 20)[-1]
rsi_val = ta.rsi(arr, 14)[-1] if len(arr) >= 15 else float("nan")
timestamp = datetime.now().strftime("%H:%M:%S")
print(f"[{timestamp}] {SYMBOL} LTP:{ltp:>10.2f} | "
f"EMA(20):{ema_val:>10.2f} | RSI(14):{rsi_val:>6.2f}")
# Connect and subscribe
client.connect()
client.subscribe_ltp(instruments, on_data_received=on_data)
print(f"Streaming {SYMBOL} on {EXCHANGE} — Press Ctrl+C to stop")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("Stopping feed...")
client.unsubscribe_ltp(instruments)
client.disconnect()
クリーンアップ
スクリプトは次の処理を行う必要があります:
- Ctrl+C を適切に処理します
- すべてのフィードの購読を解除します
- WebSocket を切断します
- セッション時間と処理したバー数の概要を出力します
詳細ログのレベル
詳細ログのオプションについてユーザーに知らせます:
verbose=0:サイレントモード(エラーのみ)verbose=1:接続と購読のログverbose=2:すべてのデータ更新(デバッグモード)
使用例
/live-feed SBIN NSE ltp
/live-feed NIFTY NSE_INDEX quote
/live-feed SBIN NSE depth
/live-feed multi NSE
コメント
Markdown 対応