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

QMT 平台如何使用 draw_icon 与 draw_vertline 在图表上精准标记买卖信号?

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

问题描述

qmt 策略可视化:利用 draw_icon 与 draw_vertline 精准标记买卖点
如何在 qmt 策略的回测图表上,使用 draw_icon 和 draw_vertline 在触发交易信号时画出垂直线和图标?

解决方案

QMT 策略可视化:利用 draw_icon 与 draw_vertline 精准标记买卖点

在量化交易中,策略回测的可视化至关重要。通过在图表上直观地标记出买入和卖出信号,交易员可以快速评估策略逻辑的正确性及信号触发的实际位置。QMT(迅投极速量化交易系统)提供了丰富的绘图 API,其中 ContextInfo.draw_iconContextInfo.draw_vertline 是最常用于标记买卖点和交易区间的函数。


一、 核心绘图函数解析

1. 绘制垂直线:ContextInfo.draw_vertline

用于在指定的两个价格高度之间绘制一条垂直线,常用于标记信号触发的 K 线位置。

  • 用法ContextInfo.draw_vertline(cond, number1, number2, color = '', limit = '')
  • 参数
    • cond (bool):触发条件。当为 True 时,在当前 Bar 绘制垂直线。
    • number1 (number):垂直线的起点高度(通常设为当前 Bar 的最低价 low 或开盘价 open)。
    • number2 (number):垂直线的终点高度(通常设为当前 Bar 的最高价 high 或收盘价 close)。
    • color (string):颜色,支持 'blue', 'brown', 'cyan', 'green', 'magenta', 'red', 'white', 'yellow'
    • limit (string):画线控制,可选 'noaxis'(不影响坐标画线)或 'nodraw'(不画线)。

2. 绘制小图标:ContextInfo.draw_icon

用于在指定的价格高度上绘制一个小图标,常用于精准标记买卖点。

  • 用法ContextInfo.draw_icon(cond, height, type)
  • 参数
    • cond (bool):触发条件。当为 True 时绘制图标。
    • height (number):图标显示的价格高度位置。
    • type (number):图标类型。0 代表矩形,1 代表椭圆。

二、 完整策略源码示例

以下是一个简单的双均线交叉策略示例。当金叉触发时,在图表上绘制绿色垂直线并在最低价下方标记矩形买入图标;当死叉触发时,绘制红色垂直线并在最高价上方标记椭圆卖出图标

#encoding:gbk
import pandas as pd
import numpy as np

def init(ContextInfo):
    # 设定股票池
    ContextInfo.stock = ContextInfo.stockcode + '.' + ContextInfo.market
    ContextInfo.set_universe([ContextInfo.stock])
    print(f"初始化策略,当前标的: {ContextInfo.stock}")

def handlebar(ContextInfo):
    # 获取当前 K 线索引
    barpos = ContextInfo.barpos
    if barpos < 30:
        return

    # 获取历史收盘价、最高价、最低价
    close_data = ContextInfo.get_history_data(30, ContextInfo.period, 'close')[ContextInfo.stock]
    high_data = ContextInfo.get_history_data(30, ContextInfo.period, 'high')[ContextInfo.stock]
    low_data = ContextInfo.get_history_data(30, ContextInfo.period, 'low')[ContextInfo.stock]

    if len(close_data) < 20:
        return

    # 计算均线
    ma5 = np.mean(close_data[-5:])
    ma20 = np.mean(close_data[-20:])
    
    # 上一期的均线值用于判断交叉
    ma5_ref = np.mean(close_data[-6:-1])
    ma20_ref = np.mean(close_data[-21:-1])

    # 获取当前 Bar 的价格用于定位
    current_close = close_data[-1]
    current_high = high_data[-1]
    current_low = low_data[-1]

    # 1. 金叉买入信号
    gold_fork = (ma5_ref <= ma20_ref) and (ma5 > ma20)
    
    # 2. 死叉卖出信号
    death_fork = (ma5_ref >= ma20_ref) and (ma5 < ma20)

    # --- 信号可视化标记 ---
    
    # 触发金叉:画青色垂直线,并在最低价下方画矩形图标(0)
    if gold_fork:
        # 绘制垂直线(从最低价到最高价)
        ContextInfo.draw_vertline(True, current_low, current_high, 'cyan')
        # 在最低价稍低的位置绘制买入图标
        ContextInfo.draw_icon(True, current_low * 0.99, 0)
        print(f"[金叉信号] Barpos: {barpos}, 价格: {current_close}")

    # 触发死叉:画红色垂直线,并在最高价上方画椭圆图标(1)
    elif death_fork:
        # 绘制垂直线
        ContextInfo.draw_vertline(True, current_low, current_high, 'red')
        # 在最高价稍高的位置绘制卖出图标
        ContextInfo.draw_icon(True, current_high * 1.01, 1)
        print(f"[死叉信号] Barpos: {barpos}, 价格: {current_close}")

三、 最佳实践与注意事项

  1. 图标位置微调:在调用 draw_icon 时,如果直接将 height 设为 current_lowcurrent_high,图标可能会与 K 线重叠。建议像示例中一样,买入点设为 current_low * 0.99(向下偏移 1%),卖出点设为 current_high * 1.01(向上偏移 1%),使图表更加美观。
  2. 条件触发控制draw_vertlinedraw_icon 的第一个参数 cond 必须是布尔值。只有当信号真正成立的那一根 Bar 上传入 True,才能精准标记,避免每根 K 线都重复绘制。
  3. 主图叠加显示:为了让标记直接显示在 K 线图上,请在新建策略的基本信息中,将【位置】设置为 主图叠加