🚀 AI 一键生成 qmt 策略代码

QMT 价格行为分析:Inside Bar (孕线) 形态识别策略

qmt | 发布时间: 2025/12/24
以下内容由 EasyQuant 生成。

问题描述

怎么用代码识别 Inside Bar 形态?

解决方案

Inside Bar(孕线)是一种常见的价格形态,通常表示市场处于盘整或犹豫状态。它的定义是:当前 K 线的最高价低于前一根 K 线的最高价,且当前 K 线的最低价高于前一根 K 线的最低价。即当前 K 线完全被“包含”在前一根 K 线的高低范围内。

在 QMT 中,我们可以通过获取最近两根 K 线的 high(最高价)和 low(最低价)来进行比较识别。

以下是具体的实现代码和逻辑说明。

核心逻辑

  1. 获取数据:使用 ContextInfo.get_market_data_ex 获取当前品种最近 2 根 K 线的高低价数据。
  2. 定义条件
    • Current_High < Previous_High
    • Current_Low > Previous_Low
  3. 执行操作:如果满足上述条件,则判定为 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 

代码详解

  1. # -*- coding: gbk -*-:

    • 这是 QMT Python 策略文件的标准编码声明,防止中文注释乱码。
  2. ContextInfo.get_market_data_ex:

    • 这是获取行情的推荐接口。
    • count=2: 我们只需要比较当前根和前一根,所以取 2 条数据即可。
    • period=ContextInfo.period: 自动适配当前主图的周期(如日线、分钟线)。
  3. df.iloc[-1]df.iloc[-2]:

    • Pandas DataFrame 的位置索引。-1 代表最后一行(当前 K 线),-2 代表倒数第二行(前一根 K 线)。
  4. 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),且支持订阅逻辑,处理多股数据时更方便。