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

PTrade 中 on_order_response 函数的作用及优势是什么?

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

问题描述

PTrade中on_order_response函数的作用是什么,它比普通委托查询有什么优势?

不清楚on_order_response委托主推函数的用途

解决方案

在 PTrade 量化交易平台中,on_order_response 是一个非常重要的委托主推(回调)函数。它的主要作用和优势如下:

1. 函数作用

on_order_response(context, order_list) 函数会在委托单状态发生变化时被动触发响应。当你的委托单被柜台接收、部分成交、全部成交、撤单或成为废单时,系统会主动将最新的委托单信息通过 order_list 参数推送给该函数。

2. 相比普通委托查询的优势

相比于使用 get_order()get_orders() 主动去查询订单状态,on_order_response 具有显著的优势:

  • 更新速度更快:它是基于事件驱动的底层主推机制,订单状态一旦在柜台发生变化,会立即回调该函数。而 get_order() 等函数通常依赖于引擎的轮询或状态同步,存在一定的延迟。
  • 适合对速度要求高的策略:对于需要根据订单状态迅速做出下一步决策(如高频交易、快速撤单重报、套利策略等),使用主推回调是最佳选择。
  • 降低系统开销:被动接收推送比在 handle_datarun_interval 中频繁主动调用查询接口更节省系统资源。

3. 使用注意事项

  • 支持品种:目前可接收股票、可转债、ETF、LOF、期货代码的主推数据。
  • 策略外交易:如果券商配置了推送非本策略产生的交易,这些主推信息中的 order_id 字段会赋值为空字符串 "",因为它们在策略内没有对应的 Order 对象。
  • 避免死循环极其重要!如果在 on_order_response 函数内部再次调用下单接口(如 order()),必须做好逻辑判断(例如使用全局标志位 g.flag),否则新下的单又会触发主推,从而导致无限迭代的死循环。

4. 代码示例

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)
    g.flag = 0 # 用于防止死循环的标志位

def on_order_response(context, order_list):
    log.info("收到委托主推: %s" % order_list)
    # 示例:收到主推后,如果还没下过第二笔单,则触发下单
    if g.flag == 0:
        order('600570.SS', 100)
        g.flag = 1
    else:
        log.info("已处理完毕,不再下单")

def handle_data(context, data):
    # 初始触发一笔委托
    if g.flag == 0:
        order('600570.SS', 100)