尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

NautilusTrader 订单修改中间态事件 OrderPendingUpdate 全解析:从 ModifyOrder 到交易所确认的等待期

NautilusTrader 订单修改中间态事件 OrderPendingUpdate 全解析:从 ModifyOrder 到交易所确认的等待期 NautilusTrader 订单修改中间态事件 OrderPendingUpdate 全解析从 ModifyOrder 到交易所确认的等待期【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_traderOrderPendingUpdate是 NautilusTrader 事件驱动架构中描述订单修改请求已发出、等待交易所确认这一中间状态的核心事件。本文以官方概念文档为主线结合仓库 Rust 源码、PyO3 绑定与执行引擎实现系统讲解该事件的触发时机、字段语义、Python 处理方式与底层流转机制帮助你正确地在策略中监听改单流程并理解ACCEPTED - PENDING_UPDATE -的状态机路径。事件语义什么是 OrderPendingUpdateOrderPendingUpdate表示一次ModifyOrder命令已经发送到交易场所trading venue。它并不是修改成功的最终结果而是修改请求在途的中间态快照系统发出了改单指令正在等待交易所的确认回执。在 NautilusTrader 中该事件由ExecutionEngine统一处理引擎收到或生成该事件后会将其应用到订单对象、更新Cache并通过MessageBus发布出去最终路由到策略层的对应处理器。典型的状态迁移为ACCEPTED - PENDING_UPDATE此后改单流程进入二选一的终局后续事件说明OrderUpdated交易所确认修改成功订单回到修改前的状态OrderModifyRejected交易所拒绝修改订单同样回到修改前的状态也就是说PENDING_UPDATE是一个悬置状态等待期结束后订单状态会被恢复或维持原状绝不会直接从PENDING_UPDATE进入FILLED等成交态。事件字段详解与所有订单事件一样OrderPendingUpdate首先携带一组公共 Python 订单事件字段完整定义见 Events 概念文档公共字段说明trader_idTrader 实例标识strategy_id与该订单关联的策略标识instrument_id订单的合约/标的标识client_order_id客户端分配的订单标识event_id事件唯一标识UUID4ts_event事件发生时的 UNIX 时间戳纳秒ts_init事件初始化时的 UNIX 时间戳纳秒causation_id引发本事件的源事件或回执标识若已知除公共字段外OrderPendingUpdate自身携带三个类型专属字段与原文档一致字段Python 类型Required/默认值说明venue_order_idVenueOrderId或NoneNone交易场所分配的订单标识若已知account_idAccountId或NoneRequired与该订单关联的账户标识若已知reconciliationboolRequired该事件是否在状态对账reconciliation期间生成从 Rust 侧的结构体定义crates/model/src/events/order/pending_update.rs可以看到事件在底层还保留了causation_id序列化时若为None则跳过并且account_id与venue_order_id均为Option类型——这与 Python 侧可为 None的类型签名一一对应。结构体声明为#[repr(C)]并派生Clone, Copy, PartialEq, Eq, Serialize, Deserialize且以#[serde(tag type)]标记反序列化时 JSON 中必须带有type: OrderPendingUpdate标签才能正确区分事件类型。Python 构造签名与字典互转Python 侧构造函数由 PyO3 绑定暴露见crates/model/src/python/events/order/pending_update.rs与类型桩python/nautilus_trader/model/__init__.pyiOrderPendingUpdate( trader_id: TraderId, strategy_id: StrategyId, instrument_id: InstrumentId, client_order_id: ClientOrderId, account_id: AccountId | None, event_id: UUID4, ts_event: int, ts_init: int, reconciliation: bool, venue_order_id: VenueOrderId | None None, )事件类还提供两个实用方法from_dict(values: dict) - OrderPendingUpdate从字典反序列化构造事件to_dict() - dict导出为字典。导出时type固定为OrderPendingUpdate所有标识符均以字符串形式输出ts_event/ts_init为纳秒整数可选字段account_id、venue_order_id、causation_id为None时输出None。事件的可读字符串形式参考仓库单测pending_update.rs测试OrderPendingUpdate(instrument_idBTCUSDT.COINBASE, client_order_idO-19700101-000000-001-001-1, venue_order_id001, account_idSIM-001, ts_event0)在策略中处理该事件在策略处理器中读取事件的标准写法源自原文档示例def on_order_pending_update(self, event: OrderPendingUpdate) - None: self.log.info(fModify pending for {event.client_order_id})实际使用中你通常会在发出ModifyOrder命令后利用该回调记录改单在途状态例如def on_order_pending_update(self, event: OrderPendingUpdate) - None: # 记录改单请求已发出、等待交易所确认 self.log.info( fModify pending | client{event.client_order_id} fvenue{event.venue_order_id} account{event.account_id} fts_event{event.ts_event}, self.log, )需要注意事件的分发顺序见 Events 概念文档Handler dispatch专属处理器先触发聚合处理器后触发。因此你既可以在on_order_pending_update中精确处理改单等待也可以在on_order_event中统一收口所有订单事件两者互不冲突def on_order_event(self, event: OrderEvent) - None: if isinstance(event, OrderPendingUpdate): self.log.info(fAggregate handler sees modify pending: {event})提示Python 数据 actor 不暴露订单事件回调与原始消息总线需要将派生数据从策略传给数据 actor 时应使用信号signal机制。详见 Actors: order event handling。底层流转ExecutionEngine 如何处理该事件原文档指出该事件由ExecutionEngine应用到订单、更新Cache并经MessageBus发布。在源码层面这一过程体现在crates/execution/src/engine/mod.rs的两个关键方法中Portfolio 路由send_order_event_to_portfolioOrderPendingUpdate与Submitted、Triggered、PendingCancel、ModifyRejected、CancelRejected、FillVoided一样只有在账户类型为 Wallet钱包账户时才会转发给Portfolio保证金/现金账户的改单等待事件不参与投资组合层的状态更新。而Accepted、Canceled、Expired、Rejected、Updated等事件则无条件转发。MessageBus 发布publish_order_event事件首先发布到按strategy_id划分的通用订单事件主题随后PendingUpdate还会额外发布到switchboard::get_order_pending_update_topic(instrument_id)对应的按合约划分的主题供对特定标的感兴趣的下游组件订阅。这两步共同构成了原文档所述apply → update Cache → publish on MessageBus的完整链路引擎先让订单对象进入PENDING_UPDATE状态并写回缓存再通过消息总线按策略与标的两个维度扇出事件。对账reconciliation场景reconciliation字段标记事件是否在状态对账期间生成。NautilusTrader 在重启恢复或事件流重放时会用已确认的历史事件重建订单状态此时生成的事件reconciliationTrue策略可以在处理时据此区分实时改单等待与对账重放。从源码看该字段是构造参数的必填项Python 构造函数第 9 个位置参数默认语义为非对账生成测试桩crates/model/src/events/order/spec/pending_update.rs中其默认值为false需要时可通过 builder 显式置为true。与其他事件的关系触发前置OrderAcceptedSubmitted - Accepted之后策略发起ModifyOrder才会产生OrderPendingUpdate两个出口OrderUpdated修改成功或OrderModifyRejected修改被拒二者均将订单带回修改前的状态并行概念OrderPendingCancel是取消请求的同类中间态处理模式完全对称。完整的订单状态机流转可参考 Orders 状态流事件总览与分发机制见 Events 概念文档。延伸阅读Events 概念总览事件分类、分发顺序与公共订单事件字段Orders 概念文档订单类型与状态机源码实现Rust 事件定义、PyO3 绑定、执行引擎发布逻辑类型签名Python 类型桩【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表