问题描述
使用xtdata获取数据时报错id:200003,timeout;券商版的miniqmt已经登录了啊。
报错如下:
Traceback (most recent call last):
File "G:\Desktop\A.PY", line 18, in <module>
kline_data = xtdata.get_market_data_ex([],code_list,period=period)
File "G:\Desktop\xtquant\xtdata.py", line 456, in get_market_data_ex
return _get_market_data_ex_ori_221207(field_list, stock_list, period, start_time, end_time, count, dividend_type, fill_data)
File "G:\Desktop\xtquant\xtdata.py", line 514, in _get_market_data_ex_ori_221207
ret = client.get_market_data3(field_list, stock_list, period, start_time, end_time, count, dividend_type, fill_data, 'v4', enable_read_from_local,
RuntimeError: func:requestFromCache, error:{ "ErrorID" : 200003, "ErrorMsg" : "timeout" }
代码如下:
from xtquant import xtdata
import time
# 设定一个标的列表
code_list = ["000001.SZ"]
print(1)
# 设定获取数据的周期
period = "1d"
print(2)
# 向服务器订阅数据
for i in code_list:
xtdata.subscribe_quote(i,period=period,count=-1) # 设置count = -1来取到当天所有实时行情
print(3)
# 等待订阅完成
time.sleep(1)
print(4)
# 获取订阅后的行情
kline_data = xtdata.get_market_data_ex([],code_list,period=period)
print(5)
print(kline_data)
解决方案
在使用 QMT 的 xtdata 模块获取行情数据时,遇到 ErrorID: 200003, ErrorMsg: timeout 错误,通常是因为 Python 脚本无法成功连接到正在运行的 QMT/miniQMT 客户端的数据服务。即使你已经登录了券商版的 miniQMT,仍然可能因为配置或环境问题导致连接超时。
以下是排查和解决该问题的详细步骤:
1. 确认 miniQMT 客户端状态
- 必须保持运行:
xtdata模块本身不直接连接交易所服务器,而是通过本地运行的 QMT/miniQMT 客户端获取数据。因此,在运行 Python 脚本时,必须确保 miniQMT 客户端处于登录且正常运行的状态。 - 数据服务是否开启:检查 miniQMT 客户端的设置,确保数据服务(通常是本地的某个端口,如 58619)已经开启且未被防火墙拦截。
2. 检查 xtdata 的连接配置
默认情况下,xtdata 会尝试连接本地默认端口。如果你的 miniQMT 安装路径或端口有特殊设置,可能需要手动指定数据路径。
在代码开头添加数据路径配置(请将路径替换为你实际的 miniQMT 安装路径下的 userdata_mini 文件夹):
from xtquant import xtdata
import time
# 指定 miniQMT 的数据路径 (非常重要!)
# 请替换为你实际的 miniQMT 安装路径
xtdata.data_dir = r'C:\Your\Path\To\miniQMT\userdata_mini'
# 设定一个标的列表
code_list = ["000001.SZ"]
period = "1d"
# ... 后续代码 ...
3. 检查历史数据是否已下载
xtdata.get_market_data_ex 默认会尝试从本地缓存读取数据。如果本地没有该标的、该周期的历史数据,且订阅未能及时返回,就会导致超时。
- 手动下载:在 miniQMT 客户端中,进入“数据管理”或“补充数据”界面,手动下载
000001.SZ的日线(1d)历史数据。 - 代码下载:在获取数据前,使用
xtdata.download_history_data下载数据。
from xtquant import xtdata
import time
code_list = ["000001.SZ"]
period = "1d"
# 下载历史数据
print("开始下载历史数据...")
for code in code_list:
xtdata.download_history_data(code, period=period)
print("历史数据下载完成")
# ... 然后再进行订阅和获取 ...
4. 增加等待时间
有时网络延迟或客户端处理较慢,time.sleep(1) 可能不够。尝试增加等待时间,例如 time.sleep(3) 或 time.sleep(5),确保订阅成功并接收到数据。
5. 检查 Python 环境与 xtquant 版本
- 确保你安装的
xtquant库版本与你使用的 miniQMT 客户端版本相匹配。建议使用客户端安装目录下自带的xtquant库,或者通过官方渠道获取最新版本。 - 确保没有多个 Python 环境导致包冲突。
总结:推荐的代码结构
结合以上建议,你可以尝试使用以下代码结构:
from xtquant import xtdata
import time
# 1. (可选但推荐) 指定数据路径,如果默认连接失败
# xtdata.data_dir = r'C:\Your\Path\To\miniQMT\userdata_mini'
code_list = ["000001.SZ"]
period = "1d"
# 2. 确保本地有历史数据
print("正在检查/下载历史数据...")
for code in code_list:
xtdata.download_history_data(code, period=period)
# 3. 订阅实时行情
print("正在订阅行情...")
for code in code_list:
xtdata.subscribe_quote(code, period=period, count=-1)
# 4. 给予充分的等待时间
time.sleep(3)
# 5. 获取数据
print("正在获取数据...")
try:
kline_data = xtdata.get_market_data_ex([], code_list, period=period)
print("获取成功:")
print(kline_data)
except Exception as e:
print(f"获取数据失败: {e}")
如果按照以上步骤排查后仍然报错,请检查是否有杀毒软件或防火墙拦截了 Python 进程与 miniQMT 客户端之间的本地网络通信(通常是 127.0.0.1 的某个端口)。