🚀 AI 一键生成 qmt 策略代码

QMT 可视化进阶:使用 `draw_vertline` 在 K 线图标注关键时间点

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

问题描述

如何在K线图上画垂直线?

解决方案

在 QMT 平台中,要在 K 线图上绘制垂直线,可以使用 ContextInfo.draw_vertline() 函数。

该函数的作用是在满足特定条件时,在当前 K 线位置绘制一条指定颜色和范围的垂直线段。

函数说明

函数原型:
ContextInfo.draw_vertline(cond, number1, number2, color='', limit='')

参数详解:

  • cond (bool): 绘图条件。当该值为 True (或非0数值) 时,会在当前 K 线位置绘制线条;为 False 时不绘制。
  • number1 (number): 垂直线的起始价格(Y轴数值1)。
  • number2 (number): 垂直线的结束价格(Y轴数值2)。
  • color (string): 线条颜色(可选)。支持 'red', 'blue', 'green', 'yellow', 'white', 'cyan', 'magenta', 'brown'。默认为白色。
  • limit (string): 画线控制(可选)。'noaxis' 表示不影响坐标轴缩放,'nodraw' 表示不画线。

代码示例

以下策略代码展示了如何在 收盘价大于开盘价(阳线) 时,在当根 K 线的 最低价最高价 之间画一条 红色 的垂直线。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 初始化函数,这里不需要做特殊设置
    pass

def handlebar(ContextInfo):
    # 获取当前K线的收盘价、开盘价、最高价、最低价
    # 注意:get_market_data 默认返回 pandas Series 或 DataFrame,
    # 在画图函数中通常会自动处理,或者我们可以显式取值
    
    # 获取当前主图品种的最新一根Bar的数据
    # count=-1, start_time='', end_time='' 且不指定具体时间时,通常取当前运行到的Bar的数据
    # 为了演示简单,这里直接使用 ContextInfo.get_market_data 获取当前切片数据
    
    # 获取当前周期的数据
    close_data = ContextInfo.get_market_data(['close'])
    open_data = ContextInfo.get_market_data(['open'])
    high_data = ContextInfo.get_market_data(['high'])
    low_data = ContextInfo.get_market_data(['low'])
    
    # 定义画线条件:收盘价 > 开盘价 (阳线)
    # 注意:这里直接比较的是 pandas Series 对象,结果也是 Series (boolean)
    condition = close_data > open_data
    
    # 调用绘制垂直线函数
    # 参数含义:(条件, 起始价格, 结束价格, 颜色)
    # 在满足 condition 的 K 线位置,从 low 画到 high,颜色为红色
    ContextInfo.draw_vertline(condition, low_data, high_data, 'red')
    
    # 示例2:在收盘价 < 开盘价 (阴线) 时,画一条从 0 到 最高价 的 绿色 线 (模拟标记)
    condition_down = close_data < open_data
    ContextInfo.draw_vertline(condition_down, 0, high_data, 'green')

注意事项

  1. 显示位置:该函数是在主图(K线图)上进行绘制的。
  2. 垂直范围number1number2 决定了垂直线的长度。如果你想画一条贯穿整个屏幕的线,通常需要设置一个极大值和极小值(例如 0 到 100000,或者基于当前价格上下浮动很大比例),但通常该函数用于标记特定价格区间(如支撑位到阻力位)。
  3. 运行模式:该函数在回测和实盘/模拟运行模式下均支持。

Q&A

Q: ContextInfo.draw_vertlineContextInfo.paint 有什么区别?
A: ContextInfo.paint 主要用于绘制连续的指标线(如均线)或柱状图,它连接每根 K 线上的点。而 ContextInfo.draw_vertline 是在单根 K 线上绘制垂直线段,主要用于标记特定 K 线的高低范围或信号区间,线条之间不会横向连接。

Q: 如何画一条贯穿整个窗口高度的无限长垂直线?
A: QMT 的 draw_vertline 是基于价格坐标(Y轴)绘制的。要模拟贯穿窗口的效果,可以将 number1 设为 0,将 number2 设为一个远高于当前价格的数值(例如 high_data * 10),或者结合 limit='noaxis' 参数防止坐标轴被压缩,但这通常不是标准用法,标准用法是标记价格区间。

Q: 可以在副图上画垂直线吗?
A: ContextInfo.draw_vertline 默认是在当前运行的图表上绘制。如果策略运行在副图位置,它会画在副图上;如果运行在主图,则画在主图上。通常该函数用于主图价格标记。