问题描述
glmos-code-explain
首先参照 https://dict.thinktrader.net/nativeApi/code_examples.html?id=6FbW0D#%E8%8E%B7%E5%8F%96%E8%A1%8C%E6%83%85%E7%A4%BA%E4%BE%8B 文档里的做法,已经把数据本地化了,但是使用 get_local_data 方法以及 get_market_data_ex 方法时得到只有一个 empty 的 dataframe
解决方案
在QMT(迅投)平台中,即使已经在“数据管理”中下载了数据,调用 get_local_data 或 get_market_data_ex 仍然返回空的 DataFrame,通常是由于参数传递不匹配或数据未正确对应导致的。请按照以下几个常见原因进行排查:\n\n### 1. 股票代码格式不正确\nQMT 的 API 要求股票代码必须包含市场后缀,格式为 代码.市场。\n- 错误:'600000' 或 'sh600000'\n- 正确:'600000.SH'(上交所)或 '000001.SZ'(深交所)\n\n### 2. 时间参数格式错误\nstart_time 和 end_time 必须是字符串格式,且格式要求严格:\n- 日线及以上周期:'YYYYMMDD'(如 '20230101')\n- 分钟线及 Tick:'YYYYMMDDHHMMSS'(如 '20230101093000')\n\n### 3. 周期(period)或复权方式(dividend_type)与下载的数据不匹配\n本地缓存是严格按照周期和复权方式隔离的。如果您在数据管理中只下载了“日线”和“不复权”的数据,但在代码中请求了“前复权”(front)或“分钟线”(1m),系统将找不到对应数据,从而返回空。\n- 检查 period 参数:如 '1d', '1m', 'tick'。\n- 检查 dividend_type 参数:如 'none'(不复权), 'front'(前复权)。\n\n### 4. get_market_data_ex 的 subscribe 参数\n如果您使用的是 get_market_data_ex,请确保 subscribe=True(默认值)。如果设置为 False,它将只读取本地已有的数据,如果本地数据未及时同步,就会返回空。\n\n### 5. 正确的代码示例\n请参考以下标准调用方式进行测试:\n\npython\ndef handlebar(ContextInfo):\n # 确保是最后一根K线,避免盘中频繁调用\n if not ContextInfo.is_last_bar():\n return\n\n # 1. 测试 get_market_data_ex\n # 获取平安银行和浦发银行的日线前复权数据\n stock_list = ['000001.SZ', '600000.SH']\n data_ex = ContextInfo.get_market_data_ex(\n fields=['open', 'high', 'low', 'close'],\n stock_code=stock_list,\n period='1d',\n start_time='20230101',\n end_time='20231031',\n dividend_type='front',\n subscribe=True # 开启订阅,本地没有会自动向服务器请求\n )\n print("get_market_data_ex 返回结果:", data_ex)\n\n # 2. 测试 get_local_data\n # 注意:get_local_data 只能获取单只股票,且必须本地已下载该复权方式的数据\n data_local = ContextInfo.get_local_data(\n stock_code='000001.SZ',\n start_time='20230101',\n end_time='20231031',\n period='1d',\n divid_type='none' # 注意参数名是 divid_type 而不是 dividend_type\n )\n print("get_local_data 返回结果:", data_local)\n\n\n### 补充建议\n如果以上排查后仍然为空,请打开QMT客户端的 “数据管理” -> “补充数据”,手动勾选您需要的品种、周期和时间段,点击“补充”,等待右下角提示“数据下载完成”后,再次运行策略。