3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,尤其是高频交易或对速度要求极高的策略中,实时获取订单的委托状态(如已报、部成、已成、废单等)至关重要。ptrade 提供了 on_order_response(委托主推) 事件函数,用于毫秒级实时捕获订单状态的变化。
on_order_response 是 ptrade 的可选事件回调函数,仅在交易(实盘/模拟盘)模块可用。当策略提交的委托单状态发生任何变化时,柜台会主动向策略推送最新的委托信息,触发该函数的执行。
def on_order_response(context, order_list):
pass
context: 上下文对象,存放当前的账户及持仓信息。order_list: 发生变化的委托单列表。列表内元素为字典,包含订单的详细字段。order_list 字典核心字段:stock_code: 股票代码(如 '600570.SS')entrust_no: 柜台委托编号order_id: 策略内部订单 IDamount: 委托数量price: 委托价格business_amount: 已成交数量status: 委托状态(字符串类型)error_info: 错误信息(废单时有用)在回调函数中,通过遍历 order_list 并读取 status 字段,即可捕获订单的最新状态。ptrade 的 status 状态码定义如下:
| 状态码 | 含义 | 说明 |
|---|---|---|
'0' |
未报 | 订单已创建但尚未申报 |
'1' |
待报 | 准备申报 |
'2' |
已报 | 柜台已接受申报 |
'3' |
已报待撤 | 已提交撤单申请,等待柜台确认 |
'4' |
部成待撤 | 部分成交,其余部分正在申请撤单 |
'5' |
部撤 | 部分成交,其余部分已成功撤单 |
'6' |
已撤 | 订单已完全撤销 |
'7' |
部成 | 订单部分成交 |
'8' |
已成 | 订单完全成交 |
'9' |
废单 | 申报失败(如价格超出价格笼子) |
'+' / '-' / 'V' |
已受理 / 已确认 | 柜台处理状态 |
| 对比维度 | on_order_response (委托主推) | get_orders (主动查询) |
|---|---|---|
| 工作机制 | 事件驱动(Push):柜台状态变化时主动推送给策略。 | 轮询机制(Pull):策略主动向引擎发起查询请求。 |
| 响应速度 | 极快(毫秒级)。几乎与柜台同步。 | 较慢。受限于策略运行周期(如分钟级或 tick 级轮询)。 |
| 系统消耗 | 极低。仅在状态变化时触发。 | 较高。频繁调用会增加 CPU 和网络 I/O 压力。 |
| 适用场景 | 适合高频交易、追涨停、快速撤单重报等对速度敏感的策略。 | 适合盘后对账、定时检查订单状态等非实时场景。 |
| 可用环境 | 仅交易(实盘/模拟盘)模块可用。 | 回测与交易模块均可用。 |
注意:如果是废单(例如下单价格超过价格笼子),
order()函数依然会返回order_id,但在on_order_response中捕获的status最终会变为'9'(废单)。
以下是一个完整的 ptrade 策略示例,展示如何使用 on_order_response 实时监控订单状态,并在订单完全成交(status == '8')时打印日志:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
g.has_ordered = False
def handle_data(context, data):
# 仅在未下单时,买入100股恒生电子
if not g.has_ordered:
order_id = order(g.security, 100)
log.info(f"已提交委托,订单ID: {order_id}")
g.has_ordered = True
def on_order_response(context, order_list):
"""
委托主推回调函数
"""
for ord in order_list:
stock = ord['stock_code']
status = ord['status']
entrust_no = ord['entrust_no']
log.info(f"收到委托主推 -> 股票: {stock}, 委托号: {entrust_no}, 当前状态: {status}")
if status == '8':
log.info(f"【交易提醒】股票 {stock} 已完全成交!")
elif status == '9':
log.error(f"【交易警报】股票 {stock} 申报失败,废单原因: {ord['error_info']}")