问题描述
使用组合交易
# 按篮子权重下单
table=[
{'stock':'600000.SH','weight':0.4,'quantity':0,'optType':23}, # 40%
{'stock':'600028.SH','weight':0.6,'quantity':0,'optType':24}, # 60%
]
basket={'name':'basket2','stocks':table}
set_basket(basket)
# 按组合权重 总额10000元
money = 10000
passorder(35,2102,account,'basket2',5,1,money,'',2,'strReMark',C)
报错
解决方案
您好!针对您在 QMT 平台使用组合交易时遇到的报错问题,主要原因在于 opType 参数设置错误 以及 篮子(Basket)的创建方式不符合 QMT 原生 API 规范。
以下是详细的错误分析与解决方案:
1. 错误原因分析
错误一:opType 参数值不合法
在您的代码中,passorder 的第一个参数 opType 设置为了 35。根据 QMT API 文档,35 并不是一个合法的组合交易操作类型。
QMT 支持的组合交易 opType 如下:
- 25:组合买入(或沪港通、深港通的组合买入)
- 26:组合卖出(或沪港通、深港通的组合卖出)
- 40:期货组合开多
- 43:期货组合开空
- 46:期货组合平多,优先平今
- 47:期货组合平多,优先平昨
- 48:期货组合平空,优先平今
- 49:期货组合平空,优先平昨
如果您是进行股票的组合买入,应该使用 25。
错误二:set_basket 函数不存在
QMT 的原生 Python API 中并没有提供 set_basket 这个函数。如果您直接运行这段代码,Python 会抛出 NameError: name 'set_basket' is not defined 的错误。
在 QMT 中,组合(篮子)通常需要在 QMT 客户端界面的“组合交易”或“篮子管理”模块中提前手动创建并配置好权重。在代码中,您只需要通过篮子名称(如 'basket2')直接调用即可。
2. 正确的实现步骤
第一步:在客户端创建篮子
请先在 QMT 客户端的组合交易界面,创建一个名为 basket2 的篮子,并设置好成分股及其权重(例如:浦发银行 40%,中国石化 60%)。
第二步:使用正确的 passorder 参数下单
在策略代码中,直接引用该篮子名称进行下单。
正确的代码示例:
#coding:gbk
def init(ContextInfo):
# 设置交易账号
ContextInfo.set_account('您的资金账号')
def handlebar(ContextInfo):
# 确保只在最新一根 K 线触发,避免历史 K 线重复下单
if not ContextInfo.is_last_bar():
return
account = '您的资金账号'
basket_name = 'basket2' # 必须是客户端中已经存在的篮子名称
money = 10000 # 按组合权重,总额10000元
# 参数解析:
# 25: 组合买入
# 2102: 组合、单账号、普通、按组合股票权重方式下单 (volume 单位为元)
# account: 资金账号
# basket_name: 篮子名称
# 5: 最新价
# -1: modelprice (组合下单时无效,填-1即可)
# money: 下单金额
# 'MyStrategy': 策略名称
# 2: quickTrade (2表示不判断bar状态立即触发,建议实盘用1或0)
# 'strReMark': 投资备注
passorder(25, 2102, account, basket_name, 5, -1, money, 'MyStrategy', 2, 'strReMark', ContextInfo)
print(f"已发送组合买入指令,篮子:{basket_name},金额:{money}元")
3. 总结与建议
- 检查 API 文档:组合交易的
opType必须是 25 或 26,不能是 35。 - 篮子管理:请依赖 QMT 客户端的 UI 界面来管理篮子成分,不要试图在策略代码中动态创建篮子(除非您使用了某些未公开的扩展库,但标准 API 不支持)。
quickTrade参数:您使用了2,这意味着只要代码执行到这里就会立即下单,包括在历史回测的 Bar 上。如果在实盘中,建议结合ContextInfo.is_last_bar()使用,或者将quickTrade设为1。