问题描述
解决方案
您的观察是非常准确的,JoinQuant(聚宽)系统的撮合机制确实是这样设置的。这主要与聚宽平台的 K线时间戳标识(后对齐) 以及 市价单撮合逻辑 有关。
以下是详细的机制解析:
1. K线时间戳是“后对齐”的
在聚宽平台中,所有的行情K线数据为后对齐,即标识K线的时间为该分钟数据的结束时间。
- 例如:时间戳标识为
11:15:00的一分钟K线(Bar),它实际包含的数据时间段是11:14:00 ~ 11:14:59。 - 这根K线的“收盘价”,实际上就是
11:14:59这一刻的最新价格。
2. 分钟回测的运行时间点
在按分钟回测时,策略(如 handle_data 函数)是在每分钟的第一秒运行的。
- 当您的策略在
11:15:00被触发执行时,系统传入的data是上一分钟的数据,也就是标识为11:15:00的这根K线(包含了11:14:00 ~ 11:14:59的行情)。
3. 市价单的撮合价格逻辑
根据聚宽API文档中关于【下单时的撮合逻辑】的说明:
- 交易价格:最新价 + 滑点。
- 最新价的定义:如果在开盘时刻(如09:30)运行,最新价格为开盘价。其他情况下,为上一分钟的最后一个价格(或上一个tick的最新价)。
总结您的场景
当您在 11:15:00 触发交易信号并下达市价单时:
- 系统会立即进行撮合。
- 撮合使用的“最新价”是上一分钟的最后一个价格。
- 上一分钟的最后一个价格,正好就是标识为
11:15:00这根K线的收盘价。
因此,您看到在 11:15:00 下单,成交价格使用的是 11:15 这根K线的收盘价,这完全符合聚宽系统的底层回测撮合设计。系统假设在 11:15:00 这一刻,您能获取到的最新市场切片价格就是上一分钟结束时的价格。