当前位置:首页>行情>miniQMT行情获取全攻略:为什么你总拿不到最新数据?

miniQMT行情获取全攻略:为什么你总拿不到最新数据?

  • 2026-10-29 12:48:14
miniQMT行情获取全攻略:为什么你总拿不到最新数据?

推荐边看边写,不然容易看的一头雾水

经常有朋友问我:为什么跑完我提供的代码后,没有任何结果?
其实,大概率是因为你本地并没有获取到最新的行情数据。

为了帮大家彻底搞明白,这篇文章我会通过几个示例演示:在 miniQMT 里,究竟要如何正确获取到最新的行情数据。这里我先以日线数据为例来说明。📈

我这篇文章是在 2025年9月16日 13点 测试的。需要说明的是:

  • 9月12日、15日、16日,我都没有下载过 QMT 本地行情;
  • 所以目前我的 QMT 本地行情只停留在 9月11日。

接下来,我会演示通过几种方式去获取日线行情,并带大家看看它们之间的差异和注意事项。


熟悉miniQMT的都知道,获取行情数据最常用的接口主要有两个:

  • get_market_data_ex:从缓存获取行情数据,是主动获取行情的主要接口
  • get_local_data:从本地数据文件获取行情数据,用于快速批量获取历史部分的行情数据

1. 直接通过get_market_data_ex和get_local_data获取数据

先说结论:无论是用 get_market_data_ex 还是 get_local_data,在当前环境下我都只能拿到 9月11日 的数据(今天是 9月16日)。

很多朋友经常反馈说:

  • 获取不到最新的行情;
  • 或者数据直接是空的。

根本原因其实很简单:本地 QMT 的缓存或者本地数据文件里,压根就没有最新的行情,甚至没有你要的那只股票的数据。

那么问题来了:👉 我们到底该怎么才能获取到最新的行情数据呢? 别急,继续往下看。

get_market_data_ex 示例,只能拿到 9月11日 的数据

code = '300124.SZ'
data = xtdata.get_market_data_ex([],stock_list=[code],period='1d',start_time='20250101',end_time='',dividend_type='front')
print(data[code])

get_local_data 示例,只能拿到 9月11日 的数据

code = '300124.SZ'
data = xtdata.get_local_data([],stock_list=[code],period='1d',start_time='20250101',end_time='',dividend_type='front')
print(data[code])

2. 订阅全推行情

有人可能会说:那用订阅全推行情不就能拿到最新数据了吗? 🤔

我也专门测试了一下:通过 subscribe_whole_quote 订阅了深证市场全部股票的行情,然后再用 get_market_data_ex 和 get_local_data 去取。

结果很意外——拿到的依然还是 9月11日 的数据,依旧没有 9月16日 的最新行情。

这就说明一个问题:光订阅全推行情,并不会让 QMT 的缓存或者本地数据文件更新。

订阅全推行情,通过get_market_data_ex获取行情示例行情数据只能拿到9月11日的

code = '300124.SZ'

deffb(datas):
    data_ex = xtdata.get_market_data_ex([],stock_list=[code],period='1d',dividend_type='front',count=5)
    print(data_ex[code])

seq = xtdata.subscribe_whole_quote(['SZ'],callback=fb)
xtdata.run()

订阅全推行情,通过get_local_data获取行情示例行情数据只能拿到9月11日的

code = '300124.SZ'

deffb(datas):
    data_ex = xtdata.get_local_data([],stock_list=[code],period='1d',dividend_type='front',count=5)
    print(data_ex[code])

seq = xtdata.subscribe_whole_quote(['SZ'],callback=fb)
xtdata.run()

那订阅全推行情怎么用?

订阅全推行情数据以后,从callback函数里取最新的行情,数据类型为分笔数据,示例如下:

code = '300124.SZ'

deffb(datas):
if code in datas:
        print(datas[code])

seq = xtdata.subscribe_whole_quote(['SZ'],callback=fb)
xtdata.run()

返回值是分比数据,但是里面的askPrice多档委卖价,bidPrice多档委买价是没有数据的。

