🚀 AI 一键生成 qmt 策略代码

QMT 策略可视化:如何在主图 K 线上绘制文字和数字?

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

问题描述

如何在 K 线图上显示自定义的文字或数字标记?

解决方案

在 QMT (Quantitative Market Trading) 平台的 Python API 中,要在 K 线主图上显示自定义的文字或数字,主要使用 ContextInfo.draw_text()ContextInfo.draw_number() 这两个函数。

这两个函数通常在 handlebar(ContextInfo) 循环中调用,用于在满足特定条件(condition)的 K 线位置上绘制标记。

核心函数说明

1. 显示文字:ContextInfo.draw_text()

用于在图表指定位置绘制字符串文本。

  • 用法ContextInfo.draw_text(condition, position, text)
  • 参数
    • condition (bool): 绘制条件。如果为 True,则在当前 K 线绘制;为 False 则不绘制。
    • position (number): 文字显示的 Y 轴位置(通常是价格,如最高价、最低价等)。
    • text (string): 要显示的文本内容。

2. 显示数字:ContextInfo.draw_number()

用于在图表指定位置绘制数值。

  • 用法ContextInfo.draw_number(condition, position, number, precision)
  • 参数
    • condition (bool): 绘制条件。
    • position (number): 数字显示的 Y 轴位置。
    • number (number): 要显示的具体数值。
    • precision (int): 小数点保留位数(例如 2 代表保留两位小数)。

完整代码示例

以下策略代码展示了如何在 K 线图上标记:

  1. 当收盘价大于开盘价(阳线)时,在最高价上方显示文字 "涨"
  2. 当收盘价大于开盘价(阳线)时,在最高价上方显示具体的 收盘价数值

您可以将此代码复制到 QMT 的策略编辑器中,并在模型研究模型交易的图表上运行。

# -*- coding: gbk -*-

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

def handlebar(ContextInfo):
    # 获取当前主图品种的 K 线数据
    # 获取当前 K 线索引
    index = ContextInfo.barpos
    
    # 获取当前 K 线的高、开、低、收数据
    # 注意:get_market_data 默认返回的是 pandas Series 或 DataFrame
    # 我们取当前 barpos 对应的值
    
    # 获取收盘价序列
    close_list = ContextInfo.get_market_data(['close'])
    # 获取开盘价序列
    open_list = ContextInfo.get_market_data(['open'])
    # 获取最高价序列
    high_list = ContextInfo.get_market_data(['high'])
    
    # 确保数据长度足够
    if len(close_list) <= index:
        return

    # 获取当前 K 线的具体数值
    current_close = close_list[index]
    current_open = open_list[index]
    current_high = high_list[index]
    
    # --- 设置绘制条件 ---
    # 条件:收盘价 > 开盘价 (阳线)
    is_up_candle = current_close > current_open
    
    # --- 1. 绘制文字 ---
    # 参数说明:(条件, Y轴位置, 文本内容)
    # 这里设置位置为最高价 + 价格的0.5% (为了显示在K线顶端上方一点,避免重叠)
    text_position = current_high * 1.005
    ContextInfo.draw_text(is_up_candle, text_position, '涨')
    
    # --- 2. 绘制数字 ---
    # 参数说明:(条件, Y轴位置, 数值, 小数精度)
    # 我们在文字上方一点显示具体的收盘价
    number_position = current_high * 1.01
    ContextInfo.draw_number(is_up_candle, number_position, current_close, 2)

    # --- 3. 绘制图标 (可选补充) ---
    # 参数说明:(条件, Y轴位置, 图标类型) 0:矩形 1:椭圆
    # 在阳线最低价下方画一个小圆点
    # ContextInfo.draw_icon(is_up_candle, current_low * 0.99, 1)

注意事项

  1. 坐标轴位置 (position)

    • position 参数决定了文字/数字在 Y 轴(价格轴)上的高度。
    • 为了避免文字遮挡 K 线,通常会在 high(最高价)的基础上乘以一个系数(如 1.01)使其显示在上方,或在 low(最低价)基础上乘以系数(如 0.99)使其显示在下方。
  2. 运行模式

    • 这些绘图函数主要用于界面显示(回测或实盘的模型图表)。
    • 如果在后台纯算法交易模式下运行,这些绘图函数不会产生视觉效果,但不会报错。
  3. 颜色控制

    • draw_textdraw_number 目前不支持直接通过参数设置颜色,它们通常跟随系统默认配色或指标配色。
    • 如果需要绘制带颜色的线条或柱状图,请使用 ContextInfo.paint() 函数。
  4. 性能

    • handlebar 是逐根 K 线执行的。绘图函数会在每一根满足条件的 K 线上留下标记。

Q&A

Q: 如何在副图(指标窗口)而不是主图上显示?
A: draw_textdraw_number 默认绘制在策略运行的窗口。如果您将策略叠加在主图上(“主图叠加”),它就画在主图;如果您将策略作为副图指标运行,它就会画在副图区域。

Q: 可以显示中文吗?
A: 可以。如示例所示,只要文件头部声明了 # -*- coding: gbk -*-,即可正常显示中文字符。

Q: 如何画竖线来标记特定日期?
A: 可以使用 ContextInfo.draw_vertline(cond, price1, price2, color)。例如:ContextInfo.draw_vertline(is_up_candle, 0, 10000, 'red') 会在满足条件的 K 线处画一条红色的竖线。