3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在使用 QMT 平台的 ContextInfo.get_market_data_ex() 函数获取日线数据时,如果发现返回的数据中包含了周六(如 5 月 16 日和 4 月 25 日)等非交易日的数据,这通常是由以下几个原因引起的:
QMT 的 get_market_data_ex() 函数在默认情况下(subscribe=True)会结合本地数据和订阅数据。如果本地历史数据中存在脏数据(例如由于某些测试或异常情况写入了非交易日的数据),函数就会将其读取出来。
解决方法:
虽然文档中提到 fill_data 参数暂不可用,但在某些版本中,如果该参数被激活或底层逻辑有变,可能会尝试对缺失的日期进行填充。如果逻辑判断有误,可能会将非交易日也进行了填充。
解决方法:
fill_data=False,观察是否还能获取到周六的数据。data = ContextInfo.get_market_data_ex(
['close'],
['510300.SH', '000985.SH'],
period='1d',
fill_data=False
)
如果 period 参数设置的不是标准的 '1d',而是某些自定义的多日线(如 'md')或者跟随主图周期('follow'),而主图周期设置有误,可能会导致时间戳解析出现偏差。
解决方法:
period='1d'。如果以上排查都无法解决问题,这极有可能是 QMT 平台特定版本中的一个 Bug,导致在处理某些特定品种(如指数或 ETF)的日线数据时,未能正确过滤非交易日。
建议:
datetime 模块或 pandas 过滤掉非交易日的数据。临时过滤代码示例:
import pandas as pd
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
data = ContextInfo.get_market_data_ex(
['close'], ['510300.SH'], period='1d'
)
if '510300.SH' in data:
df = data['510300.SH']
# 将 index 转换为 datetime 对象
df.index = pd.to_datetime(df.index)
# 过滤掉周六 (5) 和周日 (6)
df = df[df.index.dayofweek < 5]
print(df)
总结来说,首先尝试清理并重新下载本地数据,如果问题依旧,建议在代码中加入日期过滤逻辑,并及时向官方反馈该异常。