🚀 AI 一键生成 joinquant 策略代码

JoinQuant 交易必知:在盘前、盘后等非交易时段下单会发生什么?

joinquant | 发布时间: 2025/12/11
以下内容由 EasyQuant 生成。

问题描述

如果我在收盘后或者开盘前下一个订单,这个订单会怎么处理?是会立刻失败还是会等到开盘再执行?

解决方案

根据聚宽(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 级回测,逻辑会更接近交易所实盘,但在分钟/日级回测中,效果等同于开盘撮合。