{
 'time': 1758001683000,
 'lastPrice': 83.97,
 'open': 79.96000000000001,
 'high': 85.55,
 'low': 79.51,
 'lastClose': 80.15,
 'amount': 5404196400.0,
 'volume': 658001,
 'pvolume': 65800104,
 'stockStatus': 3,
 'openInt': 13,
 'transactionNum': 0,
 'lastSettlementPrice': 80.15,
 'settlementPrice': 0.0,
 'pe': 0.0,
 'askPrice': [0.0, 0.0, 0.0, 0.0, 0.0],
 'bidPrice': [0.0, 0.0, 0.0, 0.0, 0.0],
 'askVol': [0, 0, 0, 0, 0],
 'bidVol': [0, 0, 0, 0, 0],
 'volRatio': 0.0,
 'speed1Min': 0.0,
 'speed5Min': 0.0
}

3. 订阅单股行情

接下来我又换了个思路:用 subscribe_quote2 来订阅单只股票的 5 根日线行情,并通过回调函数把收到的行情数据打印出来。

这里有个细节一定要注意 ⚠️:当订阅的数据返回后,它会先进入本地缓存。

这意味着什么?

  • 你能在回调里看到最新的数据;
  • 但如果你随后直接用 get_market_data_ex 或 get_local_data 去取,就能拿到比较新的行情数据了。
code = '300124.SZ'

deffb(datas):
if code in datas:
        print(datas[code])
        xtdata.unsubscribe_quote(seq)

seq = xtdata.subscribe_quote2(stock_code=code,callback=fb,period='1d',dividend_type='front',count=5)
xtdata.run()

返回值

[{
 'time': 1757520000000,
 'open': 79.0,
 'high': 81.12,
 'low': 77.89,
 'close': 80.7,
 'volume': 576815,
 'amount': 4604488185.210001,
 'settlementPrice': 0.0,
 'openInterest': 15,
 'dr': 1.0,
 'totaldr': 24.93064385174295,
 'preClose': 6.95169983515247e-310,
 'suspendFlag': 0
}, {
 'time': 1757606400000,
 'open': 81.33999999999999,
 'high': 82.21,
 'low': 79.49,
 'close': 79.67999999999999,
 'volume': 592316,
 'amount': 4777023017.74,
 'settlementPrice': 0.0,
 'openInterest': 15,
 'dr': 1.0,
 'totaldr': 24.93064385174295,
 'preClose': 6.95169983515247e-310,
 'suspendFlag': 0
}, {
 'time': 1757865600000,
 'open': 79.60000000000001,
 'high': 82.17,
 'low': 79.35000000000001,
 'close': 80.15,
 'volume': 522526,
 'amount': 4215152023.84,
 'settlementPrice': 0.0,
 'openInterest': 15,
 'dr': 1.0,
 'totaldr': 24.93064385174295,
 'preClose': 6.95169983515247e-310,
 'suspendFlag': 0
}, {
 'time': 1757952000000,
 'open': 79.96000000000001,
 'high': 85.55000000000001,
 'low': 79.51,
 'close': 83.98,
 'volume': 661797,
 'amount': 5436034654.47,
 'settlementPrice': 0.0,
 'openInterest': 13,
 'dr': 1.0,
 'totaldr': 24.93064385174295,
 'preClose': 6.95169983515247e-310,
 'suspendFlag': 0
}]

通过get_local_data和get_market_data_ex获取到了16号的数据。

code = '300124.SZ'
data = xtdata.get_local_data([],stock_list=[code],period='1d',start_time='20250101',end_time='',dividend_type='front')
print(data[code])
code = '300124.SZ'
data = xtdata.get_market_data_ex([],stock_list=[code],period='1d',start_time='20250101',end_time='',dividend_type='front')
print(data[code])

4. 下载行情数据

最后,我又测试了 download_history_data2 接口。 它的作用很直接:主动下载指定标的的历史行情数据。

