3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)量化交易平台中,及时撤销未成交的挂单对于资金周转和风险控制至关重要。本文将详细介绍如何通过 API 获取未完成订单,并使用批量撤单功能。
撤单操作主要依赖以下三个 API 函数:
get_open_orders()获取当天的所有未完成订单(挂单)。
dict),其中 key 为 order_id,value 为 Order 对象。cancel_order(order)取消单个订单。
Order 对象或 order_id。Order 对象,失败返回 None。batch_cancel_orders(orders)批量取消多个订单。
Order 对象或 order_id 的列表(list)。batch_cancel_orders 批量撤单(推荐)使用 batch_cancel_orders 可以一次性向撮合引擎提交多个撤单请求,适合盘中快速清空挂单:
# 获取当前所有未成交订单
open_orders = get_open_orders()
if open_orders:
# 将字典中的 Order 对象转换为列表传入
orders_to_cancel = list(open_orders.values())
batch_cancel_orders(orders_to_cancel)
log.info("已提交批量撤单,撤单数量: %d" % len(orders_to_cancel))
cancel_order 逐个撤单通过遍历未完成订单字典,逐个调用 cancel_order 函数:
open_orders = get_open_orders()
for order_obj in open_orders.values():
cancel_order(order_obj)
log.info("取消订单: %s" % order_obj.order_id)
以下示例展示了如何在每日收盘前(如 14:50)清空所有未成交挂单:
import jqdata
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 每天 14:50 执行批量撤单操作
run_daily(cancel_all_open_orders, time='14:50')
def cancel_all_open_orders(context):
"""撤销所有未成交挂单的函数"""
# 1. 获取未完成订单
open_orders = get_open_orders()
if not open_orders:
log.info("当前没有未成交挂单")
return
# 2. 提取 Order 对象列表并执行批量撤单
order_list = list(open_orders.values())
batch_cancel_orders(order_list)
log.info("已成功触发批量撤单,共撤销 %d 笔订单" % len(order_list))
new 转为 open,此时方可正常被 get_open_orders 捕获并撤销。