问题描述
解决方案
在 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')
注意事项
- 显示位置:该函数是在主图(K线图)上进行绘制的。
- 垂直范围:
number1和number2决定了垂直线的长度。如果你想画一条贯穿整个屏幕的线,通常需要设置一个极大值和极小值(例如 0 到 100000,或者基于当前价格上下浮动很大比例),但通常该函数用于标记特定价格区间(如支撑位到阻力位)。 - 运行模式:该函数在回测和实盘/模拟运行模式下均支持。
Q&A
Q: ContextInfo.draw_vertline 和 ContextInfo.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 默认是在当前运行的图表上绘制。如果策略运行在副图位置,它会画在副图上;如果运行在主图,则画在主图上。通常该函数用于主图价格标记。