量化之MiniQMT 实战:一键读取通达信自选股并实时监控涨跌幅(附完整可运行代码)

摘要

本文解决了通达信选股与 MiniQMT 交易之间的数据互通痛点 ,教你如何用 Python 读取通达信ZXG.blk自选股文件,自动转换为 QMT 标准代码格式,并通过 QMT 原生 API 实时获取自选股的最新价、涨跌幅、股票名称等核心行情数据。文章附带完整可运行且修正了语法错误的代码,同时提供自动交易、消息推送、概念关联、分时均线监控等进阶扩展功能思路,特别适合同时使用通达信做策略选股、MiniQMT 做量化交易的投资者和量化入门学习者。

一、前言

通达信凭借强大的公式系统和便捷的条件选股功能,成为很多投资者盘后选股和复盘的首选工具。很多交易者会将通达信策略选出的股票加入自选股,第二天手动监控涨跌幅并择机下单。

但手动盯盘不仅耗时耗力,还容易错过最佳交易时机。而 MiniQMT 作为国内主流的量化交易终端,支持 Python API 自动化交易,却无法直接读取通达信的自选股数据。

本文将手把手教你打通两者的数据壁垒,实现:

  1. 一键读取通达信自选股列表,自动转换为 QMT 标准代码
  2. 实时获取所有自选股的最新行情和涨跌幅
  3. 基于涨跌幅数据扩展自动化交易、消息推送等功能

二、核心实现原理

2.1 通达信自选股文件格式

通达信的自选股数据存储在本地的ZXG.blk文件中,文件路径通常为:

复制代码
你的通达信安装目录\T0002\blocknew\zxg.blk

文件采用GBK 编码,每行存储一个 7 位格式的股票代码:

  • 第 1 位为交易所前缀:0代表深交所(主板、创业板)、1代表上交所(主板、科创板)、2代表北交所
  • 后 6 位为股票纯数字代码

例如:0000001对应平安银行(000001.SZ),1600000对应浦发银行(600000.SH)。

2.2 QMT 行情 API 调用流程

  1. 通过xtdata.subscribe_quote订阅指定股票的 Tick 级实时行情
  2. 等待 3 秒确保数据更新完成(可根据网络情况调整)
  3. 通过xtdata.get_full_tick获取最新 Tick 数据
  4. 最新价(lastPrice)昨收价(lastClose)计算涨跌幅
  5. 通过xtdata.get_instrument_detail获取股票中文名称

三、分步代码实现详解

3.1 环境准备

  1. 安装并登录 MiniQMT 客户端,确保开启了 Python API 权限
  2. 本文代码直接在 MiniQMT 内置的 Python 环境中运行即可,无需额外安装第三方库

3.2 读取通达信自选股文件

该函数负责解析ZXG.blk文件,将通达信 7 位代码转换为 QMT 兼容的代码.交易所格式。

复制代码
import os
from tquant import xtdata
import time

def read_tdx_blk(blk_file_path):
    """
    读取通达信自选股ZXG.blk文件,并返回转换后的标准股票代码列表
    Parameters:
        blk_file_path (str): 通达信自选股ZXG.blk文件的完整路径
    Returns:
        list: 标准格式的股票代码列表,例如['000001.SZ', '600000.SH']
    """
    standard_codes = []
    try:
        # 通达信文件采用GBK编码
        with open(blk_file_path, 'r', encoding='gbk') as f:
            lines = f.readlines()
        
        for line in lines:
            tdx_code = line.strip()
            # 只处理7位格式的通达信代码
            if len(tdx_code) == 7:
                exchange_prefix = tdx_code[0]
                stock_code = tdx_code[1:7]
                
                # 根据前缀转换为对应交易所代码
                if exchange_prefix == '0':
                    standard_code = stock_code + '.SZ'  # 深交所
                elif exchange_prefix == '1':
                    standard_code = stock_code + '.SH'  # 上交所
                elif exchange_prefix == '2':
                    standard_code = stock_code + '.BJ'  # 北交所
                else:
                    standard_code = None
                
                if standard_code:
                    standard_codes.append(standard_code)
        
        print(f"✅ 成功从{blk_file_path}读取{len(standard_codes)}只自选股")
    except Exception as e:
        print(f"❌ 读取自选股文件出错: {e}")
    
    return standard_codes

