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

ptrade 平台如何配置 set_parameters 接收撤单委托产生的主推?(附 Python 源码)

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

问题描述

ptrade 撤单监控:如何配置 set_parameters 接收撤单委托产生的主推?
我想在策略中实时捕获撤单成功的事件,set_parameters 的 receive_cancel_response 该如何设置和配合主推使用?

解决方案

在 ptrade 量化交易平台中,默认情况下策略是不接收撤单委托产生的主推数据的。如果您希望在策略中实时捕获撤单成功的事件,需要通过 set_parameters 接口进行显式配置,并配合 on_order_response(委托主推)回调函数来实现。

一、核心配置步骤

  1. initialize 中开启撤单主推接收
    调用 set_parameters(receive_cancel_response="1")。其中 "1" 表示接收,"0" 表示不接收(缺省值)。

  2. 实现 on_order_response 回调函数
    当撤单委托状态发生变化时,系统会触发该函数。您可以通过判断委托单的 status(状态)和 entrust_type(委托类别)来捕获撤单成功事件。

二、关键数据字典参考

  • entrust_type(委托类别)"2" 代表撤单。
  • status(委托状态)"6" 代表已撤,"5" 代表部撤。

三、完整策略源码示例

以下是一个完整的 ptrade 策略示例,展示了如何配置并实时监控撤单事件:

def initialize(context):
    # 1. 设置操作的股票池
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 2. 配置策略参数:开启接收撤单委托产生的主推
    # receive_cancel_response="1" 开启撤单主推
    # receive_other_response="1" 可选:若需要接收非本策略产生的柜台撤单主推可一同开启
    set_parameters(receive_cancel_response="1")
    
    g.order_id = None
    g.cancel_triggered = False

def handle_data(context, data):
    # 模拟下单与撤单流程
    if g.order_id is None:
        # 以较低价格下一个限价单(不易成交,方便测试撤单)
        g.order_id = order(g.security, 100, limit_price=30.0)
        log.info(f"已报单,订单ID: {g.order_id}")
        
    elif g.order_id and not g.cancel_triggered:
        # 触发撤单
        cancel_order(g.order_id)
        log.info(f"已触发撤单申请,目标订单ID: {g.order_id}")
        g.cancel_triggered = True

def on_order_response(context, order_list):
    """
    委托主推回调函数
    """
    for ord in order_list:
        stock_code = ord.get('stock_code')
        entrust_no = ord.get('entrust_no')
        status = ord.get('status')
        entrust_type = ord.get('entrust_type')
        order_id = ord.get('order_id')
        
        # 打印接收到的主推详情
        log.info(f"收到委托主推 -> 代码: {stock_code}, 委托编号: {entrust_no}, 状态: {status}, 类别: {entrust_type}, 订单ID: {order_id}")
        
        # 判断是否为撤单委托 (entrust_type == '2') 且状态为已撤 (status == '6') 或部撤 (status == '5')
        if entrust_type == "2":
            if status == "6":
                log.info(f"【撤单成功】股票 {stock_code} 的撤单委托已完全撤销!委托编号: {entrust_no}")
            elif status == "5":
                log.info(f"【部分撤单】股票 {stock_code} 的撤单委托部分撤销!委托编号: {entrust_no}")

四、注意事项

  1. 服务器重启影响:如果交易期间服务器重启,initialize 会重新执行。建议配合 set_parameters(not_restart_trade="1") 避免交易时间内重复拉起导致逻辑混乱。
  2. 废单处理:如果撤单失败(例如订单已成无法撤销),撤单委托可能会变成废单,此时 status 会推 "9"(废单),可在回调中针对性处理。