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. 验收 + 复盘。
|
||||
Reference in New Issue
Block a user