feat: 迭代03-05 交易记录接入、行情实时、QMT连接配置、data store 标准化
- R-004 QMT连接配置:多配置管理 + 会话头部快捷切换(03-QMT连接配置) - R-005 WS盘中价格实时更新:服务端中转+缓存+前端轮询(04-WS盘中价格实时更新) - R-006 策略数据 JSON data store 标准化(store.json/market.json/schema.json) - R-007 交易记录接入:当日订单+成交单表合并(委托主行+展开成交明细)、时间段查询(今日/本周/本月+手动起止)、费用计算(佣金费率万m_dCommission+最低5元、印花税卖出万5、过户费双向万0.1) - 架构治理:api 按领域拆分、component 目录、QmtHealthMonitor
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
# 技术实现方案:05-交易记录接入(订单与成交 + 日期导航)
|
||||
|
||||
> 依据:PLAN-006 | 需求:R-007 | 设计约束:技术约束-001/003/004/010、产品约束-007 方向语义
|
||||
|
||||
## 技术选型
|
||||
|
||||
- **数据源**:复用 QmtBridgeRestDataSource(REST 直连,技术约束-003),新增 3 方法;
|
||||
- **服务端 API**:webServer 自开路由(技术约束-004),新增 api/trades.js 领域;
|
||||
- **前端数据流**:服务端中转 + 前端轮询(技术约束-010 思路,复用 market-snapshot 模式);
|
||||
- **UI**:React 组件 + 现有表格风格(LoadState 三态 / 内联样式 / Toast);
|
||||
- **时间段查询**(v3,2026-09-01):RangeSelector 组件(今日/本周/上周快捷 + 手动起止日期),替代单日导航。
|
||||
|
||||
## 架构设计
|
||||
|
||||
### 服务端
|
||||
|
||||
```
|
||||
QmtBridgeRestDataSource.getOrders({code,status}) → GET /trade/orders → 语义化映射 order 列表
|
||||
QmtBridgeRestDataSource.getTrades() → GET /trade/trades → 语义化映射 trade 列表
|
||||
QmtBridgeRestDataSource.getTradingDates({s,e}) → GET /data/calendar/trading_dates → dates[]
|
||||
|
||||
api/trades.js(新增领域):
|
||||
orders → dataSource.getOrders(args)
|
||||
trades → dataSource.getTrades()
|
||||
trading-dates → dataSource.getTradingDates(args)
|
||||
(registerApi 合并 TRADE_METHODS + HANDLERS)
|
||||
```
|
||||
|
||||
**语义化映射(核心)**:
|
||||
|
||||
```
|
||||
order: { orderId, code, name, exchange, direction(48买/49卖), status, orderVolume,
|
||||
tradedVolume, totalVolume, limitPrice, tradedPrice, amount, insertTime }
|
||||
trade: { tradeId, orderId, code, name, exchange, direction, price, volume, amount,
|
||||
commission, tradeTime }
|
||||
```
|
||||
|
||||
**方向判定**:m_nOffsetFlag(48=买入/49=卖出)为主 + m_strOptName 交叉验证(R-007 Q3 闭环)。
|
||||
|
||||
### 客户端(单表合并)
|
||||
|
||||
```
|
||||
TradeRecordsTab(标题 + 时间段同一行 + 单表)
|
||||
├─ RangeSelector:trading-dates → 快捷范围(今日/本周/上周)+ 手动起止日期
|
||||
│ 今日=最近交易日单日(完整互斥时间段);本周=所在自然周周一~周五(不考虑周六日);本月=所在自然月1号~月末
|
||||
├─ 合并逻辑:fetch orders+trades(带 start/end)→ 按 orderId 分组 → 聚合
|
||||
│ 聚合:成交量=Σ、成交均价=加权、成交额=Σ、手续费=Σ
|
||||
├─ OrderRow:委托主行(聚合成交),点击展开/折叠
|
||||
└─ TradeDetailRows:展开的每笔成交明细
|
||||
```
|
||||
|
||||
**合并规则**:
|
||||
- 主行 = 一笔委托(orderId 唯一);
|
||||
- 成交聚合:m_strOrderSysID 匹配的 trades 聚合进主行(加权均价 + 求和);
|
||||
- 无成交(待报/已撤/废单):成交量/均价/金额/手续费显示 —;
|
||||
- 展开:逐笔渲染成交(时间/价/量/额/手续费/成交号)。
|
||||
|
||||
**排序**:委托主行默认按时间降序(最新在前);表头点击排序(时间/代码/方向/状态/委托量/成交量/金额),再次点击切换升/降序。
|
||||
|
||||
**轮询**:仅「今日」范围(最近交易日单日)3-5s 轮询;切换时间段取消轮询、按 range 一次性查询(历史接口就绪后接入 start/end 实际过滤)。
|
||||
|
||||
**时间段查询(v3 定稿)**:
|
||||
- 服务端 orders/trades 端点接收 start/end(透传,QMT Bridge 历史接口就绪后生效);
|
||||
- 前端 RangeSelector:三个快捷按钮 + 两个 date input;
|
||||
- 历史范围(非今日)本期占位「历史数据接口开发中」。
|
||||
|
||||
## 涉及设计约束
|
||||
|
||||
| 约束 | 内容 |
|
||||
|---|---|
|
||||
| 技术约束-001 | 统一数据源抽象:交易数据走 QmtBridgeRestDataSource 适配器 |
|
||||
| 技术约束-003 | 直连 QMT Bridge REST(不经过 MCP) |
|
||||
| 技术约束-004 | webServer 自开路由 /odl/api/*(不占 /api interceptor) |
|
||||
| 技术约束-010 | 服务端中转 + 前端轮询(复用市场模式) |
|
||||
| 产品约束-007 | 方向着色沿用红/绿习惯语义(交易:红买绿卖) |
|
||||
|
||||
## 实现步骤
|
||||
|
||||
1. 文档骨架:PLAN-006 + 迭代 05(本步);
|
||||
2. 数据源:getOrders/getTrades/getTradingDates + 语义化映射;
|
||||
3. 服务端 API:api/trades.js 三端点 + 领域分发;
|
||||
4. 客户端合并逻辑:fetch 两接口 → 分组 → 聚合;
|
||||
5. UI:DateNav + OrderRow + TradeDetailRows + TradeRecordsTab + 排序;
|
||||
6. 构建安装:pnpm run build + 刷新/重启;
|
||||
7. 验收 + 复盘。
|
||||
@@ -0,0 +1,38 @@
|
||||
# 迭代 05 复盘:交易记录接入(订单与成交 + 日期导航)(2026-09-01)
|
||||
|
||||
> 复盘日期:2026-09-01 | 迭代状态:**实现完成,待老师验收确认**
|
||||
> 关联需求:R-007(交易记录接入,范围已定稿)
|
||||
> 关联计划:PLAN-006(计划-交易记录接入.md)
|
||||
|
||||
## 结果
|
||||
|
||||
迭代 05 达成:交易记录 tab 接入当日委托(/trade/orders)+ 当日成交(/trade/trades),单表合并展示(委托主行 + 按 m_strOrderSysID 展开成交明细),日期导航(交易日历驱动,历史接口占位),排序默认降序可手动。
|
||||
|
||||
## 过程事实
|
||||
|
||||
1. **需求定稿(R-007)**:老师指令接入订单与成交 → 技术研究(API 字段全表 / 方向判定澄清 / 数据时效研究 / sample data)→ 范围定稿(当日订单+成交 + 日期导航)→ 展示设计定稿(单表合并 + 排序降序);
|
||||
2. **方向判定闭环**:m_nDirection=48 恒为操作标记(官方 innerApi 字典),真实方向在 m_nOffsetFlag(48买/49卖)+ m_strOptName 交叉验证;
|
||||
3. **数据时效确认**:/trade/orders 与 /trade/trades 仅当日数据(get_trade_detail_data 读客户端缓存),历史查询需老师完善 QMT Bridge 接口;
|
||||
4. **服务端实现**:QmtBridgeRestDataSource 新增 getOrders/getTrades/getTradingDates(语义化映射)+ api/trades.js 领域(orders/trades/trading-dates 端点);
|
||||
5. **客户端实现**:TradeRecordsTab(单表合并 + 排序 + 轮询 4s)+ DateNav(交易日历导航,当日默认,历史占位);
|
||||
6. **验证**:typecheck 通过、构建成功、数据源三方法端到端实测通过(博纳影业卖出 200 股 @6.00,手续费 0.852)、合并逻辑多笔成交场景验证通过(加权均价 6.03);
|
||||
7. **未做**:历史数据查询实现(等老师 QMT Bridge 接口)、本地持久化(Q5 本期不做)、按策略过滤(Q10 后续)。
|
||||
|
||||
## 经验(待沉淀)
|
||||
|
||||
- **方向判定**:大 QMT m_nDirection 恒 48 是操作标记,m_nOffsetFlag 才是方向(48买/49卖)——实现时勿踩坑;
|
||||
- **手续费字段**:m_dCommission 与 m_dComssion(拼写变体)同值,取值优先 m_dCommission;
|
||||
- **前端轮询**:静默刷新不闪 loading(setOrders 直接更新,不置 loading=true);日期切换时清理轮询定时器;
|
||||
- **服务端/客户端加载时机**:服务端改动需宿主重启,客户端 bundle 刷新即载(沿用迭代 03/04 经验)。
|
||||
|
||||
## 遗留/后续
|
||||
|
||||
1. **历史成交接口**:老师完善 QMT Bridge 后,DateNav 历史日期从占位切换为真实查询(trading-dates 已就绪,orders/trades 加日期参数即可);
|
||||
2. **本地持久化**:跨日复盘需按日落盘(Q5),待历史接口就绪后评估;
|
||||
3. **按策略过滤**:Q10 后续迭代(strategy_name 与插件策略体系打通)。
|
||||
|
||||
## 验收状态
|
||||
|
||||
- 服务端/数据源端到端验证:✅(真实数据实测通过)
|
||||
- 前端 UI:待老师页面验收(客户端 bundle 已构建,刷新页面即载)
|
||||
- 完整验收:对照 验收标准.md 逐条核验(待老师确认)
|
||||
@@ -0,0 +1,27 @@
|
||||
# 迭代目标:05-交易记录接入(订单与成交 + 日期导航)
|
||||
|
||||
## 目标
|
||||
|
||||
在「交易记录」tab 接入 QMT Bridge **当日委托(/trade/orders)与当日成交(/trade/trades)**:**单表合并**展示(委托主行 + 按 m_strOrderSysID 展开成交明细)+ **基于交易日历的日期导航**(当日默认选中,历史接口占位)。
|
||||
|
||||
## 目标描述
|
||||
|
||||
- 范围:R-007(范围已定稿 2026-09-01);不新增其他功能域;
|
||||
- 要解决的问题:交易记录 tab 当前为占位(PlaceholderTab),无当日订单/成交数据展示,无法支撑交易复盘(目标-006);
|
||||
- 引用需求:**R-007(范围定稿,2026-09-01)**;
|
||||
- 实现方式:服务端 REST 直连 QMT Bridge(技术约束-003)+ 前端轮询(技术约束-010 思路)+ 单表合并 UI;
|
||||
- 日期导航:复用 /data/calendar/trading_dates,为老师完善历史成交接口预留。
|
||||
|
||||
## 目标讨论过程
|
||||
|
||||
- 2026-09-01 老师提出需求:接入订单与成交数据,开始需求和技术研究(R-007 入池);
|
||||
- 2026-09-01 技术研究:API 面实测(orders/trades 字段全表)、方向判定澄清(m_nOffsetFlag + m_strOptName)、数据时效研究(仅当日)、sample data 沉淀;
|
||||
- 2026-09-01 范围定稿:当日订单+成交接入 + 日期导航(老师将完善历史接口);
|
||||
- 2026-09-01 展示设计定稿:**单表合并**(委托主行 + 展开成交明细)+ **排序默认降序可手动调整**;
|
||||
- 关键决策:Q1-Q11 全部有结论(两块合一、3-5s 轮询、m_nOffsetFlag 判方向、本期不持久化、红买绿卖、P1 等)。
|
||||
|
||||
## 对老师的配合需求
|
||||
|
||||
- QMT Bridge(激活配置)可达,验证当日订单/成交返回真实数据;
|
||||
- 构建安装后重载页面配合验证;
|
||||
- 历史成交接口完善后接入日期导航历史查询(本期仅占位)。
|
||||
@@ -0,0 +1,28 @@
|
||||
# 验收标准:05-交易记录接入(订单与成交 + 日期导航)
|
||||
|
||||
## 验收标准线
|
||||
|
||||
1. 「交易记录」tab 显示**当日委托**(单表合并视图):每行一笔委托,展示时间/代码/名称/方向/状态/委托量/成交量/委托价/成交均价/成交额/手续费;
|
||||
2. **合并正确**:委托行聚合成交(按 m_strOrderSysID);有成交的委托行可**展开**查看每笔成交明细(成交时间/价/量/额/手续费/成交号);聚合金额与逐笔合计一致;
|
||||
3. **未成交委托**(待报/已报/已撤/废单):成交量/均价/金额/手续费显示 —;状态列中文映射正确(未报/待报/已报/部成/已成/已撤/废单等);
|
||||
4. **方向**:红买绿卖(红=买、绿=卖);方向判定正确(对照 m_strOptName);
|
||||
5. **时间段查询**:标题 + 时间段控件同一行;快捷按钮 今日/本周/本月 可快速切换(基于交易日历最近交易日计算);手动起止日期可用;非今日范围展示「历史数据接口开发中」占位;
|
||||
6. **排序**:委托主行默认降序(最新在前);点击表头可手动排序(升/降切换);
|
||||
7. **刷新**:当日数据 3-5s 自动刷新(无需手动);切换日期取消轮询;
|
||||
8. **不回归**:持仓/策略/行情/连接配置等现有功能正常。
|
||||
|
||||
## 验收方法
|
||||
|
||||
- 打开交易记录 tab,对照 QMT 端确认当日委托/成交数据真实显示(实测博纳影业 001330.SZ 限价卖出 200 股);
|
||||
- 点击有成交的委托行,确认展开显示每笔成交明细;
|
||||
- 检查未成交委托(若有)成交列显示 —;
|
||||
- 点击 今日/本周/上周 快捷按钮,确认时间段切换正确(今日=最近交易日单日、本周=周一~周五(交易日,不考虑周六日)、本月=完整自然月(1号~月末);三范围互斥,点哪个激活哪个);手动改起止日期确认生效;历史范围显示占位提示;
|
||||
- 点击表头排序,确认升/降序切换与默认降序;
|
||||
- 观察 3-5s 轮询刷新(数据变化自动更新);
|
||||
- 回归:全部持仓 / 策略 / 行情 / QMT 连接配置正常。
|
||||
|
||||
## 验收目标
|
||||
|
||||
- 交易记录闭环完整:REST 查询 → 语义化映射 → 单表合并 → 展开明细 → 日期导航;
|
||||
- 支撑交易复盘(目标-006):当日委托/成交全貌可见;
|
||||
- 交互(合并/展开/排序/导航/着色)符合定稿设计。
|
||||
Reference in New Issue
Block a user