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

JoinQuant 平台如何快速撤销所有未成交挂单?(基于 batch_cancel_orders 教程)

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 订单管理:使用 batch_cancel_orders 实现盘中一键批量撤单

Question: 如何在 joinquant 策略中快速撤销所有未成交的挂单?

解决方案

JoinQuant 订单管理:快速撤销所有未成交挂单指南

在 JoinQuant(聚宽)量化交易平台中,及时撤销未成交的挂单对于资金周转和风险控制至关重要。本文将详细介绍如何通过 API 获取未完成订单,并使用批量撤单功能。


1. 核心 API 介绍

撤单操作主要依赖以下三个 API 函数:

1.1 get_open_orders()

获取当天的所有未完成订单(挂单)。

  • 返回值:返回一个字典(dict),其中 keyorder_idvalueOrder 对象。

1.2 cancel_order(order)

取消单个订单。

  • 参数Order 对象或 order_id
  • 返回值:成功时返回 Order 对象,失败返回 None

1.3 batch_cancel_orders(orders)

批量取消多个订单。

  • 参数:包含 Order 对象或 order_id 的列表(list)。

2. 撤单实现方式

方法一:使用 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)

3. 完整策略代码示例

以下示例展示了如何在每日收盘前(如 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))

4. 注意事项

  1. 交易日自动撤单规则:根据 A 股及期货交易所规则,所有未完成订单在每个交易日收盘结束时由系统自动撤销。
  2. 非交易时间下单:非交易时间下限价单会进入挂单状态,开盘后状态从 new 转为 open,此时方可正常被 get_open_orders 捕获并撤销。
  3. 挂单冻结资金/持仓:撤单成功后,冻结的资金或股票/期货持仓会立即释放。