3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,限价单可能因为价格波动未达到预期而未能及时成交。为了释放被挂单冻结的资金或仓位,我们需要在策略中对未成交订单进行管理与撤销。本文将详细介绍如何在 JoinQuant(聚宽)平台中使用 get_open_orders() 和 cancel_order() 函数实现精准撤单。
get_open_orders()用于获取当前交易日所有处于未完成状态(open / filled 部分成交)的订单。
order_id,value 为 Order 对象。cancel_order(order)用于取消指定的挂单。
order,可以是 Order 对象或者订单 ID(order_id)。Order 对象,订单不存在或已结束则返回 None。在 after_trading_end(收盘后运行函数)中清理所有挂单:
import jqdata
def initialize(context):
# 设置基准与复权
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 每日收盘后运行
run_daily(after_market_close, time='15:30')
def after_market_close(context):
# 1. 获取当前所有未完成订单
open_orders = get_open_orders()
# 2. 遍历并逐一撤单
for order_id, order_obj in open_orders.items():
cancel_result = cancel_order(order_obj)
if cancel_result:
log.info(f"收盘成功撤销订单: {order_id}, 标的: {order_obj.security}")
如果挂单超过一定时间未成交(例如买入单超过 10 分钟未撮合),可以通过记录订单时间进行超时撤单:
import jqdata
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 每分钟检查一次挂单
run_daily(check_and_cancel_timeout_orders, time='every_bar')
def check_and_cancel_timeout_orders(context):
open_orders = get_open_orders()
current_dt = context.current_dt
for order_id, order_obj in open_orders.items():
# 计算订单挂单时长(单位:秒)
time_delta = (current_dt - order_obj.add_time).total_seconds()
# 超过 600 秒(10分钟)未成交则撤单
if time_delta > 600:
cancel_order(order_obj)
log.info(f"订单 {order_id} 挂单超时({time_delta}秒),已执行撤单")
order_target 或 order_target_value 接口时,如果该标的当前已有未完成订单,系统会自动先取消之前未完成的订单再创建新订单。locked_cash(挂单锁住资金)或 locked_amount(挂单冻结仓位),撤单成功后资金或持仓会立即释放。