🚀 AI 一键生成 ptrade 策略代码
立即体验

ptrade 委托主推详解:使用 on_order_response 实时获取订单最新状态

ptrade | 发布时间: 2026/8/6
以下内容由 EasyQuant 生成。

问题描述

ptrade 委托主推详解:使用 on_order_response 实时获取订单最新状态
ptrade 中如何通过 on_order_response 捕获委托状态(status),它和 get_orders 有什么区别?

解决方案

ptrade 委托主推详解:使用 on_order_response 实时获取订单最新状态

在量化交易中,尤其是高频交易或对速度要求极高的策略中,实时获取订单的委托状态(如已报、部成、已成、废单等)至关重要。ptrade 提供了 on_order_response(委托主推) 事件函数,用于毫秒级实时捕获订单状态的变化。


一、什么是 on_order_response?

on_order_response 是 ptrade 的可选事件回调函数,仅在交易(实盘/模拟盘)模块可用。当策略提交的委托单状态发生任何变化时,柜台会主动向策略推送最新的委托信息,触发该函数的执行。

接口定义:

def on_order_response(context, order_list):
    pass
  • context: 上下文对象,存放当前的账户及持仓信息。
  • order_list: 发生变化的委托单列表。列表内元素为字典,包含订单的详细字段。

order_list 字典核心字段:

  • stock_code: 股票代码(如 '600570.SS'
  • entrust_no: 柜台委托编号
  • order_id: 策略内部订单 ID
  • amount: 委托数量
  • price: 委托价格
  • business_amount: 已成交数量
  • status: 委托状态(字符串类型)
  • error_info: 错误信息(废单时有用)

二、如何通过 on_order_response 捕获委托状态(status)?

在回调函数中,通过遍历 order_list 并读取 status 字段,即可捕获订单的最新状态。ptrade 的 status 状态码定义如下:

状态码 含义 说明
'0' 未报 订单已创建但尚未申报
'1' 待报 准备申报
'2' 已报 柜台已接受申报
'3' 已报待撤 已提交撤单申请,等待柜台确认
'4' 部成待撤 部分成交,其余部分正在申请撤单
'5' 部撤 部分成交,其余部分已成功撤单
'6' 已撤 订单已完全撤销
'7' 部成 订单部分成交
'8' 已成 订单完全成交
'9' 废单 申报失败(如价格超出价格笼子)
'+' / '-' / 'V' 已受理 / 已确认 柜台处理状态

三、on_order_response 与 get_orders 的区别

对比维度 on_order_response (委托主推) get_orders (主动查询)
工作机制 事件驱动(Push):柜台状态变化时主动推送给策略。 轮询机制(Pull):策略主动向引擎发起查询请求。
响应速度 极快(毫秒级)。几乎与柜台同步。 较慢。受限于策略运行周期(如分钟级或 tick 级轮询)。
系统消耗 极低。仅在状态变化时触发。 较高。频繁调用会增加 CPU 和网络 I/O 压力。
适用场景 适合高频交易、追涨停、快速撤单重报等对速度敏感的策略。 适合盘后对账、定时检查订单状态等非实时场景。
可用环境 仅交易(实盘/模拟盘)模块可用。 回测与交易模块均可用。

注意:如果是废单(例如下单价格超过价格笼子),order() 函数依然会返回 order_id,但在 on_order_response 中捕获的 status 最终会变为 '9'(废单)。


四、实战代码示例

以下是一个完整的 ptrade 策略示例,展示如何使用 on_order_response 实时监控订单状态,并在订单完全成交(status == '8')时打印日志:

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)
    g.has_ordered = False

def handle_data(context, data):
    # 仅在未下单时,买入100股恒生电子
    if not g.has_ordered:
        order_id = order(g.security, 100)
        log.info(f"已提交委托,订单ID: {order_id}")
        g.has_ordered = True

def on_order_response(context, order_list):
    """
    委托主推回调函数
    """
    for ord in order_list:
        stock = ord['stock_code']
        status = ord['status']
        entrust_no = ord['entrust_no']
        
        log.info(f"收到委托主推 -> 股票: {stock}, 委托号: {entrust_no}, 当前状态: {status}")
        
        if status == '8':
            log.info(f"【交易提醒】股票 {stock} 已完全成交!")
        elif status == '9':
            log.error(f"【交易警报】股票 {stock} 申报失败,废单原因: {ord['error_info']}")