Files
fidc-backtest-engine/docs/callback-context-and-pending-targets-20260914.md
T

6.6 KiB
Raw Blame History

回报上下文、盘前意图与尚未提交的目标

2026-09-14。本轮已配套发布177annotated tag v2026.9.14.5。Engine81acc54 / Service e81bf47 / Trading94f99d2;完整股票池Goal继续,不据本阶段关闭。

已复现问题

  1. on_process_event总是收到active_datetime=None及空委托/成交数组。10:00账本已有100股,但Trade/PostMinute回调的成交数量仍为0;不能靠普通on_minute已修复就认为通知链也完整。
  2. 15:05盘后成交后,PreAfterTrading仍被标为15:00;跨日模式的PostOnDay又使用信号日描述执行日已发生的成交。
  3. BeforeTrading调度只处理订阅、账户和期货指令,剩余股票买卖/撤改意图没有后续消费。简单在开盘调用普通broker执行还会让旧挂单先成交再撤单。
  4. 合并完整目标时只追加权重会保留旧证券;更重要的是,不能先提交盘前旧组合,之后才计算同一窗口的新目标,否则T+1可能使错误买入无法纠正。
  5. 策略计算前的空broker调用也会恢复上一目标的未提交买入腿。反例中原持仓100股,09:30卖25股、13:00卖剩余75股;若此时先恢复旧买入,已经准备将新目标设为0%的策略仍会买入另一股票3000股。

本轮处理

  • 事件通知显式携带当前可见的委托、成交与回调时钟,移动已完成记录后再通知,不按每个回调复制整段历史。上下文是通知时已完成批次的最新状态,不冒充每一历史通知发生瞬间的账本快照。
  • 信号计算回调保留信号日;账户/委托通知使用实际执行日与物理时钟。默认收盘和结算不早于已处理时刻及当前适用的盘后结束点,管理费回调沿用同一完成时钟。
  • 盘前撤改走明确的非撮合控制阶段,保持原订单ID和实际已成交量;该入口拒绝买卖目标,不会顺带撮合旧单。普通显式买卖按原配置窗口执行,后续回调读取撤改后的真实活动订单。
  • 盘前与集合竞价的显式命令保留各自批次及约束。纯完整组合(完整rebalance或单一StockPool/TargetPortfolioSmart)可以被更新的完整意图替换;空回调不等于清仓,显式空完整目标才清仓。被替换意图的旧买入限制不能污染新完整目标。
  • 尚未提交的完整目标保留到当前窗口日度策略算完;新执行意图优先,只有没有新执行意图时才使用前面的目标。已提交挂单可以先更新实际成交,但策略计算前不恢复旧的未提交买入腿,之后再由正常执行路径处理当前意图。
  • 订阅/账户/直接期货指令通知同样获得完成后的历史;本轮不改变期货成交、会话或费用规则。

回归证据

  • 通知链:09:30为空、10:00/10:01均看到100股及1笔实际成交,Trade通知可找到相同订单。
  • 盘后:15:05成交后的默认收盘/结算和管理费通知不倒退;next-open保持独立信号日和执行日。
  • 盘前:09:00生成100股命令,分别只在09:30/13:00配置窗口成交;保留备注/诊断。跨日撤销原GTC订单后,新订单只成交100股,未让旧单先成交。
  • 完整目标:盘前A、集合竞价B、日度A或显式空目标,最终只采用有效最新目标;日度无新信号时保持B。显式逐股命令不会被目标合并丢弃。
  • 恢复顺序:开启正常旧恢复的单点负向对照确实多买3000股;恢复BeforeStrategy阶段后,只有原股票同一卖单的25+75股成交,无新增买入,最终持仓为空。
  • 本机Core834项通过(9项原有ignore),Trading613、最新main Runner446/API119通过。外部数据库及平台ignore不当作通过。

精确只读快照在Linux通过Core834及Trading613。旧二进制先独立归档,构建保持1GiB磁盘余量;本轮未再次删除缓存或业务文件。

发布与真实历史复验

已推送annotated tag v2026.9.14.5对应Engine 81acc5422878abc855fca72b35766ffad6159200、Service e81bf47806f5ac4ae4798bb5f5955a56638f754c、Trading 94f99d20f49f6cd1810996706cb94f610c302385。回测API/Runner于06:15:53 CST切换,五交易单元06:21:09切换,06:22实际运行文件和业务事实复核通过。

三组冻结合同共六次独立原生A/B,完整Canonical及equity/orders/trades/holdings逐行一致;再通过生产HTTP各提交一次,结果分别匹配原生候选,旧记录未改写:

案例 生产回测ID 成交 / 持仓 期末权益
手选优先四证券 btr_req_44f1bb067559946ef22941a0c425ed53e47515e04b399e20 10 / 4 9706248.648662
自动优先四证券 btr_req_078f129ed46b55ba72b47605983a00ae3eef14b1995e1237 10 / 4 9706248.648662
许总24只原v3 btr_req_ef37b8ea403f489e4798d2878e0ef85966ace550f6b4f3c4 51 / 21 9685563.876924999

重复目标委托0。三条新记录各5个交易日事件落库,持久事件27/18/32条,唯一键计数分别相同;旧流式样本仍27条/5日。仍为原合同下的日终容量审计,不外推实时盘口成交能力;首次Source准备和后续快速返回也不作为性能优化证明。

API SHA dea170902d77734d0a77c4da7dad71a70b33f76467e0608675dfbcc9d35d67fcRunner SHA b1d93215deb275fbec6217c6b9afbf717d5649600716bf4f3a1bf5d1cfa69731,运行实现身份 fed10e9fa61836aa271921f5d58490054210d83da935cad5de11cfacab45c13e。API发布目录/srv/fidc/canonical/run/backtest-api/releases/callback-81acc54-7w1zx9fb,回退目录/srv/fidc/canonical/run/build/callback-rollback-j7oje2tz;交易回退holding-protection-rollback-czuric4r

六服务实际SHA与manifest吻合,新增ERROR0。3Paper/0Live、配置、旧活动单、3个未确认Paper预览、迁移、影子配置0及disabled未变;发布后Paper/Live新订单0,未发送真实通知、委托或撤单。Source d5/PID1700096与UI6a2/PID3089476未重启,研究/信号暂停不变。177维护中的Engine9a54156完整保留,实际构建使用81acc54/e81bf47及81acc54/94f99d2的只读Git快照。

原始回放/HTTP证据/srv/fidc/canonical/run/research/stock-pool-callback-20260914/;发布和最终审计/tmp/fidc-callback-{candidate,api-release,trading-release,final-audit}-20260914.json;非敏感汇总在docs/evidence/callback-target-20260914/acceptance.json

继续范围

显式逐笔手工影子回放仍未完成,四类手工来源继续拒绝纯比例影子;原始撤单意图时刻不能用网关回报时刻冒充。还需继续检查会话外调度产生的未提交意图、完整阶段日历与其余参数/生命周期/适配器矩阵。Source冻结、研究/信号暂停、现有任务配置和真实路由不改。