问题描述
解决方案
在 QMT 中,要实现一条指令同时在多个资金账户买入同一只股票,核心在于使用 passorder 函数,并将 orderType(下单方式) 参数设置为 账号组模式(即 12xx 系列代码)。
核心步骤
- 创建账号组:首先需要在 QMT 客户端界面的【系统设置】->【交易设置】->【账号组设置】中,将你的多个资金账户添加到一个组里,并给这个组起一个名字(例如
"MyGroup")。 - 编写代码:在策略代码中调用
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% 买入。 |
注意事项
- 账号组预设:代码中引用的
accountID必须与 QMT 客户端“账号组设置”中的名称完全一致。如果名称不存在,下单会失败。 - 操作逻辑:API 文档明确指出:“对所有账号组的操作相当于对账号组里的每个账号做一样的操作”。这意味着如果你设置买入 100 股,组里有 3 个账号,那么总共会产生 3 笔委托,每笔 100 股。
- 资金充足性:请确保组内每个账户都有足够的资金。如果某个账户资金不足,该账户的委托会失败,但不影响组内其他资金充足的账户下单。
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 进行查询。