问题描述
解决方案
Inside Bar(孕线)是一种常见的价格形态,通常表示市场处于盘整或犹豫状态。它的定义是:当前 K 线的最高价低于前一根 K 线的最高价,且当前 K 线的最低价高于前一根 K 线的最低价。即当前 K 线完全被“包含”在前一根 K 线的高低范围内。
在 QMT 中,我们可以通过获取最近两根 K 线的 high(最高价)和 low(最低价)来进行比较识别。
以下是具体的实现代码和逻辑说明。
核心逻辑
- 获取数据:使用
ContextInfo.get_market_data_ex获取当前品种最近 2 根 K 线的高低价数据。 - 定义条件:
Current_High < Previous_HighCurrent_Low > Previous_Low
- 执行操作:如果满足上述条件,则判定为 Inside Bar,可以在图表上标记或打印日志。
QMT 策略代码实现
# -*- coding: gbk -*-
def init(ContextInfo):
"""
初始化函数
"""
# 如果没有设置股票池,默认设置一个用于测试
if not ContextInfo.get_universe():
ContextInfo.set_universe(['600000.SH'])
print("策略初始化完成,开始识别 Inside Bar 形态...")
def handlebar(ContextInfo):
"""
K线逐根运行函数
"""
# 获取当前主图的股票代码
stock_code = ContextInfo.stockcode
# 获取当前主图的周期
period = ContextInfo.period
# 获取最近 2 根 K 线的数据(High 和 Low)
# count=2 表示获取当前根和前一根
data_map = ContextInfo.get_market_data_ex(
['high', 'low'],
[stock_code],
period=period,
count=2,
dividend_type=ContextInfo.dividend_type
)
# 数据校验:确保获取到了数据且长度足够
if stock_code not in data_map:
return
df = data_map[stock_code]
if len(df) < 2:
return
# 获取当前 K 线(最新一根)的数据
curr_high = df.iloc[-1]['high']
curr_low = df.iloc[-1]['low']
# 获取前一根 K 线的数据
prev_high = df.iloc[-2]['high']
prev_low = df.iloc[-2]['low']
# --- Inside Bar 识别逻辑 ---
# 条件:当前最高价 < 前一根最高价 且 当前最低价 > 前一根最低价
is_inside_bar = (curr_high < prev_high) and (curr_low > prev_low)
# 如果识别成功
if is_inside_bar:
# 1. 在日志中输出
timetag = df.index[-1] # 获取时间索引
print(f"发现 Inside Bar: {stock_code} 时间: {timetag}")
# 2. 在图表上标记 "IB" (Inside Bar)
# draw_text(条件, 位置, 文字)
# 在当前 K 线最高价上方显示 'IB'
ContextInfo.draw_text(True, curr_high, 'IB')
# 3. (可选) 可以在此处添加交易逻辑,例如突破交易策略
# pass
代码详解
-
# -*- coding: gbk -*-:- 这是 QMT Python 策略文件的标准编码声明,防止中文注释乱码。
-
ContextInfo.get_market_data_ex:- 这是获取行情的推荐接口。
count=2: 我们只需要比较当前根和前一根,所以取 2 条数据即可。period=ContextInfo.period: 自动适配当前主图的周期(如日线、分钟线)。
-
df.iloc[-1]与df.iloc[-2]:- Pandas DataFrame 的位置索引。
-1代表最后一行(当前 K 线),-2代表倒数第二行(前一根 K 线)。
- Pandas DataFrame 的位置索引。
-
ContextInfo.draw_text:- 这是一个绘图函数,用于在回测或实盘界面的 K 线图上直观地标记出形态。当条件满足时,它会在 K 线顶部写上 "IB"。
常见问题 (Q&A)
Q: Inside Bar 形态通常意味着什么?
A: Inside Bar 通常代表市场波动率的收缩(Volatility Contraction)。它表示多空双方力量暂时均衡,市场处于休整状态。这种形态之后往往紧随着波动率的扩张,即价格突破。
Q: 代码中是否包含相等的判断(<= 或 >=)?
A: 标准的 Inside Bar 定义通常是严格的“小于”和“大于”。但在实际量化中,如果遇到最高价或最低价完全相等的情况,也可以视作包含形态。如果需要包含相等的情况,可以将代码修改为 (curr_high <= prev_high) and (curr_low >= prev_low)。
Q: 如何利用 Inside Bar 进行交易?
A: 常见的策略是突破交易。
- 做多:当下一根 K 线的价格突破 Inside Bar(或其母线)的最高价时买入。
- 做空:当下一根 K 线的价格跌破 Inside Bar(或其母线)的最低价时卖出。
Q: 为什么使用 get_market_data_ex 而不是 get_market_data?
A: get_market_data_ex 是 QMT 较新的接口,返回的数据结构更规范(字典包含 DataFrame),且支持订阅逻辑,处理多股数据时更方便。