问题描述
解决方案
在 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 线图上标记:
- 当收盘价大于开盘价(阳线)时,在最高价上方显示文字 "涨"。
- 当收盘价大于开盘价(阳线)时,在最高价上方显示具体的 收盘价数值。
您可以将此代码复制到 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)
注意事项
-
坐标轴位置 (
position):position参数决定了文字/数字在 Y 轴(价格轴)上的高度。- 为了避免文字遮挡 K 线,通常会在
high(最高价)的基础上乘以一个系数(如1.01)使其显示在上方,或在low(最低价)基础上乘以系数(如0.99)使其显示在下方。
-
运行模式:
- 这些绘图函数主要用于界面显示(回测或实盘的模型图表)。
- 如果在后台纯算法交易模式下运行,这些绘图函数不会产生视觉效果,但不会报错。
-
颜色控制:
draw_text和draw_number目前不支持直接通过参数设置颜色,它们通常跟随系统默认配色或指标配色。- 如果需要绘制带颜色的线条或柱状图,请使用
ContextInfo.paint()函数。
-
性能:
handlebar是逐根 K 线执行的。绘图函数会在每一根满足条件的 K 线上留下标记。
Q&A
Q: 如何在副图(指标窗口)而不是主图上显示?
A: draw_text 和 draw_number 默认绘制在策略运行的窗口。如果您将策略叠加在主图上(“主图叠加”),它就画在主图;如果您将策略作为副图指标运行,它就会画在副图区域。
Q: 可以显示中文吗?
A: 可以。如示例所示,只要文件头部声明了 # -*- coding: gbk -*-,即可正常显示中文字符。
Q: 如何画竖线来标记特定日期?
A: 可以使用 ContextInfo.draw_vertline(cond, price1, price2, color)。例如:ContextInfo.draw_vertline(is_up_candle, 0, 10000, 'red') 会在满足条件的 K 线处画一条红色的竖线。