问题描述
解决方案
根据聚宽(JoinQuant)的交易引擎机制,在非交易时段(如开盘前或收盘后)下单,订单不会立即失败,而是会生成一个订单对象并进入**挂单(Pending)**状态,等待下一个交易时间窗口进行撮合。
具体处理逻辑取决于您下单的具体时间点:
1. 开盘前下单(例如 09:00 - 09:30)
- 处理方式:订单会挂单(状态通常为
open),等待 09:30 开盘。 - 撮合逻辑:
- 日频策略:在 09:30 开盘时,使用开盘价(或集合竞价结果)尝试撮合。
- 分钟/Tick频策略:在 09:30 开始的第一个分钟 Bar 或 Tick 结束时尝试撮合。
- 注意:模拟盘中,建议尽量避免在 09:00 以前下单,可能会因为未获取到涨跌停价而导致委托异常。
2. 中午休市下单(11:30 - 13:00)
- 处理方式:订单会挂单,等待 13:00 下午开盘。
- 撮合逻辑:下午开盘后,按照正常的盘口或最新价逻辑进行撮合。
3. 收盘后下单(15:00 以后)
这是最需要注意的情况:
- 处理方式:订单会暂时挂单,但是不会成交。
- 最终结果:聚宽的机制是**“所有未完成订单将在本交易日结束后撤销”**(通常在当日 16:00 - 17:00 左右进行结算)。
- 结论:如果您在周一收盘后(如 15:30)下单,该订单不会延续到周二开盘,而是会在周一傍晚被系统自动撤销。如果您希望在周二开盘买入,需要在周二的
before_trading_start(09:00) 或handle_data(09:30) 中下单。
总结表
| 下单时间 | 订单状态 | 处理结果 |
|---|---|---|
| 09:00 - 09:30 | 挂单 (Open) | 等待 09:30 开盘撮合 |
| 11:30 - 13:00 | 挂单 (Open) | 等待 13:00 开盘撮合 |
| 15:00 - 16:00 | 挂单 (Open) | 无法成交,并在当日结算时被系统自动撤单 |
特殊设置(仅限回测)
如果您希望在非交易时间下单并立即以收盘价成交(仅用于特定研究目的,不符合真实交易规则),可以在 initialize 中开启实验性选项:
# 总是撮合市价单,支持在非交易时间下市价单,按照最新的数据立即撮合
set_option("always_match_market_order", True)
注意:这属于未来函数的一种形式,实盘中无法实现,不建议在严谨的策略中使用。
Q&A
Q: 如果我想在收盘后根据今天的收盘价决定明天的买卖,代码应该写在哪里?
A: 应该写在 before_trading_start 函数中(每天 09:00 运行),或者使用 run_daily 设置在 09:30 运行的函数中。在这些函数里,您可以获取昨天的收盘数据进行判断,并下达当天的订单。
Q: 为什么我在 after_trading_end (15:30) 下单没有报错,但第二天持仓没变化?
A: 因为 after_trading_end 运行时市场已收盘。虽然下单函数返回了订单对象(代表下单动作成功),但由于市场关闭无法撮合,该订单处于“未完成”状态。聚宽系统会在当天结算时自动撤销所有未完成订单,因此该订单不会延续到第二天。
Q: 集合竞价期间(09:15-09:25)的订单怎么处理?
A: 在聚宽的回测和模拟中,09:30 之前下的单通常统一在 09:30 开盘时刻进行撮合处理。如果您使用的是 Tick 级回测,逻辑会更接近交易所实盘,但在分钟/日级回测中,效果等同于开盘撮合。