🚀 AI 一键生成 joinquant 策略代码

JoinQuant Order 对象全解析:如何获取订单状态、成交量与均价?

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

问题描述

如何获取一个订单的详细信息,比如它的状态、成交了多少、成交均价是多少?

解决方案

在 JoinQuant 聚宽平台中,获取订单详细信息主要涉及两个方面:一是获取订单对象(Order Object),二是访问该对象的属性

您可以通过下单函数的返回值直接获取订单对象,也可以通过 get_orders() 函数查询历史或当前订单。

以下是详细的获取方法和代码示例:

1. 核心方法

方法一:直接利用下单函数的返回值

当您调用 orderorder_targetorder_value 等下单函数时,如果创建成功,它们会立即返回一个 Order 对象。您可以直接访问该对象的属性。

方法二:使用 get_orders() 查询

如果您只有订单 ID,或者想查询特定标的的所有订单,可以使用 get_orders() 函数。

  • 语法get_orders(order_id=None, security=None, status=None)
  • 返回值:一个字典(dict),key 是 order_id,value 是 Order 对象。

2. 关键属性说明(Order 对象)

获取到 Order 对象后,可以通过以下属性获取您需要的信息:

属性名 说明 备注
status 订单状态 类型为 OrderStatus 枚举(如 OrderStatus.filled 表示全部成交,OrderStatus.open 表示未完成)。
filled 已成交数量 已经成交的股票/期货数量。
price 成交均价 已经成交部分的平均价格(一个订单可能分多笔成交)。
amount 下单总数量 原始委托的数量。
security 标的代码 例如 '000001.XSHE'。
order_id 订单 ID 订单的唯一标识符。
add_time 订单创建时间 datetime 对象。
action 开平仓方向 'open' (开仓) 或 'close' (平仓)。
commission 交易费用 包含佣金、印花税等。

3. 代码示例

以下是一个完整的策略代码示例,展示了如何在下单后立即查看信息,以及如何在收盘后查询特定订单的信息。

# -*- coding: utf-8 -*-
from jqdata import *

def initialize(context):
    # 设置基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 每天开盘时运行
    run_daily(market_open, time='09:30')
    # 收盘后运行
    run_daily(after_market_close, time='15:30')

def market_open(context):
    # 1. 下单并获取返回的 Order 对象
    g.security = '000001.XSHE'
    print("--- 开始下单 ---")
    order_obj = order(g.security, 100)
    
    # 2. 检查订单是否创建成功
    if order_obj is None:
        print("下单失败(可能是停牌、资金不足或非法标的)")
    else:
        # 保存 order_id 供后续查询测试
        g.last_order_id = order_obj.order_id
        
        # 3. 打印订单详细信息
        print("下单成功,订单ID: {}".format(order_obj.order_id))
        print("标的: {}".format(order_obj.security))
        print("下单数量: {}".format(order_obj.amount))
        print("当前状态: {}".format(order_obj.status)) # 注意:刚下单时通常是 new 或 open
        print("已成交数量: {}".format(order_obj.filled))
        print("成交均价: {}".format(order_obj.price))

def after_market_close(context):
    print("--- 收盘后查询订单 ---")
    if hasattr(g, 'last_order_id'):
        # 4. 通过 ID 获取订单详细信息
        # get_orders 返回的是字典,需要通过 .get() 或 values() 获取对象
        orders_dict = get_orders(order_id=g.last_order_id)
        
        # 获取具体的 Order 对象
        my_order = orders_dict.get(g.last_order_id)
        
        if my_order:
            print("订单 {} 最终状态:".format(my_order.order_id))
            
            # 判断状态
            if my_order.status == OrderStatus.filled:
                print("状态: 全部成交")
            elif my_order.status == OrderStatus.canceled:
                print("状态: 已撤销")
            else:
                print("状态代码: {}".format(my_order.status))
                
            print("最终成交数量: {}".format(my_order.filled))
            print("最终成交均价: {}".format(my_order.price))
            print("交易费用: {}".format(my_order.commission))

4. 关于订单状态(OrderStatus)

order.status 返回的是一个枚举类型。在判断状态时,建议使用 OrderStatus 类进行比较,或者将其转换为字符串查看。

常见的状态包括:

  • OrderStatus.new (8): 订单新创建未委托。
  • OrderStatus.open (0): 已委托,未成交或部分成交。
  • OrderStatus.filled (1): 全部成交。
  • OrderStatus.canceled (2): 已撤销。
  • OrderStatus.rejected (3): 交易所拒绝(废单)。

Q&A

Q: get_orders()get_open_orders() 有什么区别?
A: get_orders() 可以查询当天所有的订单(包括已成交、已撤销、未完成的),也可以通过参数筛选特定 ID 或标的。而 get_open_orders() 专门用于获取当前未完成(即状态为 open 或 new)的订单,通常用于盘中检查是否有挂单未成交。

Q: 为什么下单后立即打印 order.price 可能是 0 或不准确?
A: 如果您使用的是市价单或在回测中,下单函数返回 Order 对象时,订单可能刚刚创建(状态为 new)或刚刚提交(状态为 open),撮合尚未完成,因此成交均价 price 和成交数量 filled 可能尚未更新。在回测模式下,市价单通常会立即撮合,但在模拟交易或实盘中,建议稍后查询或在 get_orders 中查询以获得最终成交结果。

Q: 如何判断订单是否全部成交?
A: 可以判断 order.status == OrderStatus.filled,或者判断 order.filled == order.amount