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

ptrade 撤单时,cancel_order 传入的订单号和柜台返回的委托编号(entrust_no)有什么区别?

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

问题描述

ptrade 订单管理:利用柜台委托编号(entrust_no)与 order_id 撤单的区别与实战
ptrade 撤单时,cancel_order 传入的订单号和柜台返回的委托编号(entrust_no)有什么区别?

解决方案

在 ptrade 量化交易平台中,进行订单管理和撤单操作时,理解 order_id(策略订单号)entrust_no(柜台委托编号) 的区别至关重要。这两者处于不同的系统层级,对应的撤单接口和使用场景也有所不同。


一、 order_identrust_no 的核心区别

维度 order_id (策略订单号 / 平台订单号) entrust_no (柜台委托编号)
生成主体 ptrade 策略引擎 内部生成。 券商交易柜台(如恒生 UFX、顶点等)生成。
唯一性范围 在当前策略运行实例中唯一。 在券商柜台账户当日的所有委托中唯一。
获取时机 调用 order() 系列函数时立即返回(即使是废单或待报单也会返回)。 订单报入柜台并被受理后,由柜台异步返回(可通过 get_orders()on_order_response 主推获取)。
主要用途 用于策略内部跟踪订单状态、关联成交记录。 用于柜台层面的订单定位、对账及跨策略/手动撤单。
对应撤单接口 cancel_order(order_id) cancel_order_ex(order_dict)(需传入包含 entrust_no 的订单字典)

二、 撤单实战:两种撤单方式的实现

1. 使用 order_id 撤单(最常用)

适用于策略内部下单后,直接对该笔订单进行撤单。这是最安全的做法,不会影响到账户下其他策略的订单。

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)
    g.order_id = None

def handle_data(context, data):
    # 1. 下单并获取 order_id
    if g.order_id is None:
        g.order_id = order(g.security, 100, limit_price=35.00)
        log.info(f"策略下单成功,获得 order_id: {g.order_id}")
        
    # 2. 满足某种条件时,使用 order_id 撤单
    else:
        # 获取订单当前状态
        curr_order = get_order(g.order_id)
        if curr_order and curr_order[0].status in ['2', '7']: # 已报或部成
            cancel_order(g.order_id)
            log.info(f"已对 order_id: {g.order_id} 发起撤单")

2. 使用 entrust_no 撤单(通过 cancel_order_ex

适用于需要撤销非本策略产生的订单(如手动干预订单或其他策略的订单),或者在策略重启后通过 get_all_orders() 获取账户当日全部柜台委托进行一键撤单。

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

def handle_data(context, data):
    if not g.has_canceled:
        # 获取账户当日在柜台的全部委托记录(包含非本策略订单)
        all_orders = get_all_orders(g.security)
        
        for ord in all_orders:
            # 判断柜台委托状态是否为 '2' (已报) 或 '7' (部成)
            if ord['status'] in ['2', '7']:
                # cancel_order_ex 接收 get_all_orders 返回的单个订单字典(内含 entrust_no)
                cancel_order_ex(ord)
                log.info(f"通过柜台委托编号 {ord['entrust_no']} 成功撤单!")
                
        g.has_canceled = True

三、 实战注意事项与避坑指南

  1. 废单处理
    如果是废单(例如下单价格超过价格笼子),order() 接口依然会返回 order_id,但柜台不会生成有效的 entrust_no(或者状态直接变为废单)。此时调用 cancel_order(order_id) 会失效,因为订单在柜台层面根本未申报成功。
  2. 跨策略撤单风险
    cancel_order_ex 威力强大,可以撤销账户下的任何订单。在多策略共用一个资金账户时,切勿盲目遍历 get_all_orders() 进行一键撤单,否则会误撤其他策略的正常挂单。建议通过 symbol 或策略内部维护的白名单进行过滤。
  3. 主推事件中的状态判断
    on_order_response(context, order_list) 委托主推中,如果是策略外交易产生的主推,order_id 字段会赋值为空字符串 "",但 entrust_no 依然有效。此时若需撤单,必须使用 cancel_order_ex