Files
one_divine_lot/docs/04-迭代记录/05-交易记录接入/技术实现方案.md
T
kyugao bb3f8bd28d 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
2026-09-01 13:21:49 +08:00

4.3 KiB
Raw Blame History

技术实现方案:05-交易记录接入(订单与成交 + 日期导航)

依据:PLAN-006 | 需求:R-007 设计约束:技术约束-001/003/004/010、产品约束-007 方向语义

技术选型

  • 数据源:复用 QmtBridgeRestDataSourceREST 直连,技术约束-003),新增 3 方法;
  • 服务端 API:webServer 自开路由(技术约束-004),新增 api/trades.js 领域;
  • 前端数据流:服务端中转 + 前端轮询(技术约束-010 思路,复用 market-snapshot 模式);
  • UI:React 组件 + 现有表格风格(LoadState 三态 / 内联样式 / Toast);
  • 时间段查询v32026-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_nOffsetFlag48=买入/49=卖出)为主 + m_strOptName 交叉验证(R-007 Q3 闭环)。

客户端(单表合并)

TradeRecordsTab(标题 + 时间段同一行 + 单表)
  ├─ RangeSelectortrading-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. 服务端 APIapi/trades.js 三端点 + 领域分发;
  4. 客户端合并逻辑:fetch 两接口 → 分组 → 聚合;
  5. UIDateNav + OrderRow + TradeDetailRows + TradeRecordsTab + 排序;
  6. 构建安装:pnpm run build + 刷新/重启;
  7. 验收 + 复盘。