3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 平台中使用 ContextInfo.get_market_data_ex 获取期货数据时返回空的 DataFrame,通常是由以下几个原因导致的。请按照以下步骤逐一排查:
你请求的合约是 c2409.DF(大商所玉米24年9月合约)。
解决办法:
c2501.DF 或 c2505.DF)。ContextInfo.get_main_contract('c.DF') 动态获取当前的主力合约代码。你提到“历史数据已经下载好了”,但请确认你下载的是否是 1分钟线(1m) 数据。
period='1m',本地数据库中没有分钟线数据,就会返回空。解决办法:
进入 QMT 终端的 数据管理 -> 补充数据,选择大商所(DF),勾选“1分钟线”,并确保时间范围覆盖了你的回测区间。
在回测模式下,get_market_data_ex 默认会以当前 K 线(ContextInfo.barpos 对应的时间)为基准往前取 count 根 K 线。
你可以将以下代码放入你的策略中运行,通过日志输出来定位问题:
#coding:gbk
def init(ContextInfo):
# 动态获取当前玉米的主力合约
main_contract = ContextInfo.get_main_contract('c.DF')
print(f"当前玉米主力合约为: {main_contract}")
# 将主力合约存入全局变量
ContextInfo.my_contract = main_contract
def handlebar(ContextInfo):
# 确保只在最后一根K线或特定条件下打印,避免日志过多
if not ContextInfo.is_last_bar():
return
contract = ContextInfo.my_contract
# 尝试获取数据
his_price = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close', 'volume'],
stock_code=[contract],
period='1m',
count=10,
subscribe=True # 确保订阅开关打开
)
if contract in his_price and not his_price[contract].empty:
print(f"成功获取到 {contract} 的数据:")
print(his_price[contract])
else:
print(f"警告:获取 {contract} 数据为空!请检查合约是否退市或数据是否下载。")
对于 c2409.DF 这种特定交割月的合约,99% 的概率是因为在当前时间点它已经退市。在编写期货策略时,强烈建议使用 ContextInfo.get_main_contract() 动态获取主力合约进行交易和数据获取,而不是将合约代码写死。