完整教程)
本方案由EasyQuant AI量化助手提供。问题背景实盘委托提交后不一定会立即成交。如果策略没有检查未完成订单就可能在下一次运行时重复下单。PTrade 可使用get_open_orders()查询未完成委托并通过cancel_order()撤销不再需要的订单。PTrade API 文档查询未完成委托def print_open_orders(): open_orders get_open_orders() if not open_orders: log.info(当前没有未完成委托) return for order in open_orders: log.info( 订单号%s代码%s数量%s已成交%s状态%s % ( order.id, order.security, order.amount, order.filled, order.status ) )下单前避免重复委托def has_pending_order(security): open_orders get_open_orders(security) if open_orders: log.info(%s 存在未完成委托本次跳过下单 % security) return True return False def buy_if_no_pending_order(security, value): if has_pending_order(security): return order_id order_value(security, value) if order_id: log.info(买入委托已提交订单号%s % order_id) else: log.info(买入委托提交失败)撤销指定委托def cancel_pending_orders(security): open_orders get_open_orders(security) if not open_orders: log.info(%s 没有可撤委托 % security) return for order in open_orders: result cancel_order(order.id) if result: log.info(已发送撤单请求订单号%s % order.id) else: log.info(撤单请求失败订单号%s % order.id)定时撤单示例def initialize(context): g.security 510300.SS # 14:55 检查并撤销未成交委托 run_daily(cancel_before_close, time14:55) def cancel_before_close(context): cancel_pending_orders(g.security)注意事项下单成功只代表委托创建成功不等于已经成交。撤单后仍应查询订单状态或等待订单回报确认最终结果。频繁报单、撤单可能触发券商风控应结合策略节奏合理控制。订单字段名称可能因 PTrade 版本而略有差异建议先打印订单对象确认。不要在回调或高频函数中无条件撤单和重报避免形成死循环。总结get_open_orders()与cancel_order()是 PTrade 委托管理的常用组合。通过下单前过滤未完成委托、收盘前处理挂单可以让实盘策略更稳定。