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

qmt 策略图表进阶:如何使用 draw_icon 与 draw_vertline 精准标注交易信号?

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

问题描述



Title: qmt 策略图表进阶:使用 draw_icon 与 draw_vertline 精准标注交易信号

Question: 如何在 qmt 策略回测图表上,用 Python 代码在买卖点绘制图标和垂直线?

解决方案

qmt 策略图表进阶:使用 draw_icon 与 draw_vertline 精准标注交易信号

在量化策略开发中,将交易信号(买入、卖出点)直观地展示在 K 线图表上,对于策略调试、逻辑回测以及实盘监控至关重要。QMT(Quantitative Multi-strategy Trading)平台提供了丰富的绘图 API。本文将重点介绍如何使用 ContextInfo.draw_iconContextInfo.draw_vertline 在图表上精准绘制买卖点图标和垂直信号线。


1. 核心绘图函数解析

1.1 绘制小图标:ContextInfo.draw_icon

用于在指定的 K 线位置和价格高度绘制几何图标(如矩形、椭圆),常用于标记买卖点。

  • 用法ContextInfo.draw_icon(cond, height, type)
  • 参数说明
    • cond (bool):触发绘制的条件。当为 True 时在当前 Bar 绘制。
    • height (number):图标显示的价格高度位置(如当前 Bar 的收盘价 close 或最低价 low)。
    • type (number):图标类型。0 代表矩形,1 代表椭圆。

1.2 绘制垂直线:ContextInfo.draw_vertline

用于在指定的 K 线位置,在两个价格区间之间绘制一条垂直线,常用于突出显示交易信号触发的整根 K 线。

  • 用法ContextInfo.draw_vertline(cond, number1, number2, color = '', limit = '')
  • 参数说明
    • cond (bool):触发绘制的条件。
    • number1 (number):垂直线的起点价格高度。
    • number2 (number):垂直线的终点价格高度。
    • color (string):颜色,支持 'red' (红), 'green' (绿), 'blue' (蓝), 'yellow' (黄), 'white' (白), 'cyan' (蓝绿) 等。
    • limit (string):画线控制,可设为 'noaxis'(不影响坐标画线)或 'nodraw'(不画线)。

2. 实战代码示例:双均线策略信号标注

以下是一个完整的 QMT 策略示例。该策略基于简单的双均线交叉产生交易信号,并在金叉(买入)时绘制青色垂直线与矩形图标,在死叉(卖出)时绘制红色垂直线与椭圆图标

#encoding:gbk
import numpy as np

def init(ContextInfo):
    # 设定基础股票池
    ContextInfo.set_universe(['600000.SH'])
    # 定义全局变量存储均线周期
    ContextInfo.fast_period = 5
    ContextInfo.slow_period = 20

def handlebar(ContextInfo):
    # 获取当前 Bar 索引
    bar_index = ContextInfo.barpos
    if bar_index < ContextInfo.slow_period:
        return

    # 获取历史收盘价数据
    # 获取长度需要包含计算均线所需的足够 Bar
    close_data = ContextInfo.get_history_data(ContextInfo.slow_period + 1, '1d', 'close')
    stock = ContextInfo.stockcode + '.' + ContextInfo.market
    prices = close_data.get(stock, [])

    if len(prices) < ContextInfo.slow_period + 1:
        return

    # 计算均线
    fast_ma_curr = np.mean(prices[-ContextInfo.fast_period:])
    fast_ma_prev = np.mean(prices[-ContextInfo.fast_period-1:-1])
    
    slow_ma_curr = np.mean(prices[-ContextInfo.slow_period:])
    slow_ma_prev = np.mean(prices[-ContextInfo.slow_period-1:-1])

    # 获取当前 Bar 的价格信息用于绘图定位
    current_close = prices[-1]
    current_high = ContextInfo.get_market_data(['high'], stock_code=[stock], count=1)
    current_low = ContextInfo.get_market_data(['low'], stock_code=[stock], count=1)
    
    # 转换为标量数值
    high_val = float(current_high) if isinstance(current_high, (int, float)) else current_close
    low_val = float(current_low) if isinstance(current_low, (int, float)) else current_close

    # 初始化信号条件
    buy_signal = False
    sell_signal = False

    # 金叉判定(买入)
    if fast_ma_prev <= slow_ma_prev and fast_ma_curr > slow_ma_curr:
        buy_signal = True
        # 执行虚拟买入下单(回测模式)
        order_lots(stock, 10, ContextInfo)
        
    # 死叉判定(卖出)
    elif fast_ma_prev >= slow_ma_prev and fast_ma_curr < slow_ma_curr:
        sell_signal = True
        # 执行虚拟卖出下单(回测模式)
        order_lots(stock, -10, ContextInfo)

    # --- 信号可视化标注 ---
    # 1. 标注买入信号:在 K 线下方绘制青色矩形图标,并画出贯穿 K 线的垂直线
    if buy_signal:
        # 在最低价下方一点绘制矩形图标 (type=0)
        ContextInfo.draw_icon(buy_signal, low_val * 0.98, 0)
        # 绘制垂直线,连接最低价与最高价
        ContextInfo.draw_vertline(buy_signal, low_val * 0.95, high_val * 1.05, 'cyan')

    # 2. 标注卖出信号:在 K 线上方绘制红色椭圆图标,并画出贯穿 K 线的垂直线
    if sell_signal:
        # 在最高价上方一点绘制椭圆图标 (type=1)
        ContextInfo.draw_icon(sell_signal, high_val * 1.02, 1)
        # 绘制红色垂直线
        ContextInfo.draw_vertline(sell_signal, low_val * 0.95, high_val * 1.05, 'red')

3. 开发者实用技巧与注意事项

  1. 价格高度定位:在使用 draw_icon 时,建议不要直接传入 close,因为图标可能会重叠在 K 线上。买入信号建议使用 low * 0.98(K 线下方),卖出信号建议使用 high * 1.02(K 线上方),使图表更加美观整洁。
  2. 条件触发控制:绘图函数的第一个参数 cond 必须是布尔值(TrueFalse)。只有当条件成立时,QMT 平台才会在当前的这根 Bar 上渲染图形。
  3. 配合 ContextInfo.paint 使用:除了标注买卖点,你还可以使用 ContextInfo.paint 将计算出的均线(MA)本身绘制在主图上,与 draw_icon 结合,形成完整的可视化技术分析图表。