问题描述
解决方案
在 JoinQuant 聚宽平台中,获取订单详细信息主要涉及两个方面:一是获取订单对象(Order Object),二是访问该对象的属性。
您可以通过下单函数的返回值直接获取订单对象,也可以通过 get_orders() 函数查询历史或当前订单。
以下是详细的获取方法和代码示例:
1. 核心方法
方法一:直接利用下单函数的返回值
当您调用 order、order_target、order_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。