问题描述
解决方案
在 QMT 中获取 Level-2 的委买总量(Total Bid Quantity)和委卖总量(Total Ask/Off Quantity),需要使用 ContextInfo.get_market_data_ex 接口,并将周期参数 period 设置为 'l2quoteaux'(Level-2 行情快照指标)。
获取方法说明
- 接口函数:
ContextInfo.get_market_data_ex - 关键参数:
period: 必须设置为'l2quoteaux'。stock_code: 目标股票代码列表。count: 获取的数据条数,通常获取最新一条设为 1。
- 返回字段:
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: 请检查以下几点:
- 您的 QMT 账号是否已购买或开通 Level-2 行情权限。
- 确保
period参数拼写正确,必须为'l2quoteaux'。 - 确保在实盘或模拟盘模式下运行,部分回测历史数据可能不包含 Level-2 逐笔或快照数据。
Q: get_market_data 和 get_market_data_ex 有什么区别?
A: get_market_data 是旧版接口,官方建议使用 get_market_data_ex。新版接口返回的数据结构更统一(字典包含 DataFrame),且支持更多的数据周期类型(如 L2 快照)。
Q: 如何获取委买均价和委卖均价?
A: 在上述代码返回的 DataFrame 中,访问 avgBidPrice 即可获取委买均价,访问 avgOffPrice 即可获取委卖均价。