摘要
本文解决了通达信选股与 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 的数据互通,解决了量化交易中手动导入自选股的繁琐问题。基于本文的基础代码,你可以根据自己的交易策略扩展出更多自动化功能,大幅提升交易效率。
如果在代码运行过程中遇到问题,或者需要更多量化交易相关的技术支持,欢迎在评论区留言交流。