🚀 AI 一键生成 qmt 策略代码

QMT 平台查询成交记录卡住无返回的解决办法

qmt | 发布时间: 2026/5/21
以下内容由 EasyQuant 生成。

问题描述

查询成交记录会卡住query_stock_trades(account)

国金证券的客户, 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 接口。