问题描述
/
解决方案
在 ptrade 量化交易平台中,order_target(指定目标数量买卖)是一个非常便捷的接口,但如果在实盘交易场景中不加控制地使用,极易造成重复下单。以下是产生重复下单的具体原因及避免方法:
一、 为什么会产生重复下单?
产生重复下单的核心原因在于底层持仓数据的更新机制与策略执行频率之间的差异。具体分为以下三种情况:
-
持仓信息同步存在时滞
当柜台返回的持仓数据体现当日变化时,交易场景中的持仓信息同步通常存在时滞(一般在 6秒左右)。假如策略在这 6 秒之内连续触发并下达两笔或更多order_target委托,由于底层持仓数量尚未瞬时更新,引擎会认为目标数量未达到,从而导致重复下单。 -
未计算在途委托数量
当第一笔order_target委托已报出但未完全成交时,如果策略不对第一笔订单进行撤单,就再次调用order_target设定相同的目标数量,ptrade 引擎在计算差额时不会包含在途的总委托数量,这同样会引发重复下单。 -
柜台持仓数据不体现当日变化
部分券商柜台的配置可能是不体现当日变化的。在这种情况下,持仓数量一天只会同步一次。这意味着无论你当天买入或卖出多少,order_target读取到的当前持仓始终是昨天的静态数据,这必然会导致严重的重复下单。
二、 如何避免重复下单?
针对上述情况,建议在交易场景中谨慎使用 order_target,如果必须使用,请采取以下措施进行规避:
1. 确认券商柜台配置
在使用该接口前,务必先向所属券商确认柜台的配置情况,了解其持仓数据是否实时更新(是否体现当日变化),以及同步的延迟时间。
2. 增加订单和持仓同步的管理逻辑
在策略代码中,不能单纯依赖 get_position 获取的持仓来直接调用 order_target,需要自行维护一个状态机或全局变量(如 g.order_flag)来管理订单状态:
- 状态拦截:在下单前检查是否已有未完成的同标的订单(可通过
get_open_orders()查询)。如果有在途订单,则跳过本次下单或先执行撤单(cancel_order)。 - 频率控制:限制对同一标的的下单频率,例如使用时间戳记录上次下单时间,确保两次下单间隔大于柜台的同步时滞(如大于 10 秒)。
3. 推荐替代方案:自行计算差额并使用 order 接口
为了绝对安全,实盘中更推荐使用基础的 order(按数量买卖)接口。您可以在策略中自行获取当前持仓、查询在途订单数量,计算出实际需要买卖的差额,然后再调用 order 进行委托。这样可以完全掌控下单逻辑,避免底层同步延迟带来的黑盒风险。