查询和控制 Raptor 量化机器人实盘数据。当用户提到查看实盘数据、查看实盘表格、查看实盘日志、查看机器人状态、查看持仓、查看资产、查看净值、查看杠杆、查看成交记录、启动或停止机器人、巡检实盘、快速巡检实盘、巡检bnbyb跨所、巡检byb本所,以及 Raptor/量化机器人相关任何查询时使用。需要配置 RAPTOR_BASE_URL 和 RAPTOR_API_TOKEN。
Install
npx skillscat add cfansimon/raptor-admin-skill Install via the SkillsCat registry.
raptor-admin
通过 MCP 接口访问 Raptor 量化机器人平台。完整接口文档见 {baseDir}/references/api.md。
配置
Token 和 base URL 从配置读取:skills.entries.raptor-admin.env
# 从配置文件自动注入
TOKEN=$RAPTOR_API_TOKEN
BASE=$RAPTOR_BASE_URL⚠️ 当前 token 仅有 robot:read 权限,无法执行启停操作(robot:ctrl)。
请求模板
# 普通接口
curl -s -X POST "$BASE/api/mcp/<endpoint>" \
-H "access-token: $TOKEN" \
-H "Content-Type: application/json" \
-d '<body>'
# WebSocket 转发接口(需 ?sid={server_id})
curl -s -X POST "$BASE/api/mcp/<robot_ws_*>?sid={server_id}" \
-H "access-token: $TOKEN" \
-H "Content-Type: application/json" \
-d '<body>'响应格式:{"code": "SUCCESS"/"FAIL"/"AUTH_ERR"/"RATE_LIMIT", "data": ..., "msg": null}
接口速查
| 用途 | endpoint | sid 参数 | 所需权限 |
|---|---|---|---|
| 分组列表 | robot_group_list |
否 | robot:read |
| 机器人列表 | robot_list |
否 | robot:read |
| 机器人详情(含策略/表定义) | robot_details |
否 | robot:read |
| 指标历史 | robot_metric_list |
否 | robot:read |
| 服务器列表 | server_list |
否 | robot:read |
| 运行日志 | robot_ws_log |
✅ | robot:read |
| 表格数据(持仓/资产等) | robot_ws_table | ✅ | robot:read |
| 服务器系统信息 | robot_ws_sysinfo | ✅ | robot:read |
| 启动/停止机器人 | robot_ws_ctrl | ✅ | robot:ctrl |
详细请求体和响应结构见 {baseDir}/references/api.md。
巡检工作流
当用户说「巡检实盘」「快速巡检」「完整巡检」等时,不要直接执行,而是展示选择菜单,让用户回复数字。
选择菜单
⚠️ 重要: 完整巡检(选项3-7)已包含快速巡检数据,当用户选择"全部"或回复多个选项时,自动忽略选项1和2,无需重复请求。
🦖 巡检实盘
1. 快速巡检CEX
2. 快速巡检DEX
3. 完整巡检bnbyb跨所
4. 完整巡检byb本所
5. 完整巡检byblighter跨所
6. 完整巡检edgexlighter跨所
7. 完整巡检bnlighter跨所
请回复数字:1 - 7用户回复数字后,按以下对应关系执行:
| 数字 | 巡检类型 | 执行脚本 |
|---|---|---|
| 1 | 快速巡检CEX | python3 {baseDir}/scripts/inspect_quick_cex.py |
| 2 | 快速巡检DEX | python3 {baseDir}/scripts/inspect_quick_dex.py |
| 3 | 完整巡检bnbyb跨所 | python3 {baseDir}/scripts/inspect_bnbyb.py |
| 4 | 完整巡检byb本所 | python3 {baseDir}/scripts/inspect_byb.py |
| 5 | 完整巡检byblighter跨所 | python3 {baseDir}/scripts/inspect_byblighter.py |
| 6 | 完整巡检edgexlighter跨所 | python3 {baseDir}/scripts/inspect_edgexlighter.py |
| 7 | 完整巡检bnlighter跨所 | python3 {baseDir}/scripts/inspect_bnlighter.py |
快速巡检CEX
| 触发词 | 执行方式 |
|---|---|
| 快速巡检 / 快速巡检cex | 主 session 直接执行 |
快速巡检DEX
| 触发词 | 执行方式 | 流程文件 |
|---|---|---|
| 快速巡检dex / 快速巡检DEX | 主 session 直接 exec 脚本 | {baseDir}/scripts/inspect_quick_dex.py |
快速巡检全部 (CEX + DEX)
| 触发词 | 执行方式 | 流程文件 |
|---|---|---|
| 快速巡检全部 / 巡检全部 | 主 session 直接 exec 脚本 | {baseDir}/scripts/inspect_quick_all.py |
覆盖分组:
- CEX: bnbyb跨市场、byb本所loan、byb-yi.、byb-hl
- DEX: byblighter跨所、edgexlighter跨所、bnlighter跨所
- byblighter跨所 (group_id=30)
- edgexlighter跨所 (group_id=32)
- bnlighter跨所 (group_id=31, 只检查 strategy_id=96)
(待开发)
完整巡检CEX
| 触发词 | 执行方式 | 流程文件 |
|---|---|---|
| 巡检bnbyb跨所 / 巡检bnbyb跨市场 | 主 session 直接 exec 脚本 | {baseDir}/scripts/inspect_bnbyb.py |
| 巡检byb本所 | 主 session 直接 exec 脚本 | {baseDir}/scripts/inspect_byb.py |
完整巡检DEX
| 触发词 | 执行方式 | 流程文件 |
|---|---|---|
| 巡检byblighter跨所 | 主 session 直接 exec 脚本 | {baseDir}/scripts/inspect_byblighter.py |
| 巡检edgexlighter跨所 | 主 session 直接 exec 脚本 | {baseDir}/scripts/inspect_edgexlighter.py |
特殊情况:bnlighter跨所分组
该分组包含多种策略,**只检查策略ID=96(bnlighter跨所正式版)**的机器人:
- 获取机器人列表:
robot_list+group_id=31 - 筛选策略:只保留
strategy_id=96的机器人 - 表格code:
_bls_bnlighter(资产信息)、_pos_bnlighter(仓位信息) - 字段提取:
- 资产信息:字段3=当前总净值, 字段8=净杠杆, 字段24=是否停机
- 仓位信息:字段3=BN货值, 字段4=LI货值, 差异=|BN货值+LI货值|
检查分组仓位
当用户说「检查XXX分组仓位」时(如「检查edgexlighter跨所仓位」):
执行流程:
获取分组ID
- 从本地缓存
groups.json查找分组名称对应的 ID - 文件路径:
{baseDir}/scripts/cache/robot_group.json
- 从本地缓存
判断是否增量检查
- 检查缓存文件
{baseDir}/scripts/cache/last_check_{group_id}.json - 如果存在且检查时间在30分钟内 → 增量检查模式
- 如果不存在或超过30分钟 → 全量检查模式
- 检查缓存文件
获取机器人列表
- 调用
robot_list接口(注意分页,可能有多页) - 筛选
group_id等于目标分组 ID 的机器人 - 保存机器人列表到缓存(用于增量检查时获取完整列表)
- 调用
获取表格数据
- 对每个机器人调用(注意:需要 sid 参数):
robot_ws_table?sid={server_id}获取资产信息表(code:_bls_xxx_um)robot_ws_table?sid={server_id}获取仓位信息表(code:_pos_xxx_um)
- 注意:不同分组的 table code 不同,需从
robot_details获取
- 对每个机器人调用(注意:需要 sid 参数):
提取数据
- 先从 robot_details 获取表格的列定义(columns 字段是逗号分隔的字符串)
- 根据列名动态查找索引
- 资产信息表(动态查找列名):
- 当前总净值 → 查找包含"当前总净值"或"净值"的列
- 净杠杆 → 查找包含"净杠杆"的列
- 是否停机 → 查找包含"停机"的列
- 仓位信息表(动态查找列名):
- 优先取 BTC 那行,没有则取第一行
- 币种 → 查找包含"币种"的列
- ED货值 → 查找包含"货值"且包含"ed"或"ED"的列
- LI货值 → 查找包含"货值"且包含"li"或"LI"的列
简化名称
- 从机器人完整名称中提取关键标识(如编号、特殊标记)
- 格式:
{分组简称}-{简化名称} - 例如:
edgexlighter-01-【04839】-98号637d→edgex-01号
计算差异
- 差异 = |ED货值 + LI货值|
- 差异为0或极小(<1)视为正常
判定异常
- 满足以下任一条件视为异常:
- 是否停机 = 1
- 差异 > 1
- 满足以下任一条件视为异常:
缓存结果
- 保存检查结果到
{baseDir}/scripts/cache/last_check_{group_id}.json - 内容:{timestamp, group_id, abnormal_robot_ids, all_robots_summary}
- 保存检查结果到
增量检查模式说明:
- 只重新检查上次异常的机器人
- 如果异常机器人已恢复正常,在报告中标注为「已恢复」
- 如果发现新的异常机器人,也一并报告
输出格式(固化要求):
当用户要求「用表格展示」或「每个实盘一行全部展示到表格里」时,必须使用以下格式:
| 名称 | 实盘状态 | 利润率 | 净值 | 净杠杆 | 停机 | 币种 | ED货值 | LI货值 | 差异 | 状态 |
|------|----------|--------|------|--------|------|------|--------|--------|------|------|
| edgex-01号 | STARTED | -8.77% | 16726 | -0.43 | 0 | BTCUSD | -3301.48 | 3301.48 | 0.00 | ✅ |字段说明:
- 名称:简化名称,如
edgex-01号,提取自完整名称中的编号 - 实盘状态:来自
robot_list接口的status字段(STARTED/STOPPED) - 利润率:(当前总净值 - 初始净值) / 初始净值 × 100%,来自
metric.init_bls和metric.total_bls - 净值:当前总净值(资产信息表字段3)
- 净杠杆:净杠杆(资产信息表字段8)
- 停机:是否停机(资产信息表字段24,1=停机,0=运行)
- 停止:机器人状态非 STARTED(来自 robot_list 接口的 status 字段)
状态定义:
- ✅ 正常(差异≤1 且 停机=0 且 状态=STARTED)
- ⚠️ 异常(仓位差异超过阈值 且 停机=0 且 状态=STARTED)
仓位差异阈值:
- bnbyb跨所:差异 > 1
- 其他策略(byb本所、byblighter、bnlighter):差异 > 200
- edgexlighter跨所:差异 > 250
- 🚫 停机(停机=1)
- 🛑 停止(status != STARTED)
输出要求:
- 所有字段必须完整展示,不能省略任何一列
- 每个机器人一行,全部展示(不过滤)
- 最后必须包含汇总行:
总计: X 台 | 异常: Y 台 | 停机: Z 台 | 停止: W 台 - 必须展示 API 统计:请求次数、平均延迟、异常说明(如有)
快速巡检特殊说明:
- 快速巡检不包含仓位数据,因此不进行仓位差异异常检查
- 快速巡检需要检查:是否停机、指标延迟异常、滑点异常、利润告警
- 快速巡检不检查:仓位差异异常
检查多空
当用户发送类似以下格式的日志并说"检查多空"时:
[byblighter11号-68号01b9-70] 2026-03-01T09:18:21.642 WARN stderr BTCUSDT bybit_spot多空SELL, 平仓量0.00127276, 货值84.97执行流程:
解析日志
- 提取机器人名称 → 从 robot_list 获取 robot_id 和 server_id
- 日志时间(UTC)→ 转 Unix timestamp(毫秒)
- 多空阈值:从
robot_details接口获取多空阈值参数
查询日志
- 先尝试用
end_ts过滤时间范围 - 注意:有些机器人不支持
end_ts过滤,传了仍返回最新日志- 症状:日志时间不是期望的时间范围
- 解决:往前翻页,每页 50 条,最多翻 50 页
- 如果 50 页(2500条)仍未到达目标时间范围 → 放弃并报告原因
- 先尝试用
找到平衡点
- 往前翻日志,找到两边仓位相等的记录(在多空阈值范围内)
分析原因
- 普通情况:从平衡点开始分析,看后续哪些交易导致仓位偏移
- 特殊情况:如果实盘刚重启过(检查 last_start_date)→ 确认是重启导致,无需深究
多空阈值
- 两家交易所价格精度不同,仓位不会严格相等
- 在
robot_details接口返回的多空阈值范围内视为"相等"
快速巡检
exec(command="python3 /home/ec2-user/.hermes/skills/raptor-admin/scripts/inspect_quick.py", timeout=30)脚本完成后读取 /tmp/quick_inspect_result.json,主 session 直接总结回复,不写 Notion。
完整巡检(bnbyb / byb本所)
脚本纯数据采集,输出原始 JSON,不含 Telegram/Notion 操作。
执行命令:
# bnbyb跨市场(约1分钟,12台串行)
exec(command="python3 /home/ec2-user/.hermes/skills/raptor-admin/scripts/inspect_bnbyb.py", timeout=300)
# byb本所(约5分钟,58台,3组并发+组内串行)
exec(command="python3 /home/ec2-user/.hermes/skills/raptor-admin/scripts/inspect_byb.py", timeout=1800)
# byblighter跨所(约30秒,25台)
exec(command="python3 /home/ec2-user/.hermes/skills/raptor-admin/scripts/inspect_byblighter.py", timeout=60)脚本完成后,主 session 负责:
- 读取 JSON(
/tmp/bnbyb_inspect_result.json或/tmp/byb_inspect_result.json) - 根据
robots[]数据自行分析,撰写巡检摘要 - 用
message工具将摘要发送 Telegram - 构建 Notion blocks,调 Notion API PATCH 写入对应页面
- Notion key:
skills.entries.notion.apiKey - bnbyb page_id:
b9a5b8e9-187a-82be-b194-818c00fb64ce - byb本所 page_id:
3145b8e9-187a-8126-a20f-e6b6ebb176e4 - Notion 写入格式参考历史记录(heading_2 标题 → table → heading_3 结论 → callout → 异常/观察 bullets → divider)
- Notion key:
⚠️ 不使用 subagent(subagent 会幻觉捏造结果)。
利润告警阈值(2026-03-11 新规则):
- 利润率(原公式):最新净值 / 初始净值 - 1 × 100%
- 启动利润率(新公式):最新净值 / 启动时净值 - 1 × 100%
- 告警条件:启动利润率 < -0.5%(即启动后亏损超过千分之五),告警条目带 ❌ 标记
- 数据来源:使用
robot_list接口的last_start_metric.total_bls作为启动时净值
指标延迟异常:
- 所有策略:指标延迟 >15分钟 标为异常
滑点告警阈值:
- bnbyb跨所:< -0.0005
- byb本所系列:< -0.0008 (byb-hl, byb-yi., byb本所loan)
- byblighter跨所:< -0.00015
- edgexlighter跨所:< -0.00015
- bnlighter跨所:< -0.00015
滑点数据换算规则:
- robot_list API (metric字段) 返回的滑点值需要 ÷10000
- robot_ws_table 表格返回的滑点值是原始数据,无需处理
完整巡检结果写入 Notion:
- bnbyb跨市场巡检记录:page_id
b9a5b8e9-187a-82be-b194-818c00fb64ce - byb本所巡检记录:page_id
3145b8e9-187a-8126-a20f-e6b6ebb176e4
缓存数据(无需重复请求)
- 分组列表:已缓存于
{baseDir}/scripts/cache/robot_group.json,直接读取,无需调robot_group_list - 策略表格结构:已缓存于
{baseDir}/scripts/cache/strategy-tables-cache.json(当日有效),byb本所巡检优先读缓存,过期才调robot_details
典型工作流
1. 读 scripts/cache/robot_group.json → 确定目标分组 id(已缓存,无需请求)
2. robot_list → 找机器人 id 和 server_id
3. robot_details → 获取 strategy_tables(含 code 和 columns)
4. robot_ws_table?sid=xxx → 查实盘表格(持仓/资产/成交等)
5. robot_ws_log?sid=xxx → 查实时日志
6. robot_ws_sysinfo?sid=xxx→ 查服务器资源关键注意事项
- WebSocket 接口(
robot_ws_*)必须带?sid={server_id},否则返回ws session not found metric字段是 JSON 字符串,需要json.loads()解析- 表格数据
data.lines是 CSV 数组,列名由strategy_tables[].columns定义,按顺序解析 server_status=0表示服务器离线,robot_ws_*接口必然失败- 日志每条格式为
[时间, 级别, 内容]
BYB本所策略特殊逻辑(仅限 byb本所【拆户】策略)
现货初始资产 (INIT_ASSETS)
现货初始资产 (INIT_ASSETS)
获取方式:从 robot_details 接口的 env_content 字段解析:
INIT_ASSETS=BTC:4,ETH:40,USDT:0用途:计算真实交易仓位
- 日志中的现货仓位包含初始仓位
- 真实交易仓位 = 日志仓位 - INIT_ASSETS
货值计算
公式:货值 = 仓位 × 中间价
中间价获取:从信号计算表 (_signal_state_byb_umspot) 的 ask + bid 字段计算:
中间价 = (ask + bid) / 2多空判断:
- 货值差 = |合约货值 - 现货货值|
- 若货值差 >
多空忽略金额(config第31个字段),则触发多空信号
常用查询示例
查看运行中机器人列表
curl -s -X POST "$BASE/api/mcp/robot_list" \
-H "access-token: $TOKEN" \
-H "Content-Type: application/json" \
-d '{"status": "STARTED", "page_size": 50}'查机器人详情(获取实盘参数)
接口:POST /api/mcp/robot_details
请求体:
{
"id": <robot_id>
}注意:不传 config_hash 参数,获取完整配置。
响应关键字段:
strategy.config_columns:表头,多个字段用逗号分隔robot.config_content:数据,多个值用逗号分隔
解析流程:
- 调用
robot_details获取详情 config_columns是表头(如:"名字,策略ID,杠杆,最大持仓,多空阈值,...")config_content是数据(如:"mybot,96,20,1000,0.001,...")- 按逗号分隔后,按索引匹配:表头第N列 = 数据第N列
示例(获取"多空阈值"参数):
config_columns = "名字,策略ID,杠杆,最大持仓,多空阈值,多空忽略金额"
config_content = "mybot,96,20,1000,0.001,100"
# 找"多空阈值"在第5列(索引4)
# 对应 config_content 第5个值 = "0.001"查资产信息表
# 1. 先拿 server_id 和表的 code
# robot_details → strategy_tables[].code(资产信息表一般叫 _bls_xxx)
# 2. 查表格
curl -s -X POST "$BASE/api/mcp/robot_ws_table?sid={server_id}" \
-H "access-token: $TOKEN" \
-H "Content-Type: application/json" \
-d '{"id": <robot_id>, "code": "<table_code>"}'