问题描述
你好,使用海通证券提供的E海方舟量化版时,遇到了这样一个问题:
麻烦帮忙看一下原因,在使用data = ContextInfo.get_full_tick(['IF2407.IF'])取数据时,返回
返回如下信息:
{'IF2407.IF': {'timetag': '20240613 00:00:00', 'lastPrice': 3502.0, 'open': 3502.0, 'high': 3502.0, 'low': 3502.0, 'lastClose': 3502.0, 'amount': 0.0, 'volume': 0, 'pvolume': 0, 'stockStatus': 0, 'openInt': 18603, 'settlementPrice': 0.0, 'lastSettlementPrice': 0.0, 'askPrice': [0.0, 0.0, 0.0, 0.0, 0.0], 'bidPrice': [0.0, 0.0, 0.0, 0.0, 0.0], 'askVol': [0, 0, 0, 0, 0], 'bidVol': [0, 0, 0, 0, 0]}}
timetag为: '20240613 00:00:00,并没有返回实时信息。
并且, 'lastPrice': 3502.0, 'open': 3502.0, 'high': 3502.0, 'low': 3502.0, 'lastClose': 3502.0, 都是同一个数据3502.0,且amount': 0.0, 'volume': 0, 'pvolume': 0, 'stockStatus': 0, 都为0.
请帮我看看原因,谢谢
解决方案
你好!在QMT(E海方舟量化版底层)中使用 ContextInfo.get_full_tick 获取数据时,如果返回的 timetag 为 00:00:00,且价格字段全部相同、成交量为 0、买卖五档皆为 0,这通常意味着策略没有获取到该合约的实时行情数据,返回的仅仅是系统初始化的静态昨收数据。
出现这种情况通常有以下几个原因及对应的解决方法:
1. 未显式订阅行情数据(最常见原因)
QMT 平台为了节省资源,默认只会推送主图(当前图表)的行情。如果你在代码中直接使用 get_full_tick 去获取非主图合约的数据,且没有提前订阅,就会取到这种无效的空数据。
解决方法:
在 init 函数中使用 ContextInfo.subscribe_quote 显式订阅该合约的 tick 行情,或者使用更推荐的 get_market_data_ex 接口(自带订阅功能)。
推荐写法(使用 get_market_data_ex):
def handlebar(ContextInfo):
# 使用 get_market_data_ex 获取 tick 数据,subscribe=True 会自动订阅
tick_data = ContextInfo.get_market_data_ex(
[],
['IF2407.IF'],
period='tick',
subscribe=True
)
print(tick_data)
传统写法(先订阅,再获取):
def init(ContextInfo):
# 在初始化时订阅 IF2407.IF 的 tick 行情
ContextInfo.subscribe_quote('IF2407.IF', period='tick')
def handlebar(ContextInfo):
# 盘中获取最新 tick
data = ContextInfo.get_full_tick(['IF2407.IF'])
print(data)
2. 在非交易时间运行策略
如果你是在非交易时间(如周末、节假日或盘后)点击“运行”或“回测”,由于当前没有实时的 tick 数据推送,系统只能返回当天的初始状态数据(即昨收价,且成交量为0)。
解决方法:请在期货的实际交易时间段内(如上午 9:30-11:30,下午 13:00-15:00)运行实盘/模拟策略进行测试。
3. 客户端行情服务器未连接
请检查 E海方舟 客户端右下角的行情连接状态。如果行情断开,或者你登录的账号权限没有开通中金所的实时行情(部分券商默认可能只提供延时或不提供股指期货行情),也会导致取不到数据。
解决方法:确认客户端行情连接正常,且能在软件的行情界面正常看到 IF2407.IF 的实时跳动。
总结:
建议你将代码改为使用 ContextInfo.get_market_data_ex 并设置 subscribe=True,同时确保在盘中交易时间运行,即可解决此问题。