279 lines
8.8 KiB
Markdown
279 lines
8.8 KiB
Markdown
# MoFin / TDX-Relay 协作文档
|
||
|
||
> 最后更新:2026-06-12
|
||
> 维护人:知微 + 小小莫(xxm)
|
||
> 铁律:任何 relay 相关改动必须先读本文档,改完必须同步更新
|
||
|
||
---
|
||
|
||
## 一、什么是 tdx-relay
|
||
|
||
tdx-relay 是小小莫(xxm)开发的 Windows 端通达信中继程序。
|
||
作用:通过 opentdx 协议直连招商证券 7727 扩展行情服务器,
|
||
为 MoFin 系统提供港股低延迟实时行情。
|
||
|
||
### 为什么需要它
|
||
|
||
原本 MoFin 的港股行情来源是腾讯 API(qt.gtimg.cn),
|
||
存在约 15 分钟延迟,对于盘中决策不够及时。
|
||
tdx-relay 将港股行情延迟从约 15 分钟降到接近实时(1~3 秒)。
|
||
|
||
---
|
||
|
||
## 二、系统架构
|
||
|
||
```
|
||
Windows 端(小小莫负责)
|
||
┌─────────────────────────────────────────┐
|
||
│ tdx-relay 项目 │
|
||
│ │
|
||
│ tdx_client.py │
|
||
│ └─ opentdx MacExtendedClient │
|
||
│ └─ 直连 招商证券 7727 扩展行情服务器 │
|
||
│ → 拉取 17 只港股实时行情 │
|
||
│ │
|
||
│ run_relay.py │
|
||
│ └─ 断线自动重连(5s/15s/30s 三次退避) │
|
||
│ └─ 推送 → POST /api/update/realtime │
|
||
│ │
|
||
│ start_tdx_relay.bat │
|
||
│ └─ 一键启动脚本 │
|
||
└───────────────┬─────────────────────────┘
|
||
│ HTTP POST (JSON)
|
||
▼
|
||
Linux 端(知微负责)
|
||
┌─────────────────────────────────────────┐
|
||
│ MoFin 系统 (web-dashboard) │
|
||
│ │
|
||
│ server.py │
|
||
│ ├─ /api/update/realtime (POST) │
|
||
│ │ ← 接收 tdx-relay 推送的实时行情 │
|
||
│ │ → 更新 portfolio.json + watchlist │
|
||
│ │ → 写入 data_source = "tdx_relay" │
|
||
│ │ │
|
||
│ ├─ /api/relay/status (GET) │
|
||
│ │ ← 查询 relay 状态(在线/离线/时间) │
|
||
│ │ │
|
||
│ price_monitor.py │
|
||
│ └─ relay_active 检测 │
|
||
│ ├─ relay 在线 → 跳过港股腾讯API拉取 │
|
||
│ │ (保留 tdx-relay 的实时价不覆盖) │
|
||
│ └─ relay 掉线 → 回退腾讯 API 兜底 │
|
||
│ │
|
||
│ 数据文件 │
|
||
│ ├─ data/portfolio.json │
|
||
│ │ └─ 每只港股: data_source=txton/tdx │
|
||
│ ├─ data/watchlist.json │
|
||
│ └─ data/relay_state.json (新增) │
|
||
│ └─ online: true/false │
|
||
│ └─ last_ping: 时间戳 │
|
||
└─────────────────────────────────────────┘
|
||
```
|
||
|
||
## 三、职责边界
|
||
|
||
### 小小莫(xxm)— Windows 端
|
||
|
||
负责:
|
||
1. tdx_client.py 的开发维护
|
||
- 直连券商行情服务器的稳定性
|
||
- 港股代码列表的维护(当前 17 只)
|
||
- 行情数据的正确性验证
|
||
2. run_relay.py 的重连机制
|
||
- 断线自动恢复(3 次退避重连)
|
||
- relan 状态上报
|
||
3. 行情推送的稳定性
|
||
- 每 X 秒推送一次实时行情
|
||
- 推送失败的处理
|
||
4. Windows 端部署维护
|
||
- 开机自启动
|
||
- 日志管理
|
||
- 异常告警
|
||
|
||
不负责:
|
||
- MoFin API 的修改(但需要配合 server.py 新增端点)
|
||
- Linux 端 price_monitor 的回退逻辑
|
||
- 持仓分析和策略制定
|
||
|
||
### 知微(zhiwei)— Linux 端(MoFin)
|
||
|
||
负责:
|
||
1. MoFin API 的 relay 兼容
|
||
- /api/update/realtime 端点(已实现)
|
||
- /api/relay/status 端点(待实现)
|
||
- relay_state 持久化(待实现)
|
||
2. price_monitor 的 relay 检测(待实现)
|
||
- relay 在线 → 跳过港股腾讯 API 拉取
|
||
- relay 掉线 → 回退腾讯 API 兜底
|
||
3. tdx-relay 接入后的数据一致性保障
|
||
- 腾讯 API 和 tdx-relay 的数据源标记区分
|
||
- 价格更新不互相覆盖
|
||
4. 行情来源对分析层的透明化
|
||
- 分析层(cron prompt)不需要关心行情来源
|
||
- 直接读 portfolio.json 即可
|
||
- 数据源标记在 data_source 字段中
|
||
|
||
不负责:
|
||
- Windows 端程序的开发和部署
|
||
- 通达信协议的细节
|
||
- 券商行情服务器的维护
|
||
|
||
### 共同维护
|
||
|
||
1. 港股代码列表 — 两边保持一致
|
||
2. 数据格式 — tdx-relay 推送的 JSON 格式与 MoFin 期望的格式
|
||
3. 接口联调 — 新端点上线后的验证
|
||
|
||
---
|
||
|
||
## 四、数据流详解
|
||
|
||
### 正常流程(relay 在线)
|
||
|
||
```
|
||
tdx-relay (Windows)
|
||
│ 每 X 秒推送 {stocks: [{code, price, change_pct, ...}]}
|
||
│ POST → http://192.168.1.246:8899/api/update/realtime
|
||
▼
|
||
server.py 接收
|
||
├─ 更新 portfolio.json(港股 data_source = "tdx_relay")
|
||
├─ 更新 watchlist.json(港股 data_source = "tdx_relay")
|
||
└─ 更新 relay_state.json(online=true, last_ping=now)
|
||
│
|
||
▼
|
||
price_monitor.py(每分钟运行)
|
||
├─ A股 → 腾讯 API(不变)
|
||
├─ 港股 → 检查 relay_state
|
||
│ ├─ relay 在线 → 跳过(保留 tdx-relay 的实时价)
|
||
│ └─ relay 离线(>60秒无推送)→ 回退腾讯 API
|
||
└─ 数据源标记 → 写入 portfolio/watchlist
|
||
```
|
||
|
||
### 异常流程(relay 离线)
|
||
|
||
```
|
||
tdx-relay 断线
|
||
│ 60秒内无推送
|
||
▼
|
||
price_monitor.py 检测到 relay_state.online=false
|
||
│ 或 last_ping > 60秒前
|
||
├─ 港股 → 回退腾讯 API 拉取
|
||
├─ 写入时 data_source = "tencent"
|
||
└─ 记录日志 "relay offline, fallback to tencent"
|
||
|
||
tdx-relay 恢复
|
||
│ 推送到达 /api/update/realtime
|
||
▼
|
||
server.py 接收更新
|
||
├─ 更新 relay_state.json(online=true)
|
||
└─ 正常接收行情
|
||
```
|
||
|
||
---
|
||
|
||
## 五、接口规范
|
||
|
||
### POST /api/update/realtime (已实现)
|
||
|
||
接收 tdx-relay 推送的实时行情。
|
||
|
||
请求格式:
|
||
```json
|
||
{
|
||
"stocks": [
|
||
{
|
||
"code": "00700",
|
||
"price": 467.20,
|
||
"change_pct": 3.09,
|
||
"high": 470.00,
|
||
"low": 460.00,
|
||
"open": 462.00,
|
||
"volume": 15000000
|
||
}
|
||
],
|
||
"source": "tdx_relay"
|
||
}
|
||
```
|
||
|
||
响应:
|
||
```json
|
||
{
|
||
"status": "ok",
|
||
"updated": 15,
|
||
"source": "tdx_relay",
|
||
"timestamp": "2026-06-12T14:30:00"
|
||
}
|
||
```
|
||
|
||
### GET /api/relay/status (待实现)
|
||
|
||
查询 tdx-relay 当前状态。
|
||
|
||
响应:
|
||
```json
|
||
{
|
||
"online": true,
|
||
"source": "tdx_relay",
|
||
"last_ping": "2026-06-12T14:29:55",
|
||
"age_seconds": 5,
|
||
"stocks_count": 15,
|
||
"fallback_active": false
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 六、当前实现状态
|
||
|
||
### 已完成
|
||
- server.py `/api/update/realtime` 端点 ✅(v1.0)
|
||
- portfolio.json 写入 data_source 字段 ✅
|
||
|
||
### 待实现(知微负责)
|
||
1. relay_state.json 持久化 — 记录 relay 在线状态
|
||
2. /api/relay/status GET 端点 — 中继状态查询
|
||
3. price_monitor.py relay_active 检测 — 在线/离线判断
|
||
4. price_monitor 回退逻辑 — relay 离线时用腾讯 API 兜底
|
||
|
||
### 待实现(小小莫负责)
|
||
1. tdx-relay 心跳上报 — 定期推送到 /api/update/realtime
|
||
2. 断线自动重连验证 — Windows 端长期稳定运行
|
||
3. 行情覆盖检查 — 确保 17 只港股全量推送
|
||
|
||
---
|
||
|
||
## 七、港股代码列表(双方保持一致)
|
||
|
||
当前 17 只港股(来自 portfolio.json + watchlist.json):
|
||
|
||
| 代码 | 名称 | 持仓/自选 |
|
||
|------|------|----------|
|
||
| 00700 | 腾讯控股 | 持仓 |
|
||
| 00981 | 中芯国际 | 持仓 |
|
||
| 01211 | 比亚迪股份 | 持仓 |
|
||
| 09988 | 阿里巴巴 | 持仓 |
|
||
| 02202 | 万科企业 | 持仓 |
|
||
| 02388 | 中银香港 | 持仓 |
|
||
| 01478 | 丘钛科技 | 持仓 |
|
||
| 09868 | 小鹏集团 | 自选(已清仓) |
|
||
| 01088 | 中国神华 | 持仓 |
|
||
| 02359 | 药明康德 | 自选 |
|
||
| 01888 | 建滔积层板 | 自选 |
|
||
| 00968 | 信义光能 | 自选 |
|
||
| 01070 | TCL电子 | 自选 |
|
||
| 02318 | 中国平安 | 自选 |
|
||
| 02628 | 中国人寿 | 自选 |
|
||
| 06160 | 百济神州 | 自选(已清仓) |
|
||
| 06869 | 长飞光纤 | 自选 |
|
||
|
||
---
|
||
|
||
## 八、故障处理
|
||
|
||
| 现象 | 可能原因 | 处理方式 |
|
||
|------|---------|---------|
|
||
| relay 显示离线 | Windows 端掉线 | 检查 Windows 端运行状态,双击 start_tdx_relay.bat |
|
||
| relay 在线但数据不更新 | 推送异常 | 查 Windows 端日志,重启 tdx-relay |
|
||
| 港股价格异常 | 数据源错乱 | 检查 data_source 字段,确认 relay 是否覆盖了错误数据 |
|
||
| 港股价格用腾讯旧数据 | relay 离线超过 60s 自动回退 | 正常行为,relay 恢复后自动切回 |
|