🚀 AI 一键生成 qmt 策略代码

QMT ext_data_rank_range 函数详解:自定义指标的历史排序

qmt | 发布时间: 2025/12/29
以下内容由 EasyQuant 生成。

问题描述

怎么获取某个指标在过去一段时间内的排名情况?

解决方案

在 QMT 量化交易平台中,若要获取某个扩展数据(指标)在过去一段时间内的排名情况,可以使用内置函数 ext_data_rank_range

该函数专门用于查询指定品种在指定时间区间内,其某个扩展数据数值在所有品种中的排名。

核心函数说明

函数名: ext_data_rank_range

用法:

ext_data_rank_range(extdataname, stockcode, begintime, endtime, ContextInfo)

参数详解:

  1. extdataname (string): 扩展数据的名称(需要在 QMT 客户端的“扩展数据管理器”中已存在)。
  2. stockcode (string): 股票代码,格式如 '600000.SH'
  3. begintime (string): 区间起始时间,格式为 'YYYY-MM-DD HH:MM:SS'(包含该时间点)。
  4. endtime (string): 区间结束时间,格式为 'YYYY-MM-DD HH:MM:SS'(包含该时间点)。
  5. ContextInfo (PythonObj): 策略运行环境的全局对象。

返回值:
返回一个 Python 字典(Dict),键(Key)为时间,值(Value)为该时间点对应的排名数值。


代码示例

以下代码展示了如何在策略中获取当前主图品种在指定时间段内,关于名为 'my_indicator'(假设的指标名)的排名情况。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 策略初始化函数
    print("策略初始化...")

def handlebar(ContextInfo):
    # 获取当前主图的代码
    current_stock = ContextInfo.stockcode
    
    # 假设我们要查询的扩展数据名称为 'my_indicator'
    # 注意:请确保该名称在 QMT 客户端的【扩展数据管理器】中真实存在
    indicator_name = 'my_indicator'
    
    # 定义查询的时间区间
    # 注意:时间格式必须严格遵守 'YYYY-MM-DD HH:MM:SS'
    start_time = '2023-01-01 09:30:00'
    end_time = '2023-01-10 15:00:00'
    
    # 调用 ext_data_rank_range 获取排名数据
    # 该函数返回的是一个字典
    rank_data = ext_data_rank_range(indicator_name, current_stock, start_time, end_time, ContextInfo)
    
    # 打印结果
    if rank_data:
        print(f"品种 {current_stock} 在 {start_time} 到 {end_time} 期间的 {indicator_name} 排名情况:")
        for time_key, rank_val in rank_data.items():
            print(f"时间: {time_key}, 排名: {rank_val}")
    else:
        print(f"未获取到 {current_stock} 的排名数据,请检查扩展数据名称或时间区间。")

    # 为了避免在每一根K线上都重复打印,通常可以加一个控制逻辑,或者只在最后一根K线运行
    if ContextInfo.is_last_bar():
        print("运行结束")

注意事项

  1. 数据依赖ext_data_rank_range 依赖于 QMT 客户端本地的“扩展数据”。在使用前,必须确保你已经在客户端的【数据管理】->【扩展数据】中定义并计算了该指标。如果扩展数据未计算或未生成,函数将无法返回有效数据。
  2. 全市场排名:该函数返回的排名是基于该扩展数据计算时所包含的所有品种进行的排序。
  3. 时间格式:请务必使用 'YYYY-MM-DD HH:MM:SS' 的格式,否则可能无法正确匹配数据。
  4. 单点排名:如果你只需要获取当前 K 线时刻的排名,可以使用 ext_data_rank(extdataname, stockcode, deviation, ContextInfo) 函数,其中 deviation 为 K 线偏移量(0 表示当前)。

Q&A

Q: 如果我想获取某个指标的具体数值而不是排名,应该用哪个函数?
A: 获取具体数值应使用 ext_data_range(获取一段时间的数值)或 ext_data(获取特定时刻的数值)。

Q: 为什么 ext_data_rank_range 返回空字典?
A: 通常有三个原因:1. 扩展数据名称填写错误;2. 本地没有该扩展数据的历史数据(需要补充数据或重新计算);3. 查询的时间区间内没有交易数据。

Q: 这个函数支持回测模式吗?
A: 支持。该函数在回测和实盘/模拟运行模式下均可使用,前提是本地有相应的历史扩展数据。