欢迎光临
我们一直在努力

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

摘要

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

一、前言

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

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

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

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

    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 调用流程

  • 通过xtdata.subscribe_quote订阅指定股票的 Tick 级实时行情
  • 等待 3 秒确保数据更新完成(可根据网络情况调整)
  • 通过xtdata.get_full_tick获取最新 Tick 数据
  • 用最新价(lastPrice)和昨收价(lastClose)计算涨跌幅
  • 通过xtdata.get_instrument_detail获取股票中文名称
  • 三、分步代码实现详解

    3.1 环境准备

  • 安装并登录 MiniQMT 客户端,确保开启了 Python API 权限
  • 本文代码直接在 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()

    四、运行效果与使用说明

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

    ✅ 成功从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 线数据,计算分时均价线,当股价站稳分时均线时触发买入信号,跌破分时均线时触发卖出信号。

    六、常见问题排查

  • 自选股文件读取失败:

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

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

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

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

    八、总结

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

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

    赞(0)
    未经允许不得转载:171主机测评 » 量化之MiniQMT 实战:一键读取通达信自选股并实时监控涨跌幅(附完整可运行代码)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址