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

PTrade 如何在 on_order_response 中识别废单与报单错误?

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

问题描述

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

Title: PTrade 委托回报监控:利用 on_order_response 捕获废单与错误信息

Question: 在 PTrade 的 on_order_response 回调中,如何通过 error_info 和 status 判断订单是否报单失败或成为废单?

解决方案

PTrade 委托回报监控:利用 on_order_response 捕获废单与错误信息

在 PTrade 量化交易平台中,on_order_response 属于委托主推回调函数,能够在柜台产生委托状态变更时第一时间响应。相比在 handle_data 中轮询 get_order(),使用委托主推能大幅提升订单状态监控的实时性,是低延迟与高可靠性策略的核心组件。


一、关键字段解析

on_order_response(context, order_list) 中的 order_list 是一个包含字典对象的列表,每个字典包含以下关键诊断字段:

字段名 类型 说明
status str 委托状态,常见取值:'2'(已报)、'6'(已撤)、'7'(部成)、'8'(已成)、'9'(废单)
error_info str 柜台或系统返回的错误描述信息,若报单正常则为空字符串 ""
entrust_no int/str 柜台委托编号
order_id str 策略内部 Order 订单编号(若接收到策略外交易主推,则为空字符串 ""
stock_code str 标的代码

二、如何识别废单与失败订单

在交易场景中(如下单价格超出价格笼子、资金不足、超过持仓限制等),订单可能会被柜台拒单或判定为废单:

  1. 废单判断:直接检查 status == '9'。此时订单已被交易所或柜台拒绝,不会再有后续撮合成交。
  2. 错误信息捕获:当 error_info != ""status == '9' 时,提取 error_info 字段获取具体拒单原因(例如:"超出涨跌停限制""可用资金不足")。
  3. 非本策略订单:若 order_id == "",说明该主推为策略外手动或第三方软件下单回报。

三、Python 完整代码示例

以下示例展示了如何在 on_order_response 回调函数中高效捕获废单和报错信息,并进行相应的日志记录与逻辑处理:

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)
    # 开启接收撤单与第三方主推(可选)
    set_parameters(receive_other_response="1", receive_cancel_response="1")

def on_order_response(context, order_list):
    for order_info in order_list:
        symbol = order_info.get('stock_code')
        status = order_info.get('status')
        error_msg = order_info.get('error_info')
        order_id = order_info.get('order_id')
        entrust_no = order_info.get('entrust_no')
        
        # 1. 捕获废单状态 (status == '9')
        if status == '9':
            log.error(f"[废单告警] 标的: {symbol}, 订单ID: {order_id}, 委托号: {entrust_no}, 错误原因: {error_msg}")
            # 此处可触发补单或风控逻辑
            
        # 2. 捕获存在错误信息的异常回报
        elif error_msg:
            log.warning(f"[委托异常] 标的: {symbol}, 当前状态: {status}, 错误描述: {error_msg}")
            
        # 3. 正常成交/已报等状态处理
        else:
            if status == '2':
                log.info(f"[已报柜台] 标的: {symbol}, 委托号: {entrust_no}")
            elif status == '8':
                log.info(f"[全部成交] 标的: {symbol}, 委托号: {entrust_no}")

def handle_data(context, data):
    # 示例:下单触发
    pass

四、注意事项与最佳实践

  1. 避免死循环:如果在 on_order_response 中编写补单逻辑(如废单后自动重新下单),务必加入计数或状态标记,防止因重复拒单导致无限触发下单回路。
  2. 配合成交主推on_order_response 主要用于监控委托状态,如需精准追踪具体成交价格和金额,建议结合 on_trade_response 回调配合使用。