问题描述
解决方案
在 QMT (Quantitative Trading Platform) 中,获取一只股票的实时内盘(主动卖出成交量)和外盘(主动买入成交量)数据,主要使用 ContextInfo 对象提供的专用接口。
核心函数
-
获取内盘成交量:
ContextInfo.get_svol(stockcode)- 含义:获取指定股票的内盘成交量(即以买入价成交的累计数量,通常代表空头力量)。
- 返回值:
string类型(注意:返回的是字符串,如需计算需转换为数值)。
-
获取外盘成交量:
ContextInfo.get_bvol(stockcode)- 含义:获取指定股票的外盘成交量(即以卖出价成交的累计数量,通常代表多头力量)。
- 返回值:
string类型。
代码实现示例
以下是一个完整的策略示例,展示如何在 handlebar 函数中获取并打印某只股票(例如平安银行 000001.SZ)的内盘和外盘数据。
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置需要查询的股票代码
ContextInfo.stock = '000001.SZ'
print(f"策略初始化,监测股票: {ContextInfo.stock}")
def handlebar(ContextInfo):
# 为了避免在回测历史K线时重复打印,通常只在最新的一根K线(实时行情)通过
if not ContextInfo.is_last_bar():
return
stock_code = ContextInfo.stock
# 1. 获取内盘成交量 (Active Sell Volume)
# 注意:接口返回的是字符串类型
svol_str = ContextInfo.get_svol(stock_code)
# 2. 获取外盘成交量 (Active Buy Volume)
bvol_str = ContextInfo.get_bvol(stock_code)
# 3. 数据处理与打印
try:
# 转换为浮点数或整数以便计算
svol = float(svol_str)
bvol = float(bvol_str)
print(f"========== {stock_code} 实时盘口数据 ==========")
print(f"内盘 (主动卖出): {svol}")
print(f"外盘 (主动买入): {bvol}")
# 计算委比或量比逻辑示例
if svol + bvol > 0:
ratio = bvol / (svol + bvol)
print(f"外盘占比: {ratio:.2%}")
except ValueError:
print(f"数据获取异常,返回值为: 内盘{svol_str}, 外盘{bvol_str}")
注意事项
- 数据类型转换:
get_svol和get_bvol返回的是字符串(String),如果需要进行数学运算(如计算内外盘差值、比例),必须先使用float()或int()进行转换。 - 缺省参数:如果调用时不传入
stockcode参数(即ContextInfo.get_svol()),默认获取当前主图品种的数据。 - 数据更新:这两个函数获取的是快照数据,建议在
handlebar中配合ContextInfo.is_last_bar()使用,以确保获取的是最新的实时状态。
Q&A
Q: get_svol 和 get_bvol 返回的数据单位是什么?
A: 返回的数据单位通常是手(1手=100股)或股,具体取决于券商行情源的推送格式。建议在实盘中打印数值与行情软件对比确认,通常与行情软件上显示的“内盘”、“外盘”数值一致。
Q: 如果返回的数据为空字符串怎么办?
A: 在集合竞价期间或非交易时间,或者数据未推送到位时,可能会返回空字符串或无效数据。在代码中应加入 try-except 块或非空判断来增强策略的健壮性。
Q: 除了这两个函数,还有其他方式获取盘口详情吗?
A: 可以使用 ContextInfo.get_full_tick(stock_code) 获取最新的 Tick 数据。该函数返回一个字典,包含了 askPrice(卖价五档)、bidPrice(买价五档)、askVol、bidVol 等详细盘口挂单信息,但不直接包含累计的内外盘成交量,内外盘通常需要通过 get_svol/get_bvol 获取。