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

ptrade 事件驱动:使用 on_order_response 实时追踪订单状态变化

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: ptrade 事件驱动:使用 on_order_response 实时追踪订单状态变化

Question: 如何使用 ptrade 的 on_order_response 实现高效订单状态监控?

解决方案

ptrade 事件驱动:使用 on_order_response 实时追踪订单状态变化

在极速交易和高频/tick级策略中,传统的轮询查询(如反复调用 get_orderget_orders)不仅会延迟策略响应,还可能对柜台接口产生不必要的查询压力。ptrade 提供了委托主推事件回调函数 on_order_response,能在订单状态发生变化时(如已报、已成、已撤、废单等)第一时间主动推送最新信息,助您实现高性能的事件驱动交易。


一、on_order_response 接口说明

1. 使用场景

该函数仅在交易模块可用,适合对委托状态更新速度要求极高的策略模式。

2. 函数签名

def on_order_response(context, order_list):
    pass

3. 参数说明

  • context: Context 上下文对象,包含当前账户及持仓信息。
  • order_list: 列表(List),包含当前有状态变更的委托单字典对象。每个字典包含以下关键字段:
    • order_id: 策略内部 Order 订单编号(非本策略产生的订单该字段可能为空字符串 "")。
    • entrust_no: 柜台委托编号。
    • stock_code: 标的代码(如 '600570.SS')。
    • status: 委托状态(常用值:'2'已报、'6'已撤、'7'部成、'8'已成、'9'废单等)。
    • amount: 委托数量。
    • price: 委托价格。
    • business_amount: 已成交数量。
    • entrust_type: 委托类别(如 '0'委托,'2'撤单)。
    • entrust_prop: 委托属性。
    • error_info: 错误提示信息。

二、核心注意事项与最佳实践

  1. 防无限循环报单:如果在 on_order_response 中编写下单/撤单逻辑,必须增加条件判断(如检查标志位或特定状态),避免产生“主推触发下单 -> 下单产生主推 -> 再次触发下单”的无限死循环。
  2. 策略外主推处理:如果券商开启了非本交易主推推送,接收到的主推中 order_id 为空字符串 "",需注意做好兼容校验。
  3. 开关配置:可以通过 set_parameters 开启或关闭特定主推接收:
    • receive_other_response="1":接收非本交易产生的委托主推。
    • receive_cancel_response="1":接收撤单委托产生的主推。

三、代码示例:实时追踪订单状态与防循环报单

以下示例展示了如何在 initialize 中初始化标的,并在 on_order_response 中捕获订单变化:

def initialize(context):
    # 设置交易标的
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 设置控制标识,防止循环报单
    g.order_submitted = False

def handle_data(context, data):
    # 满足条件时发出第一笔委托
    if not g.order_submitted:
        order_id = order(g.security, 100)
        log.info("发出初始买入委托,单号: %s" % order_id)
        g.order_submitted = True

def on_order_response(context, order_list):
    for order_info in order_list:
        symbol = order_info.get('stock_code')
        status = order_info.get('status')
        entrust_no = order_info.get('entrust_no')
        order_id = order_info.get('order_id')
        error_info = order_info.get('error_info')
        
        log.info("[委托主推] 代码: %s | 柜台单号: %s | 策略单号: %s | 状态: %s" % (symbol, entrust_no, order_id, status))
        
        # 状态判断处理
        if status == '2':
            log.info("订单 %s 已报入柜台" % entrust_no)
        elif status == '8':
            log.info("订单 %s 完全成交" % entrust_no)
        elif status == '6':
            log.info("订单 %s 已撤单" % entrust_no)
        elif status == '9':
            log.error("订单 %s 成为废单,原因: %s" % (entrust_no, error_info))

通过使用 on_order_response,您可以实现秒级甚至毫秒级的事件驱动应答,大幅提升策略在实盘交易中的执行效率与稳定性。