问题描述
get_full_tick 无法获取 lv2,可以用 get_market_data_ex 替代并且只获取实时最新数据?
解决方案
核心解答
可以的。 在 QMT 平台中,get_full_tick 主要用于获取基础的最新分笔快照数据,确实无法直接获取 Level2 的特色指标。你可以完全使用 get_market_data_ex 来替代,并通过设置特定的参数来只获取实时的最新 Level2 数据。
替代方案与参数设置
get_market_data_ex 是一个功能非常强大的数据获取接口,它支持获取 Level2 的快照指标和大单统计数据。为了只获取实时最新的一条数据,你需要这样设置参数:
period(周期):设置为'l2quoteaux'(Level2 行情快照指标) 或'l2transactioncount'(Level2 大单统计)。count(数据个数):设置为1,表示只取最新的一条数据。end_time(结束时间):保持为空字符串'',系统会默认视为获取最新数据。
Python 代码示例
以下是在 QMT 策略中获取最新 Level2 数据的代码示例:
#coding:gbk
def init(ContextInfo):
# 设置股票池,例如平安银行
ContextInfo.set_universe(['000001.SZ'])
def handlebar(ContextInfo):
# 确保在最后一根K线(实时行情)才触发
if not ContextInfo.is_last_bar():
return
stock_list = ContextInfo.get_universe()
# 1. 获取最新的 Level2 行情快照指标 (l2quoteaux)
# count=1 且 end_time='' 表示只获取最新的一条数据
l2_quote_data = ContextInfo.get_market_data_ex(
fields=[], # 空列表代表获取所有字段
stock_code=stock_list,
period='l2quoteaux', # 指定为 L2 快照指标
start_time='',
end_time='', # 为空视为最新
count=1, # 只取1条
dividend_type='none',
fill_data=True,
subscribe=True
)
print("最新 L2 快照数据:")
for code, df in l2_quote_data.items():
if not df.empty:
print(f"代码: {code}")
print(df)
# 例如获取委买总量:df['totalBidQuantity'].iloc[-1]
# 2. 获取最新的 Level2 大单统计数据 (l2transactioncount)
l2_trans_data = ContextInfo.get_market_data_ex(
fields=[],
stock_code=stock_list,
period='l2transactioncount', # 指定为 L2 大单统计
start_time='',
end_time='',
count=1,
dividend_type='none',
fill_data=True,
subscribe=True
)
print("最新 L2 大单统计数据:")
for code, df in l2_trans_data.items():
if not df.empty:
print(f"代码: {code}")
print(df)
⚠️ 重要注意事项
- 权限要求:获取 Level2 数据(
l2quoteaux和l2transactioncount)必须额外开通 Level-2 增强版权限,否则接口可能返回空数据或报错。 - 性能优化:如果你需要高频、低延迟地处理 L2 数据,建议结合
ContextInfo.subscribe_quote()接口使用回调函数(callback)的方式进行订阅推送,这样比在handlebar中轮询调用get_market_data_ex效率更高。