🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant实盘中Order对象更新频率是多少?如何正确判断订单是否成交?

joinquant | 发布时间: 2026/5/29
以下内容由 EasyQuant 生成。

问题描述

实盘中关于order对象

请问一创实盘中order对象的更新频率为多少?我程序写的是每隔2.5s下一次限价单,然后判断order.filled == order.amount。
问题是我看了我的第一创业里面的下单详情,显示委托后1s就全部成交了,那么为什么我实盘中好像order.filled == order.amount不满足呢? 是order对象没有立即更新吗?

解决方案

首先需要说明的是,根据聚宽官方公告,一创聚宽(实盘)已于2023-12-29停止维护,目前聚宽不提供任何形式的实盘及交易通道服务。但针对您提到的 Order 对象状态更新问题,其背后的机制在模拟盘和以往的实盘中是通用的。

您遇到的 order.filled == order.amount 不满足的问题,并不是因为底层订单没有成交,而是因为您检查的 Order 对象没有更新

为什么 order.filled 没有更新?

在 JoinQuant 中,当您调用下单函数(如 order()order_target() 等)时,如果委托成功,系统会返回一个 Order 对象。这个返回的 Order 对象只是下单那一瞬间的“状态快照”。它是一个只读对象,其内部的属性(如 statusfilled 等)不会随着实际交易的进行而自动、实时地在内存中更新

因此,如果您在代码中一直用下单时返回的那个 order 变量去判断 order.filled == order.amount,它的值永远是下单那一刻的值(通常 filled 为 0),即使券商端已经全部成交,这个旧对象的属性也不会改变。

正确的判断方法

要获取订单的最新状态,您必须通过 API 重新向系统查询该订单的最新信息。正确的做法是使用 get_orders()get_open_orders() 函数。

示例代码:

# 1. 下单并获取订单ID
my_order = order('000001.XSHE', 100, LimitOrderStyle(10.0))

if my_order is not None:
    order_id = my_order.order_id
    
    # 2. 在后续的逻辑中(比如隔几秒后,或者在 handle_data/handle_tick 中)
    # 使用 get_orders 重新查询该订单的最新状态
    latest_orders = get_orders(order_id=order_id)
    
    if order_id in latest_orders:
        latest_order = latest_orders[order_id]
        
        # 3. 使用最新查询到的订单对象进行判断
        if latest_order.filled == latest_order.amount:
            log.info("订单已全部成交!")
        elif str(latest_order.status) == 'held':
            log.info("订单状态为全部成交(held)")
        else:
            log.info(f"订单尚未全部成交,当前成交量: {latest_order.filled}")

关于实盘/模拟盘的订单延迟

除了对象本身不自动更新外,实盘交易中订单状态的流转还涉及以下过程:

  1. 策略发出委托指令。
  2. 指令通过网络发送至券商柜台。
  3. 券商报送交易所撮合。
  4. 交易所返回成交回报给券商。
  5. 券商接口将成交回报同步给量化平台。

这个过程存在一定的网络和系统异步延迟。虽然您在券商APP上看到1秒就成交了,但量化平台接收到异步回报可能存在微小的时差。因此,在编写高频或依赖订单状态的策略时,必须通过 get_orders() 轮询或在下一个事件循环中检查最新状态,而不能假设下单后代码执行到下一行时订单就已经成交。