3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,策略回测的可视化至关重要。通过在图表上直观地标记出买入和卖出信号,交易员可以快速评估策略逻辑的正确性及信号触发的实际位置。QMT(迅投极速量化交易系统)提供了丰富的绘图 API,其中 ContextInfo.draw_icon 和 ContextInfo.draw_vertline 是最常用于标记买卖点和交易区间的函数。
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'(不画线)。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}")
draw_icon 时,如果直接将 height 设为 current_low 或 current_high,图标可能会与 K 线重叠。建议像示例中一样,买入点设为 current_low * 0.99(向下偏移 1%),卖出点设为 current_high * 1.01(向上偏移 1%),使图表更加美观。draw_vertline 和 draw_icon 的第一个参数 cond 必须是布尔值。只有当信号真正成立的那一根 Bar 上传入 True,才能精准标记,避免每根 K 线都重复绘制。