问题描述
不清楚on_order_response委托主推函数的用途
解决方案
在 PTrade 量化交易平台中,on_order_response 是一个非常重要的委托主推(回调)函数。它的主要作用和优势如下:
1. 函数作用
on_order_response(context, order_list) 函数会在委托单状态发生变化时被动触发响应。当你的委托单被柜台接收、部分成交、全部成交、撤单或成为废单时,系统会主动将最新的委托单信息通过 order_list 参数推送给该函数。
2. 相比普通委托查询的优势
相比于使用 get_order() 或 get_orders() 主动去查询订单状态,on_order_response 具有显著的优势:
- 更新速度更快:它是基于事件驱动的底层主推机制,订单状态一旦在柜台发生变化,会立即回调该函数。而
get_order()等函数通常依赖于引擎的轮询或状态同步,存在一定的延迟。 - 适合对速度要求高的策略:对于需要根据订单状态迅速做出下一步决策(如高频交易、快速撤单重报、套利策略等),使用主推回调是最佳选择。
- 降低系统开销:被动接收推送比在
handle_data或run_interval中频繁主动调用查询接口更节省系统资源。
3. 使用注意事项
- 支持品种:目前可接收股票、可转债、ETF、LOF、期货代码的主推数据。
- 策略外交易:如果券商配置了推送非本策略产生的交易,这些主推信息中的
order_id字段会赋值为空字符串"",因为它们在策略内没有对应的 Order 对象。 - 避免死循环:极其重要!如果在
on_order_response函数内部再次调用下单接口(如order()),必须做好逻辑判断(例如使用全局标志位g.flag),否则新下的单又会触发主推,从而导致无限迭代的死循环。
4. 代码示例
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
g.flag = 0 # 用于防止死循环的标志位
def on_order_response(context, order_list):
log.info("收到委托主推: %s" % order_list)
# 示例:收到主推后,如果还没下过第二笔单,则触发下单
if g.flag == 0:
order('600570.SS', 100)
g.flag = 1
else:
log.info("已处理完毕,不再下单")
def handle_data(context, data):
# 初始触发一笔委托
if g.flag == 0:
order('600570.SS', 100)