保留模拟器失败调用前的委托与执行状态

This commit is contained in:
boris
2026-09-15 01:28:38 +08:00
parent 4c6147e2ee
commit 695fdee4b8
6 changed files with 776 additions and 30 deletions
+29
View File
@@ -0,0 +1,29 @@
# 模拟器异常恢复与活动委托保留
2026-09-15。开发候选,未发布生产;不是实际GT/QMT撤改单功能。
## 已复现的问题
活动委托恢复先用 `mem::take` 取出整批订单。某只证券历史滑点证据缺失而返回错误后,当前订单及后续未处理订单被一起丢掉。原有两笔GTC模拟委托,一笔已累计成交100股,错误后队列直接为空。若前一笔已经在本次调用内部撮合,资金/持仓/手续费和行情消费也可能改变,但整个调用没有返回成功报告,重试将不一致。
## 事务边界
- 只保护一次模拟器调用中尚未成功返回的内部结果:资金、实际批次持仓、订单及累计成交、股票池/ETF顺延目标、执行游标/成交量消费、手续费状态和内部编号,以及临时运行上下文。
- 本次调用明确失败或回调解栈时恢复检查点,错误继续向调用方返回;不吞错、不自动重跑。调用方仍应修复输入后重试原请求或发出明确新请求,不能把失败请求当成已接受的新目标。
- 已成功返回的旧成交和报告、进入本次调用前已确认的手工事实不回滚。真实券商订单和回报不在该内存事务内,不能撤销或伪造实际GT/QMT结果。
- 正常业务拒绝仍是有效结果:报告成功返回时,其他成功成交与拒绝记录一同保留,不因为有Rejected状态就整批回退。
- 普通执行及ETF顺延消费共用边界,嵌套调用只保留一次检查点;临时日期、委托有效期、风险限制等在回调异常后不会泄漏到下一次调用。硬件断电、OOM以及用户自定义钩子的外部副作用不属于此证明。
## 开销控制
初版完整复制全部持仓。现普通单证券指令只保存可能变动的持仓与可被清理的零股记录,保留原位置顺序;完整组合、新类型指令和股票池阶段使用保守的完整检查点。未触及的持仓批次不复制,失败时才重新组装;无工作、无交易的调用不建检查点。
隔离未优化编译配置下,30只证券、每只20个初始批次、500次调用:初版保护样例约35.7—40.2ms,缩小持仓范围后约24.8—26.8ms;无保护对照11.5—22.1ms,首轮/并发噪声存在。保护有成本,不能称无性能回退,更不能据此宣称生产整段回测提速。四次对照的委托、成交和经济账本完全相同,正式Source/Runner性能准入仍保留。
## 验证
七项新增专项覆盖:日线/分钟、买/卖、第一或第二笔失败,已有部分成交;补齐数据后的原编号恢复与正常一次执行逐字段一致;此前成功调用不受后续失败影响;ETF两个顺延目标和进度完整保留;异常解栈;公开回调的临时上下文;局部检查点的位置顺序、零股和未复制批次;成功路径微基准的结果等价。
本机Core926、Trading625、Runner463/API129全量通过,原9/63/16项ignore不计。测试初次String/CompactString赋值错误及筛选名匹配0项已纠正,0项不当作通过;新增批次对照也改用实际更晚的执行时钟,不把未来报价当可立即成交。
未修改UI、在线账户、交易路由或任务;未做新的私有PG或真实券商验收。Source d5冻结保持,跨公司行为的实际券商委托调整、正式换股数据/范围、在线事实重建与真正Source/Runner联合验收仍未完成。Linux使用本轮新只读快照,不复用旧收据;没有release/tag或生产重启。