Ⅱ · 框架解剖 — 2.2

NautilusTrader · 行情与订单如何闭环

沿着一笔报价和一张订单走一遍,组件表才会变成可以在脑中运行的系统。

两条路径共用同一份状态

A · 一笔报价如何到达策略DataClient解析外部报文通道DataEventDataEngine处理数据类型Cache更新最新状态MessageBus按主题发布Strategy数据回调data.quotes.<venue>.<instrument>B · 一张订单如何回到策略与组合状态Strategysubmit_orderRiskEngine预交易检查ExecutionEngine路由命令ExecutionClient协议适配交易场所接受 / 成交 / 拒绝OrderEvent:Accepted · Filled · Canceled · Rejected · Expired …Cache订单与持仓状态Portfolio余额、敞口、盈亏Strategy callbacks订单与持仓事件本地预交易拒绝会在 RiskEngine 处产生 `OrderDenied`;场所拒绝与成交则在订单到达执行客户端之后,以订单事件回流。两条路径相交于 Cache、Portfolio 与策略:市场状态影响决策,订单事件再改变下一次决策可见的状态。
行情路径强调“保存后发布”,订单路径强调“命令出去、事件回来”。二者共同构成策略可以观察和审计的运行闭环。

上半部分是数据路径:适配器把外部报文解析成框架数据类型,通过通道交给 DataEngine;数据写入 Cache 并按主题发布,订阅该主题的策略再收到回调。盘口增量、bar 和自定义数据也遵循同一类“接收、处理、保存、发布”的关系,只是处理器和主题不同。

下半部分是订单路径:策略提交订单命令,RiskEngine 进行预交易检查,ExecutionEngine 将命令交给对应 ExecutionClient。场所确认、拒绝、成交或撤单事件沿回程进入执行引擎,再更新 Cache、Portfolio 与策略回调。

本地拒绝与场所拒绝

订单事件需要区分来源。OrderDenied 表示订单在本地预交易检查中被拦截,未送往场所;OrderRejected 表示订单已经到达场所后被其拒绝。二者都会成为策略可处理的订单事件,但它们描述的是不同位置发生的事实。

事件类别 例子 主要影响
本地订单状态 InitializedDenied 订单对象与本地检查结果
场所订单状态 SubmittedAcceptedRejectedCanceledExpired 场所对订单的处理结果
成交状态 Filled、部分成交、Triggered 订单剩余量、持仓与组合计算
本地模拟状态 EmulatedReleased 由本地模拟订单逻辑维护的状态

策略可以实现具名的订单与持仓回调来消费这些事件 官方文档。对策略而言,订单发送不是函数调用后的终点,而是后续状态事件的起点。

生命周期也是可观察状态

策略、actor 与执行算法等组件有明确生命周期。常见稳定状态包括 PRE_INITIALIZEDREADYRUNNINGSTOPPEDDEGRADEDFAULTEDDISPOSED;启动、停止、恢复等过程则处于相应的过渡状态。

这些状态不替代订单状态。生命周期描述“一个组件能否履行职责”,订单状态描述“某张订单处于哪里”。两条状态线分别服务于运行监控和交易审计。