关于 live-feed
live-feed 是用于通过 OpenAlgo WebSocket 流创建实时指标行情脚本的 Agent 技能。它支持从最新成交价更新到市场深度分析和多标的展示等模式。
主要功能
- 01配置 LTP、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 以及所需的数据。
说明
- 阅读指标专家规则,特别是:
rules/websocket-feeds.md— WebSocket 连接和订阅rules/data-fetching.md— 用于初始化缓冲区的历史数据
- 按需创建
charts/live/目录 - 创建
{symbol}_live_feed.py - 使用
rules/assets/live_feed/template.py中的模板
数据流类型
ltp — 最新成交价 + 指标
- 订阅 LTP 数据流
- 维护滚动缓冲区(最近 200 个 tick)
- 在缓冲区上计算 EMA、RSI
- 实时输出指标值
quote — 完整报价 + 指标
- 订阅 Quote 数据流
- 显示 OHLC + LTP + 成交量
- 在收盘价缓冲区上计算指标
- 使用颜色区分输出(看涨/看跌)
depth — 市场深度分析
- 订阅 Depth 数据流
- 显示 L5 买卖盘
- 计算买卖价差、订单失衡
- 显示买入总量与卖出总量
multi — 多标的数据流
- 订阅多个标的
- 显示包含 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 连接
- 输出会话时长和处理的 K 线数量摘要
详细程度
告知用户可用的详细程度选项:
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