3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在极速交易和高频/tick级策略中,传统的轮询查询(如反复调用 get_order 或 get_orders)不仅会延迟策略响应,还可能对柜台接口产生不必要的查询压力。ptrade 提供了委托主推事件回调函数 on_order_response,能在订单状态发生变化时(如已报、已成、已撤、废单等)第一时间主动推送最新信息,助您实现高性能的事件驱动交易。
该函数仅在交易模块可用,适合对委托状态更新速度要求极高的策略模式。
def on_order_response(context, order_list):
pass
order_id: 策略内部 Order 订单编号(非本策略产生的订单该字段可能为空字符串 "")。entrust_no: 柜台委托编号。stock_code: 标的代码(如 '600570.SS')。status: 委托状态(常用值:'2'已报、'6'已撤、'7'部成、'8'已成、'9'废单等)。amount: 委托数量。price: 委托价格。business_amount: 已成交数量。entrust_type: 委托类别(如 '0'委托,'2'撤单)。entrust_prop: 委托属性。error_info: 错误提示信息。on_order_response 中编写下单/撤单逻辑,必须增加条件判断(如检查标志位或特定状态),避免产生“主推触发下单 -> 下单产生主推 -> 再次触发下单”的无限死循环。order_id 为空字符串 "",需注意做好兼容校验。set_parameters 开启或关闭特定主推接收:
receive_other_response="1":接收非本交易产生的委托主推。receive_cancel_response="1":接收撤单委托产生的主推。以下示例展示了如何在 initialize 中初始化标的,并在 on_order_response 中捕获订单变化:
def initialize(context):
# 设置交易标的
g.security = '600570.SS'
set_universe(g.security)
# 设置控制标识,防止循环报单
g.order_submitted = False
def handle_data(context, data):
# 满足条件时发出第一笔委托
if not g.order_submitted:
order_id = order(g.security, 100)
log.info("发出初始买入委托,单号: %s" % order_id)
g.order_submitted = True
def on_order_response(context, order_list):
for order_info in order_list:
symbol = order_info.get('stock_code')
status = order_info.get('status')
entrust_no = order_info.get('entrust_no')
order_id = order_info.get('order_id')
error_info = order_info.get('error_info')
log.info("[委托主推] 代码: %s | 柜台单号: %s | 策略单号: %s | 状态: %s" % (symbol, entrust_no, order_id, status))
# 状态判断处理
if status == '2':
log.info("订单 %s 已报入柜台" % entrust_no)
elif status == '8':
log.info("订单 %s 完全成交" % entrust_no)
elif status == '6':
log.info("订单 %s 已撤单" % entrust_no)
elif status == '9':
log.error("订单 %s 成为废单,原因: %s" % (entrust_no, error_info))
通过使用 on_order_response,您可以实现秒级甚至毫秒级的事件驱动应答,大幅提升策略在实盘交易中的执行效率与稳定性。