问题描述
我是用国金证券开通的 qmt 用最新的 xtquant 调用 xt_trader.query_bank_info(acc)时程序卡主不动,有没有哪位大神知道怎么回事啊,急求解惑,万分感谢
解决方案
在使用 xtquant 调用 xt_trader.query_bank_info(acc) 时遇到程序卡住(阻塞)的问题,通常是由以下几个原因引起的。针对国金证券的 QMT,建议按照以下步骤进行排查:
1. 券商柜台接口权限限制(最常见原因)
很多券商(包括国金证券)在 QMT 实盘/模拟环境中,出于风控和安全考虑,默认关闭或阉割了银证转账及银行信息查询相关的 API 接口。
当底层 C++ 库向柜台发送查询请求时,如果柜台不响应或直接丢弃请求,而 xtquant 的同步查询方法在等待超时前会一直阻塞主线程,就会导致“卡住不动”的现象。
解决办法:直接联系您的国金证券客户经理或量化技术支持,确认当前账号和柜台是否支持 query_bank_info 接口。如果不支持,您只能通过 QMT 客户端界面手动进行银证转账和查询。
2. 交易服务未正确连接或账号未登录
如果在调用查询接口前,xt_trader 没有成功连接到 QMT 客户端,或者资金账号未处于登录状态,请求发不出去也会导致阻塞或超时。
排查方法:
确保在调用前,连接和登录是成功的:
# 检查连接状态
connect_result = xt_trader.connect()
if connect_result != 0:
print('连接失败,错误码:', connect_result)
# 检查账号是否在已登录列表中
acc_list = xt_trader.query_account_status()
print('当前账号状态:', acc_list)
3. 尝试使用异步回调方式
如果同步方法卡死,可以尝试使用异步回调的方式来接收数据,这样至少不会阻塞主线程,便于观察底层是否真的有数据返回。
from xtquant import xttraderpass
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
class MyCallback(XtQuantTraderCallback):
def on_query_bank_info(self, bank_info):
print("收到银行信息回调:", bank_info)
# 初始化 trader 并设置回调
xt_trader = XtQuantTrader(path, session_id)
xt_trader.register_callback(MyCallback())
xt_trader.connect()
# 使用异步查询(如果有提供异步接口,通常以 _async 结尾,具体参考最新 xtquant 文档)
# 如果只有同步接口,建议将其放入单独的线程中执行,避免卡死主逻辑。
4. 查看底层日志
如果程序卡住,可以去 QMT 客户端的安装目录下(通常是 userdata/logs 或 xtquant 运行目录下的日志文件)查看底层 C++ 的日志输出。搜索 query_bank_info 相关的关键字,看是否有 timeout、reject 或 unsupported 等报错信息。
总结建议:
90% 以上的概率是因为国金证券的 QMT 柜台不支持通过 API 查询银行信息。建议您先写一个最简单的脚本,只包含连接和查询资产 (query_stock_asset),如果查询资产正常,唯独查询银行信息卡住,那基本可以断定是接口权限问题,请直接联系券商确认。