使用get_orders函数返回的委托数据更新不及时?
柜台已经成交了但是获取回来还是已报?"
/
get_orders() 或 get_order() 函数获取订单状态时,可能会遇到状态更新不及时的情况(例如:柜台实际已经成交,但函数返回的状态仍然是“已报”)。\n\n这是因为 get_orders() 依赖于底层引擎的状态同步,而引擎轮询和更新 Order 状态存在一定的时间差。对于对速度和状态实时性要求较高的策略,这种延迟可能会导致逻辑误判(如重复下单)。\n\n## 解决方案:使用主推事件\n\n为了获取最实时的委托和成交状态,ptrade 提供了委托主推事件 (on_order_response) 和 交易主推事件 (on_trade_response)。这两个回调函数会在订单状态发生变化时立即被触发,速度远快于主动调用 get_orders()。\n\n### 1. 委托主推事件:on_order_response\n\n该函数会在委托单状态发生变化时回调。\n\npython\ndef initialize(context):\n g.security = '600570.SS'\n set_universe(g.security)\n g.flag = 0\n\ndef on_order_response(context, order_list):\n # order_list 是一个列表,包含发生变化的委托单字典\n for order in order_list:\n log.info(\"委托主推更新 - 订单号: %s, 状态: %s\" % (order['order_id'], order['status']))\n # 状态 '8' 代表已成,'6' 代表已撤等\n\ndef handle_data(context, data):\n if g.flag == 0:\n order(g.security, 100)\n g.flag = 1\n\n\n### 2. 成交主推事件:on_trade_response\n\n该函数会在有新的成交产生时回调。\n\npython\ndef initialize(context):\n g.security = '600570.SS'\n set_universe(g.security)\n g.flag = 0\n\ndef on_trade_response(context, trade_list):\n # trade_list 是一个列表,包含最新成交的字典\n for trade in trade_list:\n log.info(\"成交主推更新 - 订单号: %s, 成交数量: %s, 成交价格: %s\" % (trade['order_id'], trade['business_amount'], trade['business_price']))\n\ndef handle_data(context, data):\n if g.flag == 0:\n order(g.security, 100)\n g.flag = 1\n\n\n## 注意事项\n\n1. 避免死循环:如果在主推回调函数(on_order_response 或 on_trade_response)中再次调用下单接口(如 order()),极易引发无限迭代循环,必须做好状态标志位(如 g.flag)的判断。\n2. 非本策略订单:默认情况下,主推事件只推送本策略产生的订单。如果需要接收策略外(如手动在终端下单)的主推,需要在 initialize 中通过 set_parameters(receive_other_response=\"1\") 开启,此时非本策略订单的 order_id 字段为空字符串 \"\"。\n3. 废单处理:如果是废单(如价格超出笼子),order() 函数仍会返回 order_id,在 on_order_response 中状态可能是 2(已报),但在 on_trade_response 或后续更新中状态会变为 9(废单)。