🚀 AI 一键生成 qmt 策略代码
立即体验

qmt API 进阶:如何通过 Python 调用 VBA 自定义指标与扩展数据

qmt | 发布时间: 2026/7/30
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: qmt API 进阶:如何调用 VBA 自定义函数与指标?

Question: 在 qmt 策略中如何通过 Python 调用 VBA 编写的自定义指标?

解决方案

qmt API 进阶:如何通过 Python 调用 VBA 自定义指标与扩展数据

在 QMT(迅投量化交易平台)中,Python 策略不仅可以直接读取市场行情与财务数据,还能与平台的传统技术指标/VBA自定义计算公式进行交互。对于习惯使用公式或 VBA 计算特色指标(如自定义 CCI、MACD 变体等)的开发者,QMT 提供了**扩展数据(ext_data)因子数据(factor_value)**接口,实现 Python 对 VBA/技术指标计算结果的直接调用。


1. 实现原理:扩展数据(ext_data)机制

QMT 通过“扩展数据”功能将图形界面或 VBA 计算出的特色指标提前计算并保存到本地数据库。在 Python 策略中,使用 ext_data()ContextInfo.get_ext_all_data() 等 API 接口,即可直接提取这些指标数值或全市场排名。


2. 关键 API 接口说明

2.1 获取扩展数据 ext_data()

  • 用法ext_data(extdataname, stockcode, deviation, ContextInfo)
  • 参数说明
    • extdataname (str): 扩展数据/自定义指标名称(如 'mycci')。
    • stockcode (str): 合约代码,格式为 '代码.市场'(如 '600000.SH')。
    • deviation (int): K线偏移量,0 表示不偏移,N 表示向右偏移 N 根 K 线,-N 表示向左偏移。
    • ContextInfo: 全局策略上下文对象。
  • 返回值number(指标对应数值)。

2.2 获取扩展数据全市场排名 ext_data_rank()

  • 用法ext_data_rank(extdataname, stockcode, deviation, ContextInfo)
  • 释义:获取该标的的扩展数据数值在当前所有品种中的实时排名。

2.3 批量提取扩展数据 ContextInfo.get_ext_all_data()

  • 用法ContextInfo.get_ext_all_data(extdataname, start_time='19720101', end_time='22010101')
  • 释义:一次性获取指定扩展数据在指定时间段内的所有数值和全市场排名,返回 pandas.Panel 或结构化数据,建议在 init() 函数中初始化加载。

3. 代码示例:Python 调用自定义指标数据

以下示例展示了如何在 QMT Python 策略中初始化并逐 K 线读取自定义指标 mycci 的数值及全市场排名:

#coding:gbk

def init(ContextInfo):
    # 设定交易股票池
    stock_list = ['600000.SH', '000001.SZ']
    ContextInfo.set_universe(stock_list)
    
    # 预加载扩展数据(建议在 init 中一次性提取)
    # ext_data_panel = ContextInfo.get_ext_all_data('mycci')
    print("策略初始化完成,准备提取扩展数据")

def handlebar(ContextInfo):
    # 获取当前主图股票代码
    symbol = ContextInfo.stockcode + '.' + ContextInfo.market
    
    # 1. 获取自定义 VBA/指标 'mycci' 的当前 Bar 数值
    cci_value = ext_data('mycci', symbol, 0, ContextInfo)
    
    # 2. 获取该指标数值在全市场中的排名
    cci_rank = ext_data_rank('mycci', symbol, 0, ContextInfo)
    
    # 打印结果
    print(f"当前K线位置: {ContextInfo.barpos} | 标的: {symbol} | 自定义CCI值: {cci_value} | 排名: {cci_rank}")
    
    # 3. 基于自定义指标构建交易逻辑
    if cci_value > 100:
        # 触发买入信号(以买一价下单 100 股)
        order_shares(symbol, 100, 'BUY1', 0, ContextInfo)

4. 使用注意事项与最佳实践

  1. 数据补充:在使用扩展数据接口之前,需确保客户端已完成相应技术指标/VBA计算结果的数据补充与扩展数据生成(路径:客户端 数据管理 -> 补充数据)。
  2. 编码规范:策略文件首行须注明 #coding:gbk,防止中文指标名称解析乱码。
  3. 效率优化:若策略需高频读取大批量股票的扩展数据,推荐在 init() 中使用 ContextInfo.get_ext_all_data() 批量载入内存,避免在 handlebar() 中频繁调用单点查询。