🚀 AI 一键生成 qmt 策略代码

QMT 多账户管理:如何使用 passorder 对账号组进行同步下单?

qmt | 发布时间: 2025/12/11
以下内容由 EasyQuant 生成。

问题描述

如何用一条指令同时在我的多个资金账户里买入同一只股票?

解决方案

在 QMT 中,要实现一条指令同时在多个资金账户买入同一只股票,核心在于使用 passorder 函数,并将 orderType(下单方式) 参数设置为 账号组模式(即 12xx 系列代码)

核心步骤

  1. 创建账号组:首先需要在 QMT 客户端界面的【系统设置】->【交易设置】->【账号组设置】中,将你的多个资金账户添加到一个组里,并给这个组起一个名字(例如 "MyGroup")。
  2. 编写代码:在策略代码中调用 passorder,将 accountID 参数填写为你的账号组名称,并将 orderType 设置为 1201(按股数)或 1202(按金额)。

策略代码实现

以下是一个完整的示例代码。假设你已经在 QMT 界面中创建了一个名为 "MyGroup" 的账号组。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 设置账号组名称 (需要在QMT客户端-设置-交易设置-账号组设置 中预先创建)
    ContextInfo.account_group_name = "MyGroup"
    
    # 可以在这里做一些初始化打印
    print(f"策略初始化完成,将使用账号组: {ContextInfo.account_group_name}")

def handlebar(ContextInfo):
    # 仅在最新的一根K线上运行,避免历史回测重复下单
    if not ContextInfo.is_last_bar():
        return

    # 示例:在账号组的所有账户中买入 浦发银行 (600000.SH)
    stock_code = '600000.SH'
    
    # --- 参数设置 ---
    # opType = 23: 股票买入
    opType = 23 
    
    # orderType = 1201: 单股、账号组(无权重)、普通、股/手方式下单
    # 含义:对账号组里的每个账号做一样的操作
    orderType = 1201 
    
    # accountID: 这里填账号组的名称,而不是单个资金账号
    accountID = ContextInfo.account_group_name
    
    # orderCode: 下单标的
    orderCode = stock_code
    
    # prType = 5: 最新价报价 (也可以选 11:模型价, 14:对手价等)
    prType = 5
    
    # price: 价格,prType为最新价时此参数无效,填-1即可
    price = -1
    
    # volume: 下单数量
    # 注意:在 1201 模式下,这意味着组内 *每个* 账号都买入 100 股
    volume = 100 
    
    # --- 执行下单 ---
    # 这里加一个简单的控制,防止每个tick都下单,实际策略中请根据信号触发
    # 示例逻辑:如果当前是新的一根K线(这里仅作演示,实际请结合你的交易信号)
    if ContextInfo.is_new_bar():
        passorder(opType, orderType, accountID, orderCode, prType, price, volume, ContextInfo)
        print(f"已向账号组 {accountID} 发送买入指令:{stock_code}, 每户数量:{volume}")

关键参数详解

passorder 函数中,实现多账户同买的关键是 orderType 参数。针对账号组(无权重),有以下几种常用模式:

orderType 值 含义 说明
1201 按数量下单 单股、账号组、普通、股/手方式
例如 volume=100,表示组内每个账号都买入 100 股。
1202 按金额下单 单股、账号组、普通、金额(元)方式
例如 volume=10000,表示组内每个账号都买入 10000 元市值的股票。
1213 按总资产比例 单股、账号组、总资产、比例 [0~1] 方式
例如 volume=0.1,表示组内每个账号用其总资产的 10% 买入。
1223 按可用资金比例 单股、账号组、可用、比例 [0~1] 方式
例如 volume=0.5,表示组内每个账号用其当前可用资金的 50% 买入。

注意事项

  1. 账号组预设:代码中引用的 accountID 必须与 QMT 客户端“账号组设置”中的名称完全一致。如果名称不存在,下单会失败。
  2. 操作逻辑:API 文档明确指出:“对所有账号组的操作相当于对账号组里的每个账号做一样的操作”。这意味着如果你设置买入 100 股,组里有 3 个账号,那么总共会产生 3 笔委托,每笔 100 股。
  3. 资金充足性:请确保组内每个账户都有足够的资金。如果某个账户资金不足,该账户的委托会失败,但不影响组内其他资金充足的账户下单。

Q&A

Q: 如果我想让账号组里的账户按不同权重买入怎么办?
A: 12xx 系列的 orderType 是“无权重”模式,即每个账户执行相同的动作(相同的股数、金额或比例)。如果需要精细控制每个账户买入不同的特定数量,建议在代码中遍历账户列表,循环调用 passorder(使用 1101 单账号模式)分别下单。

Q: passorder 中的 quickTrade 参数在账号组下单时有效吗?
A: 有效。如果设置 quickTrade=1,则信号触发时会立即下单;如果为 0,则会在当前 K 线走完、下一根 K 线开始时下单。

Q: 如何在代码中获取账号组里的具体账号信息?
A: QMT Python API 没有直接获取账号组内成员列表的函数。通常需要在代码中手动维护一个列表,或者直接依赖 QMT 底层的账号组功能(即直接传组名)。如果需要查询组内每个账号的持仓或资金,需要使用 get_trade_detail_data 分别传入具体的资金账号 ID 进行查询。