3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在ptrade量化交易平台中,如果遇到“日志打印交易成功,但在委托流水中查无记录”的情况,通常是由于API接口使用差异、订单状态变为废单、或者柜台数据同步延迟等原因引起的。以下是详细的排查步骤和解决方法:
在ptrade中,调用 order() 等下单函数时,只要语法正确且成功发送到系统,就会返回一个 order_id。很多开发者会在此时打印“交易成功”。但是,返回 order_id 并不代表柜台已经撮合成交,甚至不代表柜台接受了该订单。
get_order(order_id) 检查该订单的真实状态。def handle_data(context, data):
order_id = order('600570.SS', 100)
if order_id:
log.info('下单请求已发送,order_id: %s' % order_id)
# 检查订单真实状态
order_obj = get_order(order_id)
if order_obj and order_obj[0].status == '9':
log.error('订单被柜台拒单,成为废单!')
get_orders() 与 get_all_orders()如果你是通过代码查询委托流水发现无记录,请检查你使用的是哪个查询接口:
get_orders():仅返回当前策略内产生的订单。如果你在其他策略或手动进行了交易,这里查不到。get_all_orders():返回账户当日在柜台的全部委托记录(包含非本交易/手动产生的订单记录)。get_all_orders() 来确认账户层面的真实委托流水。在实盘交易场景中,持仓和委托信息的同步存在时滞(一般在6秒左右,具体由券商柜台配置决定)。
get_orders() 或 get_open_orders(),可能因为数据尚未从柜台同步回来而查不到记录。on_order_response 和 成交主推事件 on_trade_response 来异步接收订单状态更新,这比主动查询速度更快且更准确。def on_order_response(context, order_list):
# 当委托单发生变化时,系统会主动推送到这里
log.info('收到委托主推更新: %s' % order_list)
order_target 或 order_target_valueAPI文档中特别指出,在交易场景中应谨慎使用 order_target 系列接口。因为柜台返回持仓数据有延迟,如果连续触发 order_target,引擎可能因为没读到最新的持仓而导致重复下单或逻辑错乱,最终可能被柜台拒单。
总结建议:
将你的“交易成功”日志打印逻辑,从“下单函数返回后打印”修改为“在 on_trade_response 或 on_order_response 中判断状态为已成(status='8')后打印”,这样就能确保日志与实际委托流水完全一致。