问题描述
用券商的 MINIQMT,已经成功登陆 MINIQMT, 无论用 miniqmt 内部 python 还是外部 pycharm 都出现错误。
代码如下(教程中的代码)
xt_trader = XtQuantTrader(path, session_id)
acc = StockAccount('*****') #******是券商资金账号
xt_trader.start()
connect_result = xt_trader.connect()
print('建立交易连接,返回 0 表示连接成功', connect_result)
subscribe_result = xt_trader.subscribe(acc)
print('对交易回调进行订阅,订阅后可以收到交易主推,返回 0 表示订阅成功', subscribe_result)
#取账号信息
account_info = xt_trader.query_stock_asset(acc)
print('account_info =',account_info )
运行后发现错误如下:
连接函数 connect()连接成功返回 0,
但订阅函数 subscribe()不成功,返回-1,
函数 query_stock_asset()返回 None, 也不成功, account_info =None
这是为什么,如何解决?
解决方案
在 miniQMT (XtQuant) 中,connect() 返回 0 说明您的 Python 代码已经成功与 miniQMT 客户端建立了底层通信连接。但是 subscribe() 返回 -1 以及 query_stock_asset() 返回 None,说明客户端无法识别或无权访问您指定的资金账号。
这通常是由以下几个原因引起的,请逐一排查:
1. 账号类型设置错误(最常见)
您在代码中使用了 StockAccount('*****'),这代表普通股票账户。如果您登录的是信用账户(融资融券账号),必须使用 CreditAccount 类。
- 普通账户:
from xtquant.xttype import StockAccount; acc = StockAccount('资金账号') - 信用账户:
from xtquant.xttype import CreditAccount; acc = CreditAccount('资金账号')
2. 资金账号字符串不匹配
请检查传入的资金账号字符串是否与 miniQMT 客户端左上角或交易面板中显示的账号完全一致。不要包含多余的空格,也不要误填为客户号或登录账号(有些券商的登录号和资金账号不同)。
3. path 路径指向错误
XtQuantTrader(path, session_id) 中的 path 必须指向当前正在运行且已登录的 miniQMT 客户端的 userdata_mini 文件夹。如果您的电脑上安装了多个 QMT/miniQMT,或者路径指向了普通的 userdata 文件夹,就会出现连接成功(连到了另一个进程)但找不到账号的情况。
- 正确路径示例:
r'D:\国信证券QMT交易端\userdata_mini'
4. 客户端交易连接未就绪
虽然您已经登录了 miniQMT,但请检查客户端右下角的连接状态。如果“交易”显示为红色断开状态,API 同样无法订阅和查询资产。请确保客户端内的交易模块已成功连接到券商服务器。
💡 建议的调试代码
您可以加上账号类型的判断和更详细的打印信息来排查:
from xtquant.xttrader import XtQuantTrader
from xtquant.xttype import StockAccount, CreditAccount
import random
# 1. 确保路径是 userdata_mini
path = r'D:\您的券商QMT安装目录\userdata_mini'
session_id = int(random.randint(100000, 999999))
xt_trader = XtQuantTrader(path, session_id)
# 2. 根据实际情况选择账户类型
account_id = '您的资金账号'
# 如果是普通账户:
acc = StockAccount(account_id)
# 如果是两融账户,请注释上一行并取消注释下一行:
# acc = CreditAccount(account_id)
xt_trader.start()
connect_result = xt_trader.connect()
print('建立交易连接,返回 0 表示连接成功:', connect_result)
if connect_result == 0:
subscribe_result = xt_trader.subscribe(acc)
print('交易回调订阅状态 (0为成功):', subscribe_result)
if subscribe_result == 0:
account_info = xt_trader.query_stock_asset(acc)
if account_info:
print('资产查询成功,总资产:', account_info.m_dBalance)
else:
print('资产查询返回 None,请检查账号是否有资产或是否为信用账户未正确声明。')
else:
print('订阅失败!请严格检查:1.账号是否与客户端一致 2.是否为信用账户 3.path是否指向userdata_mini')