问题描述
我在某分钟开始时报单,发现成交价格按该分钟收盘价格基础上加滑点来撮合,我的理解对否?
解决方案
您的理解不完全正确。
在 JoinQuant 平台中,order_target 函数默认使用的是市价单(MarketOrder)。根据官方 API 文档的撮合机制说明,具体情况如下:
1. 默认情况(市价单)
如果您没有特别指定 style 参数,order_target 会以市价单发出。
- 撮合价格:市价单的成交价格是 最新价 + 滑点(买入加滑点,卖出减滑点)。
- 最新价的定义:在分钟频率的回测或模拟中,当您在某分钟开始时(例如
handle_data被触发时)下单,此时引擎获取到的“最新价”实际上是上一分钟的最后一个价格(即上一分钟的收盘价),而不是当前这分钟的收盘价。
结论:对于市价单,成交价格是基于上一分钟的收盘价加上滑点,而不是您所说的“该分钟收盘价格”。
2. 指定为限价单(LimitOrderStyle)
如果您在 order_target 中指定了限价单(例如 style=LimitOrderStyle(10.0)):
- 下单时撮合:系统会先尝试按“最新价(上一分钟收盘价)+ 滑点”进行撮合。如果满足限价条件,则立即成交。
- 挂单撮合:如果未能完全成交,剩余部分会挂单。挂单的限价单会在本分钟 Bar 结束时,按照本分钟的 Bar 信息(最高价、最低价)尝试撮合。如果满足条件(买价高于最低价,卖价低于最高价),则成交,成交价为您设定的委托价,而不是收盘价加滑点。
总结
- 市价单:成交价 = 上一分钟收盘价 ± 滑点。
- 限价单:成交价 = 您设定的委托价(在满足本分钟 Bar 价格区间的前提下)。
因此,系统并不会使用“当前分钟的收盘价 + 滑点”来撮合您的市价单,这主要是为了避免引入未来函数(因为在分钟开始时,当前分钟的收盘价是未知的)。