量化交易PTrade查询委托与撤单实操详解
发布时间:2小时前阅读:64
在量化交易里,下单只是开始,管单才是日常。单子报出去以后,怎么知道它成交了没有?挂了半天没成交,怎么撤掉?别人(手动下单、别的策略、别的终端)的单子,能不能撤?
这些问题我就一起帮大家解答一下。
一、查单和撤单
很多人一开始写策略,只盯着"买/卖",其实订单管理只需要回答三个问题:
l 想干什么---->需要的能力
l 知道挂单现在是什么状态---->委托查询(get_orders / get_all_orders)
l 不想让它继续挂着---->撤单(cancel_order / cancel_order_ex)
这四个接口,在回测和交易两个环境里的可用性完全不一样——这也是坑最多的地方。

二、回测场景
回测环境本质上是一个封闭沙箱:订单由引擎撮合、成交后持仓和资金瞬时更新,不存在"外部下单"这回事。
所以回测里能用什么?
1)get_orders()——只认"自己人"
它只返回当前策略代码运行产生的订单对象。够用了,因为你不可能有别的单子。
2)cancel_order(order_param)——按Order对象或order_id撤单
参数可以是 Order 对象,也可以是下单时拿到的 order_id,返回值为 None;该函数在回测、交易模块都可用。

3)回测里仍然要注意的两个细节
收盘自动清场:回测每天结束时,系统会自动取消所有未完成的交易。所以"挂了一天没成交"的单子,盘后查不到是正常的。
get_all_orders() 在这里用不了:回测模式下该函数通常无法调用或返回为空,因为它设计用于实盘交互。

三、交易场景
从模拟盘到实盘,情况变了,策略运行在券商云端,订单状态要和柜台同步,而同步是有时滞的。
于是新增两个只有交易模块才能用的接口。
1)get_all_orders()——看得见整个账户
与 get_orders() 只返回本策略的订单对象不同,get_all_orders() 返回的是字典列表(list[dict]),包含该资金账号下当日所有委托记录:手动下单的、其他终端下的、其他策略下的,统统在里面。
常用字段包括:entrust_no(委托编号)、symbol(股票代码)、amount(委托数量)、price(委托价格)、status(委托状态)、filled_amount(成交数量)。
2)cancel_order_ex(order_param)——撤"别人"的单
它接收的就是 get_all_orders() 返回列表里的单个字典,而且只能撤 get_all_orders 返回的可撤状态订单。

3)两个必须记住的注意事项
cancel_order_ex() 仅交易模块可用,回测里没有它。
当账户下有多个策略同时运行时,调用该函数会撤掉其他策略产生的订单,可能影响正在运行的其他策略。换句话说,它是把"手术刀",也是把"镰刀"。
最后给大家一个张速查表:

四、实盘避坑清单
给大家一个附带的避坑指南,帮助大家记忆:

温馨提示:投资有风险,选择需谨慎。
下一篇资讯:
暂无下一篇



问一问
从业认证

+微信
分享该文章