和前面几种方式不同,这里有个关键点 💡: 调用 download_history_data2 之后,不仅会把最新的日线数据拉下来,还会同步更新 QMT 的缓存 和 本地数据文件。

这样一来,无论你再用 get_market_data_ex 还是 get_local_data,都能顺利拿到最新的行情数据了。🎉

通过download_history_data2下载行情

xtdata.download_history_data2(stock_list=[code],
                            period='1d',
                            start_time='20250101',
                            end_time='',
                            incrementally=False)

通过get_local_data和get_market_data_ex获取到了16号的数据。

data = xtdata.get_market_data_ex([],stock_list=[code],
                        period='1d',
                        start_time='20250101',
                        end_time='',
                        dividend_type='front')
print(data[code])

data = xtdata.get_local_data([],stock_list=[code],
                        period='1d',
                        start_time='20250101',
                        end_time='',
                        dividend_type='front')
print(data[code])

总结

miniQMT 获取行情数据,最容易踩坑的地方就在于:接口不等于最新数据。 核心逻辑其实很简单:

  1. get_market_data_ex / get_local_data👉 依赖缓存和本地文件,如果没有最新行情,就只能拿到旧数据(比如只能到 9 月 11 日)。

  2. 订阅全推行情(subscribe_whole_quote)👉 拿到的是实时分笔流,但不会自动更新缓存和本地文件。

  3. 订阅单股行情(subscribe_quote2)👉 可以拿到最新的日线数据,并会写入缓存,从而影响 get_market_data_ex / get_local_data 的结果。

  4. 主动下载(download_history_data2)👉 最稳妥的方式,直接拉取并同步更新缓存和本地文件,保证后续查询一定有最新数据。

💡 所以,如果你只是被动查询,很容易遇到“数据不更新”的情况。要想确保拿到最新行情,最可靠的办法就是:

  • 日线、分钟线等历史数据 → 用 download_history_data2 主动拉取;
  • 实时流数据 → 用订阅接口(subscribe_quote2 或 subscribe_whole_quote)直接从回调里取。

记住一句话:订阅拿实时,下载补历史,查询靠缓存。


往期文章精选

小白学量化完全指南,跟着做就行了

给你的DeepSeek装上实时行情,让他帮你炒股

一篇文章让你彻底搞懂量化中RSI指标,附实战策略+附源码,建议收藏

一招横盘突破选股法,赚钱不靠运气靠图形,靠概率!

MiniQMT+Backtrader:平民股票量化界的“黄金搭档”,永远的神!

万字干货:用神经网络预测股市,这次真的讲透了,Python+神经网络实战全流程(附源码)

在A股开超市到底靠谱不靠谱(附源码)

一文读懂量化交易中最常用的5种均线,附源码,建议收藏

牛市不是等出来的,是提前感知出来的:花姐教你打造自己的A股情绪指标

从0到1打造一套小白也能跑得起来的量化框架[图文教程]

为什么指数涨你却亏钱?80%的人忽略的市场宽度指标揭晓,我用Python实现了(附源码)

上班族没时间炒股?不妨试试这个隔夜超短战法(附:Python量化源码)

反转还是假象?华尔街奇才的神秘指标:Python实战神奇九转(含代码)量化小白必看

跟风还是反转?用 ADX 判断趋势强度,Python 教程全程带你飞

一进二打板核心战法:从优质首板到二连板的全链路实战指南


关于花姐

花姐,专注于Python量化与股票策略研究,兼顾Python基础知识分享,内容实用接地气,擅长用代码解读市场,用策略提升认知,干货满满,务实至上。

👇关注+星标花姐公众号 第一时间看到推文👇

如果文章对你有帮助,还请点「推荐」支持一下花姐

---    End     ---

文章中涉及的策略仅作学术交流
回测结果不代表未来表现
市场有风险,决策需谨慎

粉丝福利

为了方便大家低门槛获得量化资格,花姐找了一家不错的营业部,10万入金就可以开通QMT+miniQMT量化,备注【花姐】才可以享受此福利

最新文章

随机文章