3.3 获取股票中文名称

通过 QMT 内置 API 根据标准代码获取股票名称,提升输出结果的可读性。

复制代码
def get_stock_name(full_code):
    """
    通过QMT API根据股票代码获取对应的股票名称
    Parameters:
        full_code (str): 标准格式的股票代码,例如"000001.SZ"
    Returns:
        str: 股票名称,如果获取失败则返回"未知证券"
    """
    if not isinstance(full_code, str) or '.' not in full_code:
        return "未知证券"
    
    stock_name = "未知证券"
    try:
        instrument_detail = xtdata.get_instrument_detail(full_code)
        if instrument_detail and isinstance(instrument_detail, dict):
            stock_name = instrument_detail.get("InstrumentName", "未知证券")
    except Exception as e:
        print(f"⚠️ 获取证券名称失败(QMT API错误): {e}")
    
    return stock_name

3.4 实时获取行情与涨跌幅计算

批量获取自选股的实时 Tick 数据,计算涨跌幅并返回结构化结果。

复制代码
def get_realtime_stock_info(stock_list):
    """
    获取指定股票列表的实时行情信息(名称、涨跌幅、最新价)
    Parameters:
        stock_list (list): 标准格式的股票代码列表,例如['000001.SZ', '600000.SH']
    Returns:
        dict: 包含股票实时信息的字典
    """
    if not stock_list:
        return {}
    
    # 订阅所有自选股的Tick行情
    for stock_code in stock_list:
        xtdata.subscribe_quote(stock_code, period='tick', count=1)
    
    # 等待3秒确保行情数据更新完成(网络差可适当延长)
    time.sleep(3)
    
    realtime_data = {}
    for stock_code in stock_list:
        try:
            tick_data = xtdata.get_full_tick([stock_code])
            if tick_data and stock_code in tick_data:
                tick_info = tick_data[stock_code]
                last_price = tick_info.get("lastPrice", 0)
                pre_close = tick_info.get("lastClose", 1)
                
                # 计算涨跌幅(处理昨收价为0的异常情况)
                if pre_close and pre_close != 0:
                    change_percent = (last_price - pre_close) / pre_close * 100
                else:
                    change_percent = 0
                
                # 获取股票名称
                stock_name = get_stock_name(stock_code)
                
                realtime_data[stock_code] = {
                    'name': stock_name,
                    'change_percent': round(change_percent, 2),  # 保留2位小数
                    'last_price': round(last_price, 3)  # 保留3位小数(适配北交所0.001元报价)
                }
            else:
                print(f"⚠️ 未能获取{stock_code}的实时数据")
                realtime_data[stock_code] = None
        except Exception as e:
            print(f"❌ 获取{stock_code}实时数据时出错: {e}")
            realtime_data[stock_code] = None
    
    return realtime_data

3.5 主函数调用

复制代码
def main():
    """主函数: 读取自选股并获取实时行情"""
    # ====================== 请修改为你自己的通达信自选股文件路径 ======================
    tdx_blk_path = r"D:\wjnew_tdx\T0002\blocknew\zxg.blk"
    # ==============================================================================
    
    # 1. 读取通达信自选股
    stock_list = read_tdx_blk(tdx_blk_path)
    if not stock_list:
        print("❌ 未读取到自选股代码,请检查文件路径是否正确")
        return
    
    print(f"\n📋 自选股列表: {stock_list}")
    
    # 2. 获取实时行情数据
    print("\n⏳ 开始获取实时行情数据...")
    realtime_info = get_realtime_stock_info(stock_list)
    
    # 3. 格式化打印结果
    print("\n" + "="*60)
    print("📊 通达信自选股实时行情")
    print("="*60)
    print(f"{'股票代码':<10}{'股票名称':<10}{'最新价':<10}{'涨跌幅(%)':<10}")
    print("-"*60)
    
    for code, info in realtime_info.items():
        if info:
            print(f"{code:<10}{info['name']:<10}{info['last_price']:<10}{info['change_percent']:<10}")
        else:
            print(f"{code:<10}{'数据获取失败':<10}{'-':<10}{'-':<10}")
    
    print("="*60)

if __name__ == "__main__":
    main()

