3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,进行订单管理和撤单操作时,理解 order_id(策略订单号) 与 entrust_no(柜台委托编号) 的区别至关重要。这两者处于不同的系统层级,对应的撤单接口和使用场景也有所不同。
order_id 与 entrust_no 的核心区别| 维度 | order_id (策略订单号 / 平台订单号) |
entrust_no (柜台委托编号) |
|---|---|---|
| 生成主体 | 由 ptrade 策略引擎 内部生成。 | 由 券商交易柜台(如恒生 UFX、顶点等)生成。 |
| 唯一性范围 | 在当前策略运行实例中唯一。 | 在券商柜台账户当日的所有委托中唯一。 |
| 获取时机 | 调用 order() 系列函数时立即返回(即使是废单或待报单也会返回)。 |
订单报入柜台并被受理后,由柜台异步返回(可通过 get_orders() 或 on_order_response 主推获取)。 |
| 主要用途 | 用于策略内部跟踪订单状态、关联成交记录。 | 用于柜台层面的订单定位、对账及跨策略/手动撤单。 |
| 对应撤单接口 | cancel_order(order_id) |
cancel_order_ex(order_dict)(需传入包含 entrust_no 的订单字典) |
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} 发起撤单")
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
order() 接口依然会返回 order_id,但柜台不会生成有效的 entrust_no(或者状态直接变为废单)。此时调用 cancel_order(order_id) 会失效,因为订单在柜台层面根本未申报成功。cancel_order_ex 威力强大,可以撤销账户下的任何订单。在多策略共用一个资金账户时,切勿盲目遍历 get_all_orders() 进行一键撤单,否则会误撤其他策略的正常挂单。建议通过 symbol 或策略内部维护的白名单进行过滤。on_order_response(context, order_list) 委托主推中,如果是策略外交易产生的主推,order_id 字段会赋值为空字符串 "",但 entrust_no 依然有效。此时若需撤单,必须使用 cancel_order_ex。