3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在聚宽(JoinQuant)的交易系统中,订单状态(OrderStatus)用于描述一个订单从创建到最终结束的生命周期。理解这些状态对于编写稳健的交易策略至关重要,特别是在处理未完成订单和撤单逻辑时。
以下是各个状态的详细解释及其转换逻辑:
聚宽的 OrderStatus 是一个枚举类型(Enum),主要包含以下几种状态:
filled 状态表示订单尚未结束,仍在等待剩余部分成交。filled 误认为是全部成交,但在聚宽中 held 才是全部成交。Order.filled 属性确认实际成交量。订单状态的流转通常遵循以下逻辑:
new。new $\rightarrow$ open。open。held(结束)。filled。held(结束)。new 或 open 时调用 cancel_order $\rightarrow$ canceled。filled(部分成交)时调用 cancel_order $\rightarrow$ canceled。rejected。在策略代码中,通常需要判断订单状态来决定是否撤单或追单。
# -*- coding: utf-8 -*-
from jqdata import *
def initialize(context):
run_daily(check_orders, '14:50') # 每天收盘前检查
def check_orders(context):
# 获取当前所有未完成的订单 (状态为 open, new, filled 的订单)
open_orders = get_open_orders()
for order_id, order_obj in open_orders.items():
# 打印订单当前状态
log.info("订单标的: %s, 状态: %s" % (order_obj.security, order_obj.status))
# 判断状态示例
if order_obj.status == OrderStatus.new:
log.info("订单尚未报盘")
elif order_obj.status == OrderStatus.open:
log.info("订单已委托,暂无成交")
elif order_obj.status == OrderStatus.filled:
log.info("订单部分成交,已成交数量: %s" % order_obj.filled)
# 示例:如果临近收盘还是部分成交或未成交,强制撤单
cancel_order(order_obj)
Q: 为什么我的订单状态一直是 new?
A: 这通常是因为您在非交易时间(如盘前或午休)下单,或者在模拟交易中使用了分钟回测但时间未推进到下一分钟。订单会在进入正式交易时间片后转为 open。
Q: canceled 的订单是否意味着完全没有买入?
A: 不一定。如果订单先处于 filled(部分成交)状态,然后被撤销,最终状态会变成 canceled。此时需要检查 order.filled 属性来确认实际成交了多少股。
Q: 如何判断一个订单是否彻底结束了?
A: 当 order.status 为 held(全部成交)、canceled(已撤销)或 rejected(已拒绝)时,该订单即为结束状态(Closed),不会再有后续变化。get_open_orders() 函数只会返回状态为 new、open 和 filled 的订单。