四、运行效果与使用说明

  1. 修改文件路径 :将代码中tdx_blk_path变量的值替换为你本地通达信ZXG.blk文件的实际路径
  2. 运行代码:将完整代码复制到 MiniQMT 的 Python 编辑器中,点击运行
  3. 查看结果:控制台会输出读取到的自选股数量、代码列表,以及格式化后的实时行情表格

示例输出:

复制代码
✅ 成功从D:\wjnew_tdx\T0002\blocknew\zxg.blk读取3只自选股

📋 自选股列表: ['000001.SZ', '600000.SH', '000651.SZ']

⏳ 开始获取实时行情数据...

============================================================
📊 通达信自选股实时行情
============================================================
股票代码    股票名称    最新价      涨跌幅(%)   
------------------------------------------------------------
000001.SZ  平安银行    12.56      1.23       
600000.SH  浦发银行    8.92       -0.56      
000651.SZ  格力电器    35.78      2.15       
============================================================

五、进阶扩展功能

有了自选股的实时涨跌幅数据,我们可以进一步实现更多实用功能:

5.1 阈值触发自动交易与消息推送

  • 自动交易 :当某只股票涨跌幅超过设定阈值(如上涨 5% 或下跌 3%)时,调用 QMT 的xt_trader.order_batch接口自动下单
  • 消息推送:通过企业微信机器人、钉钉机器人或 QQ 邮箱将告警信息发送到手机,适合上班无法盯盘的投资者

5.2 自选股概念标签关联

通过东方财富、同花顺等第三方数据源获取股票的概念板块信息,与自选股代码进行匹配,快速筛选出符合热点概念的股票。

5.3 分时均线监控与策略执行

扩展代码获取分时 K 线数据,计算分时均价线,当股价站稳分时均线时触发买入信号,跌破分时均线时触发卖出信号。

六、常见问题排查

  1. 自选股文件读取失败

    • 检查文件路径是否正确,注意路径中的反斜杠需要用r前缀转义
    • 确认通达信客户端已关闭(避免文件被占用无法读取)
    • 确保文件编码为 GBK,不要用其他编码打开并保存
  2. QMT API 调用失败

    • 确认 MiniQMT 客户端已登录,且处于交易时间
    • 检查是否开启了 Python API 权限(MiniQMT 设置中开启)
    • 确认股票代码格式正确(必须是代码.交易所格式)
  3. 实时数据获取不到

    • 适当延长time.sleep(3)的等待时间(网络差时可改为 5 秒)
    • 确认股票处于正常交易状态(未停牌、未退市)
    • 重启 MiniQMT 客户端后重新运行代码

七、免责声明

本文所有代码仅供学习交流使用,不构成任何投资建议。量化交易存在较高风险,历史业绩不代表未来收益。请根据自身风险承受能力谨慎决策,自行承担交易风险。

八、总结

本文实现了通达信自选股与 MiniQMT 的数据互通,解决了量化交易中手动导入自选股的繁琐问题。基于本文的基础代码,你可以根据自己的交易策略扩展出更多自动化功能,大幅提升交易效率。

如果在代码运行过程中遇到问题,或者需要更多量化交易相关的技术支持,欢迎在评论区留言交流。

相关推荐
嘶哈哈哈1 小时前
嘉立创 EDA 入门实操笔记:从原理图到 PCB 布线、差分对、覆铜与 DRC 检查
开发语言·笔记·php
wgc2k1 小时前
Nest.js 基础-8-Hello,NestJS
开发语言·javascript·ecmascript
CTA量化套保1 小时前
一个账户跑多个期货策略:仓位与报单隔离思路
python·区块链
机汇五金_1 小时前
影响交换机箱体使用寿命的几个关键因素
运维·服务器·网络·python
子午1 小时前
基于DeepSeek的酒店客房管理系统~Python+DeepSeek智能问答+Vue3+Web网站系统
开发语言·前端·python
ghie90901 小时前
基于 MATLAB 的序贯蒙特卡洛概率假设密度多目标跟踪实现
开发语言·matlab·目标跟踪
我命由我123451 小时前
Java 开发 - Jar 包与 War 包
java·开发语言·java-ee·intellij-idea·jar·idea·intellij idea
峰上踏雪1 小时前
Windows 下最推荐的 Qt + VS2026 + CMake 开发方案
开发语言·windows·qt
编程大师哥1 小时前
最高效的 IO 并发方案
linux·网络·python