🚀 AI 一键生成 qmt 策略代码

QMT Level-2 数据:解析行情快照中的委买委卖总量

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

问题描述

如何获取 Level-2 的委买委卖总量?

解决方案

在 QMT 中获取 Level-2 的委买总量(Total Bid Quantity)和委卖总量(Total Ask/Off Quantity),需要使用 ContextInfo.get_market_data_ex 接口,并将周期参数 period 设置为 'l2quoteaux'(Level-2 行情快照指标)。

获取方法说明

  1. 接口函数ContextInfo.get_market_data_ex
  2. 关键参数
    • period: 必须设置为 'l2quoteaux'
    • stock_code: 目标股票代码列表。
    • count: 获取的数据条数,通常获取最新一条设为 1。
  3. 返回字段
    • totalBidQuantity: 委买总量
    • totalOffQuantity: 委卖总量

注意:使用此功能通常需要您的资金账号开通了 Level-2 行情权限,否则可能无法获取数据或返回空值。

策略代码示例

以下是一个完整的 Python 策略示例,展示如何在 handlebar 中获取并打印指定股票的 Level-2 委买委卖总量。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 设置要查询的股票代码,例如浦发银行
    ContextInfo.stock = '600000.SH'
    print("策略初始化完成,准备获取 Level-2 数据...")

def handlebar(ContextInfo):
    # 为了避免回测时历史数据过多打印,这里限制只在最新的一根K线或实时行情中打印
    if not ContextInfo.is_last_bar():
        return

    # 获取 Level-2 行情快照指标
    # period='l2quoteaux' 是获取 L2 快照指标的关键
    l2_data = ContextInfo.get_market_data_ex(
        fields=[],  # 传空列表代表获取所有字段
        stock_code=[ContextInfo.stock],
        period='l2quoteaux',
        count=1,
        subscribe=True  # 开启订阅以确保数据更新
    )

    # 解析返回的数据
    if ContextInfo.stock in l2_data:
        df = l2_data[ContextInfo.stock]
        
        if not df.empty:
            # 获取最新的一行数据
            latest_record = df.iloc[-1]
            
            # 提取委买总量和委卖总量
            # 注意:根据文档,字段名为 totalBidQuantity 和 totalOffQuantity
            total_bid_qty = latest_record.get('totalBidQuantity', 0)
            total_ask_qty = latest_record.get('totalOffQuantity', 0)
            
            # 打印结果
            print("=" * 30)
            print(f"股票代码: {ContextInfo.stock}")
            print(f"时间: {latest_record.get('stime', 'Unknown')}")
            print(f"Level-2 委买总量: {int(total_bid_qty)}")
            print(f"Level-2 委卖总量: {int(total_ask_qty)}")
            
            # 计算委比 (可选)
            if total_bid_qty + total_ask_qty > 0:
                ratio = (total_bid_qty - total_ask_qty) / (total_bid_qty + total_ask_qty) * 100
                print(f"委比: {ratio:.2f}%")
            print("=" * 30)
        else:
            print(f"未获取到 {ContextInfo.stock} 的 L2 数据,DataFrame 为空。")
    else:
        print(f"未获取到 {ContextInfo.stock} 的 L2 数据。")

字段详解

根据 QMT API 文档(附录 6.6.1),period='l2quoteaux' 返回的 DataFrame 包含以下主要字段:

字段名 类型 说明
time int 时间戳(毫秒)
stime str 时间字符串
avgBidPrice float 委买均价
totalBidQuantity int 委买总量
avgOffPrice float 委卖均价
totalOffQuantity int 委卖总量
withdrawBidQuantity int 买入撤单总量
withdrawOffQuantity int 卖出撤单总量

Q&A

Q: 为什么运行代码后没有数据返回或报错?
A: 请检查以下几点:

  1. 您的 QMT 账号是否已购买或开通 Level-2 行情权限。
  2. 确保 period 参数拼写正确,必须为 'l2quoteaux'
  3. 确保在实盘或模拟盘模式下运行,部分回测历史数据可能不包含 Level-2 逐笔或快照数据。

Q: get_market_dataget_market_data_ex 有什么区别?
A: get_market_data 是旧版接口,官方建议使用 get_market_data_ex。新版接口返回的数据结构更统一(字典包含 DataFrame),且支持更多的数据周期类型(如 L2 快照)。

Q: 如何获取委买均价和委卖均价?
A: 在上述代码返回的 DataFrame 中,访问 avgBidPrice 即可获取委买均价,访问 avgOffPrice 即可获取委卖均价。