问题描述
在学习 QMT.,引用指标时:
def init(ContextInfo):
print(ext_data('CR', '600000.SH', 0, ContextInfo))
返回的任何指标都是: nan
不知道什么原因
解决方案
在 QMT 平台中使用 ext_data() 函数获取指标数据时返回 nan,通常是因为调用该函数的生命周期位置不正确。
问题原因分析
在您的代码中,您将 ext_data() 放在了 init(ContextInfo) 函数中:
def init(ContextInfo):
print(ext_data('CR', '600000.SH', 0, ContextInfo))
init 是策略的初始化函数,在整个策略加载时只运行一次。此时,策略还没有开始逐 K 线运行,系统尚未加载具体的 K 线上下文数据(即 ContextInfo.barpos 等状态尚未就绪)。因此,在这个阶段去获取依赖于 K 线位置的指标数据,系统无法返回有效值,只能返回 nan(Not a Number)。
正确的解决方法
获取行情数据或指标数据,应该放在 handlebar(ContextInfo) 函数中。handlebar 是行情事件驱动函数,每根 K 线(或每个 tick)都会运行一次,此时上下文环境已经准备好,可以正确获取到当前 K 线对应的指标数值。
正确的代码示例:
#coding:gbk
def init(ContextInfo):
# init 中通常用于初始化股票池、设置账号、参数等
ContextInfo.set_universe(['600000.SH'])
print("策略初始化完成")
def handlebar(ContextInfo):
# 在 handlebar 中获取指标数据
# 获取当前主图代码的 CR 指标,0 表示不偏移(当前 K 线)
cr_value = ext_data('CR', '600000.SH', 0, ContextInfo)
# 打印当前 K 线的索引和对应的指标值
print(f"当前Bar索引: {ContextInfo.barpos}, CR指标值: {cr_value}")
其他可能导致返回 nan 的注意事项
如果将代码移到 handlebar 后仍然返回 nan,请检查以下几点:
- 本地数据是否完整:QMT 的指标计算依赖于本地历史数据。请确保您已经在 QMT 客户端的【数据管理】中下载了
600000.SH对应周期的历史 K 线数据。 - 指标名称是否正确:确保引用的指标名称(如
'CR')在 QMT 系统的公式管理器中真实存在,且拼写完全一致。 - K 线数量是否足够:某些指标(如均线、CR等)需要一定数量的历史 K 线才能计算出有效值。如果当前运行到的 K 线位置(
barpos)太靠前,历史数据不足以计算该指标,也会返回nan。随着barpos的增加,指标值会逐渐正常。 - 停牌数据:如果该股票在当前 K 线时间点处于停牌状态,且未设置停牌填充,也可能获取不到有效数据。