3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化策略开发中,将交易信号(买入、卖出点)直观地展示在 K 线图表上,对于策略调试、逻辑回测以及实盘监控至关重要。QMT(Quantitative Multi-strategy Trading)平台提供了丰富的绘图 API。本文将重点介绍如何使用 ContextInfo.draw_icon 和 ContextInfo.draw_vertline 在图表上精准绘制买卖点图标和垂直信号线。
ContextInfo.draw_icon用于在指定的 K 线位置和价格高度绘制几何图标(如矩形、椭圆),常用于标记买卖点。
ContextInfo.draw_icon(cond, height, type)cond (bool):触发绘制的条件。当为 True 时在当前 Bar 绘制。height (number):图标显示的价格高度位置(如当前 Bar 的收盘价 close 或最低价 low)。type (number):图标类型。0 代表矩形,1 代表椭圆。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'(不画线)。以下是一个完整的 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')
draw_icon 时,建议不要直接传入 close,因为图标可能会重叠在 K 线上。买入信号建议使用 low * 0.98(K 线下方),卖出信号建议使用 high * 1.02(K 线上方),使图表更加美观整洁。cond 必须是布尔值(True 或 False)。只有当条件成立时,QMT 平台才会在当前的这根 Bar 上渲染图形。ContextInfo.paint 使用:除了标注买卖点,你还可以使用 ContextInfo.paint 将计算出的均线(MA)本身绘制在主图上,与 draw_icon 结合,形成完整的可视化技术分析图表。