问题描述
我计算出了一个自定义指标,怎么能把它画在K线图上观察?
解决方案
在 QMT 中,如果你计算出了一个自定义指标,想要将其画在 K 线图上进行观察,主要使用的是 ContextInfo.paint() 函数。
该函数需要在 handlebar(ContextInfo) 中调用,QMT 会逐根 K 线执行该函数,从而将指标数值连成线或画成柱状图。
核心函数说明
ContextInfo.paint(name, value, index, line_style, color, limit)
- name (string): 指标名称(显示在图表左上角)。
- value (number): 当前 K 线对应的指标数值。
- index (number): 索引位置,通常填 -1,表示在当前主图对应的 K 线位置画图。
- line_style (number): 线型。
0: 曲线(默认)42: 柱状线
- color (string): 颜色(如 'red', 'blue', 'yellow', 'white' 等)。
- limit (string): 控制选项(可选)。
'noaxis': 不影响坐标轴缩放(即画在图上但不改变主图的纵坐标范围)。'nodraw': 不画线(仅显示数值)。
代码示例
下面是一个完整的策略代码示例。为了演示,我计算了一个简单的自定义指标:典型价格 (Typical Price),计算公式为 (最高价 + 最低价 + 收盘价) / 3,并将其画在图上。
# -*- coding: gbk -*-
def init(ContextInfo):
# 初始化函数,这里不需要做特殊设置
pass
def handlebar(ContextInfo):
# 1. 获取当前主图品种的代码
stock_code = ContextInfo.stockcode
# 2. 获取当前 K 线的数据(开高低收)
# count=1 表示只取最新的一根(当前正在运行的这根 K 线)
# 注意:get_market_data 返回的是 pandas DataFrame 或 Series
data = ContextInfo.get_market_data(
['high', 'low', 'close'],
stock_code=[stock_code],
count=1,
period=ContextInfo.period,
dividend_type=ContextInfo.dividend_type
)
# 3. 确保获取到了数据
if data.empty:
return
# 4. 提取数值 (由于返回的是结构化数据,我们需要提取出具体的 float 值)
# 注意:这里根据返回数据的结构,可能需要根据实际情况调整索引方式
# 在 handlebar 中单品种 count=1 通常返回 DataFrame,行索引为时间,列为字段
try:
current_high = data['high'].values[0]
current_low = data['low'].values[0]
current_close = data['close'].values[0]
except:
return # 数据异常则跳过
# 5. 计算自定义指标:典型价格 (Typical Price)
custom_indicator_value = (current_high + current_low + current_close) / 3
# 6. 将指标画在图上
# 参数说明:名称, 数值, 索引(-1), 线型(0为线), 颜色, 限制
ContextInfo.paint("典型价格", custom_indicator_value, -1, 0, "yellow")
# 示例:再画一条柱状图,例如显示收盘价,用红色柱状表示
# ContextInfo.paint("收盘柱状", current_close, -1, 42, "red")
如何在 QMT 界面中查看
- 创建策略:将上述代码复制到 QMT 的【策略编辑器】中。
- 设置显示位置:
- 在策略编辑器的右侧(或“基本信息”设置中),找到 “位置” 选项。
- 主图叠加:如果你希望指标和 K 线画在一起(例如均线),选择“主图叠加”。
- 副图:如果你希望指标单独显示在 K 线图下方(例如 MACD、RSI),选择“副图”。
- 运行:点击“运行”或“回测”。
- 观察:随着 K 线的推进,你会看到黄色的线(典型价格)绘制在图表上。
补充提示
- 文字和图标:除了画线,你还可以使用
ContextInfo.draw_text()在特定位置写字,或使用ContextInfo.draw_icon()标记买卖点图标。 - 坐标轴影响:如果你的指标数值非常大或非常小(与股价不在一个数量级,例如成交量),请务必将策略位置设置为 “副图”,否则会导致主图 K 线被压缩成一条直线看不清楚。或者在
paint函数最后一个参数使用'noaxis'。