郑重声明:本系列是个人操作日记,不构成投资建议!文中所有观点,仅代表个人立场以及个人操作,不具有任何指导作用!据此操作,风险自负!市场有风险,投资需谨慎。做QMT量化的兄弟,想必都对 get_full_tick 这个函数又爱又恨。爱它,是因为它能拿到最全、最新的tick快照,策略的灵敏就靠它;恨它,是因为——它动不动就给你甩个空字典 {},一脸无辜。
很多新手第一反应:“行情源挂了吧?”结果折腾半天,发现行情源好好的,问题出在自己身上。
今天我们就来扒一扒,get_full_tick 返回空数据的 5大常见原因。尤其第一条,踩坑率高达80%,看完赶紧自查!
先搞懂:get_full_tick 到底取的是什么?
简单说,它是从QMT内存里读取最新的tick快照。也就是说,它不是去服务器实时拉,而是去 本地内存 里拿现成的。
那问题来了——如果内存里没东西,它当然给你空的。所以,下面这5个原因,本质上都指向同一个问题:数据根本没进内存。
这是最最最常见的坑,没有之一。
很多人直接在 handlebar 里写:
tick = get_full_tick(['000001.SZ'])
然后自信满满地运行,结果返回 {}。
兄弟,你都没告诉QMT你要这只票的数据,内存里怎么会有?
正确姿势:必须在 init 里先订阅。
def init(): subscribe_quote(['000001.SZ', '600000.SH'])
只有订阅了,行情数据才会源源不断往内存里推,get_full_tick 才能读到。先订阅,解决一大半问题!
QMT对代码格式要求极其严格,必须带市场后缀,而且必须大写。
❌ 错误写法:
'000001'(没后缀)
'000001.sz'(小写)
'sz000001'(不是QMT标准)
✅ 正确写法:
建议写个格式化函数,自动补后缀、转大写,避免手滑:
def format_code(code, market): code = code.upper() if not code.endswith('.SH') and not code.endswith('.SZ'): code += '.SH' if market == '上海' else '.SZ' return code
如果你在周末、节假日、或者早上8点就跑去调用 get_full_tick,那返回空是必然的——因为今天的数据还没开始推送,内存里还是空的。
QMT的tick数据是实时推送的,只有交易时段才有。如果你想在盘后测试,请改用 get_market_data_ex,那是历史数据接口,随时可查。
记住:
QMT不管是哪种模式(mini QMT还是普通版),底层都靠客户端收数据。如果客户端没登录、或者行情连接断了,那数据推送就停了,内存自然空。
怎么检查?看QMT客户端右下角,有没有显示“已连接交易服务器”或“行情已连接”的图标。如果是红色或灰色,赶紧重新登录。
有时候网络波动也会闪断,重新连接一下就好了。
这个坑新手容易忽略:get_full_tick 的 参数必须是一个列表,即使只查一只票。❌ 错误:
tick = get_full_tick('000001.SZ') # 传字符串
✅ 正确:
tick = get_full_tick(['000001.SZ']) # 传列表
当你再次遇到 get_full_tick 返回空字典时,按顺序查这5条:
✅ 在 init 里 subscribe_quote 了吗?
✅ 代码格式是否 大写 + .SH/.SZ?
✅ 当前是交易时段吗?非交易时段请用历史接口。
✅ 客户端右下角显示已连接吗?
✅ 参数传的是列表 [] 吗?
基本上,99%的空返回都逃不出这5条。如果你全查过了还是空,那……大概率是你记错股票代码了 😂