问题描述
国金证券的客户, python3.11, 查询成交记录会卡住, 当日如果没有成交记录,则正常返回[]空数组,但是如果有成交记录,则一定会卡住不返回.
看到之前有人也遇见过这个问题,但是不知道如何解决? @ 官方客服
解决方案
问题分析
在 QMT 平台(如国金证券)中,遇到查询成交记录(如使用 query_stock_trades)在有数据时卡死、无数据时返回空数组的问题,通常是由以下两个核心原因导致的:
1. Python 版本兼容性问题(核心原因)
根据 QMT 官方 API 文档说明,QMT 内置的 Python 版本为 3.6.8。QMT 的底层接口是基于 C++ 编写的,Python API 通过 C++ 扩展模块(DLLs)进行绑定。当您使用 Python 3.11(通常是在外部独立运行 MiniQMT/xtquant 时)去调用底层接口时,如果返回的是空数组 [],内存结构较简单,不会触发异常;但当有实际成交记录返回复杂的 C++ 对象时,由于 Python 3.11 与 Python 3.6 的底层 C-API 内存管理机制存在差异,极易导致内存访问冲突(Access Violation)或死锁,从而表现为程序完全卡住且无报错。
2. API 接口调用的规范性
query_stock_trades 通常是外部封装库(如 xtquant)的用法。在 QMT 官方标准 Python API 中,查询成交记录的标准函数是 get_trade_detail_data。
解决方案
方案一:降级 Python 版本至 3.6.8(强烈推荐)
为了保证与 QMT 底层 C++ 接口的完美兼容,建议将您的 Python 环境降级到官方推荐的 3.6.8 版本。官方文档明确指出:
“目前 QMT 内置的 Python 版本为 3.6.8,安装的官方的 Python 版本最好也是 3.6.8,这样安装的库有最好的兼容性。”
方案二:使用 QMT 官方标准 API get_trade_detail_data
如果您是在 QMT 平台内部编写策略,请使用官方提供的 get_trade_detail_data 函数来获取成交明细(DEAL)。
函数用法:
get_trade_detail_data(accountID, strAccountType, strDatatype)
参数说明:
accountID:资金账号(字符串)。strAccountType:账号类型,股票填'STOCK'。strDatatype:数据类型,查询成交记录填'DEAL'。
标准代码示例:
#coding:gbk
def init(ContextInfo):
# 设置对应的资金账号
ContextInfo.accid = '您的资金账号'
ContextInfo.set_account(ContextInfo.accid)
def handlebar(ContextInfo):
# 获取股票的成交明细数据
deal_list = get_trade_detail_data(ContextInfo.accid, 'stock', 'deal')
if not deal_list:
print("当日无成交记录")
return
for deal_obj in deal_list:
# 打印成交的证券代码和成交量
print("成交代码:", deal_obj.m_strInstrumentID)
print("成交数量:", deal_obj.m_nVolume)
print("成交均价:", deal_obj.m_dPrice)
print("成交时间:", deal_obj.m_strTradeTime)
# 如果需要查看所有可用属性,可以使用 dir()
# print(dir(deal_obj))
方案三:使用成交状态变化主推回调(实盘推荐)
如果您是在实盘运行模式下,为了避免主动查询带来的阻塞,建议使用交易回报实时主推函数 deal_callback。当有新的成交时,系统会自动推送,无需主动轮询。
#coding:gbk
def init(ContextInfo):
# 必须在 init 中绑定账号,才能接收主推回报
ContextInfo.set_account('您的资金账号')
def handlebar(ContextInfo):
pass
# 当账号成交状态有变化时,系统自动调用此函数
def deal_callback(ContextInfo, dealInfo):
print("收到实时成交回报!")
print("成交代码:", dealInfo.m_strInstrumentID)
print("成交数量:", dealInfo.m_nVolume)
总结:请优先检查您的 Python 环境版本。如果是外部调用,务必切换至 Python 3.6.8 虚拟环境;如果是 QMT 内部策略,请严格使用 get_trade_detail_data 接口。