3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在进行多股票组合调仓或指数跟踪策略时,逐笔发送订单不仅效率低下,还可能因网络延迟导致执行滑点变大。JoinQuant 聚宽平台提供了 batch_submit_orders API,用于实现高效的篮子交易(Batch Trading)。
batch_submit_orders(orders) 函数允许策略一次性提交一系列标的的委托。引擎在处理时会统一对所有委托进行验资与验券:若其中任何一个委托校验失败,整个批量委托将全部失败。
参数 orders 是一个包含多个订单字典的列表(list of dict)。
security (str): 标的代码,如 '000001.XSHE'。amount (int): 交易数量。正数表示买入/开多,负数表示卖出/平仓。style (OrderStyle, 可选): 订单类型,默认为 None(即 MarketOrderStyle 市价单)。支持 LimitOrderStyle 限价单等。side (str, 可选): 'long'(多单)或 'short'(空单),默认 'long'。股票/基金暂不支持开空单。pindex (int, 可选): 子仓位编号,默认为 0。close_today (bool, 可选): 平今标记,主要用于上期所、中金所等期货交易。返回一个包含 Order 对象的列表(list)。若校验失败,整个方法会执行失败或返回空。
以下示例展示了如何在策略调仓日将资金均分并使用 batch_submit_orders 进行批量购买:
import jqdata
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 设定股票调仓股票池
g.stocks = ['000001.XSHE', '600660.XSHG', '600000.XSHG']
# 每日 09:30 调仓
run_daily(rebalance, time='09:30')
def rebalance(context):
# 1. 构造批量下单的订单列表
orders_to_submit = []
buy_amount = 100 # 每只买入 100 股
for stock in g.stocks:
order_info = {
'security': stock,
'amount': buy_amount,
'style': MarketOrderStyle(), # 使用市价单
'side': 'long',
'pindex': 0
}
orders_to_submit.append(order_info)
# 2. 调用 batch_submit_orders 进行篮子委托
log.info("开始批量提交订单,股票数量: %d" % len(orders_to_submit))
submitted_orders = batch_submit_orders(orders_to_submit)
# 3. 检查下单结果
if submitted_orders:
for order_obj in submitted_orders:
log.info("订单创建成功: %s, 数量: %d, 状态: %s" %
(order_obj.security, order_obj.amount, order_obj.status))
else:
log.error("批量订单提交失败(可能因验资验券未通过)")
原子性校验(全成功或全失败):
available_cash)与持仓。如果篮子中所有买单所需的总保证金/资金超过账户当前可用资金,整个 batch_submit_orders 调用将直接被拒绝。最小交易单位:
未完成订单与状态:
new,待开盘后自动转为 open 状态进入撮合流程。get_open_orders() 查询未完成订单,或使用 batch_cancel_orders(orders) 进行批量撤单。多仓位管理(SubPortfolio):
initialize 中使用 set_subportfolios 创建了多个子账户,需在字典中准确指定 pindex 参数,避免向不支持该品种的仓位下单导致失败。