问题描述
请问一下 get_instrumentdetail 接口的结算价,涨跌停价在每天的什么时候更新?
通达信在每天的 8:45 会初始化数据? get_instrumentdetail 的每天更新时间是什么时候?
解决方案
在 QMT 平台中,get_instrumentdetail 接口用于获取合约的详细静态信息,包括前结算价格(SettlementPrice)、当日涨停价(UpStopPrice)和当日跌停价(DownStopPrice)等。
数据更新时间解析
关于这些数据的具体更新时间,QMT 官方 API 文档中并没有给出一个绝对统一的精确到分钟的时间点。这主要是因为 QMT 平台的数据更新依赖于所在券商服务器的早盘初始化时间以及交易所的数据下发时间。
根据一般的实盘经验:
- 更新时间段:通常在每个交易日早上的 8:30 到 9:00 之间,券商柜台会进行日间数据的初始化和清算交收后的数据同步。在这个时间段内,前一交易日的结算价以及根据规则计算出的当日涨跌停价会被更新到系统中。
- 与通达信的对比:您提到通达信在 8:45 左右初始化数据,QMT 的底层数据源在很多券商处与通达信是同源或类似的,因此 QMT 的这些静态数据通常也会在 8:45 到 9:00 左右准备就绪。
策略编写建议
为了确保您的量化策略能够获取到准确的当日涨跌停价和前结算价,建议您在策略中采取以下机制:
- 避免过早获取:不要在凌晨或早上 8:30 之前依赖该接口获取当日的涨跌停价,此时获取的可能是前一交易日的旧数据。
- 推荐获取时间:建议在 9:00 之后,或者在集合竞价开始前(如 9:15 的第一个 tick 到来时)调用
get_instrumentdetail获取这些数据。
代码示例
以下是如何在策略中获取这些数据的示例代码:
#coding:gbk
def init(ContextInfo):
# 设置股票池
ContextInfo.set_universe(['600000.SH'])
def handlebar(ContextInfo):
# 确保在盘中或集合竞价期间获取
if ContextInfo.is_last_bar():
stock_code = '600000.SH'
detail_info = ContextInfo.get_instrumentdetail(stock_code)
if detail_info:
pre_close = detail_info.get('PreClose', 0) # 前收盘价
settlement = detail_info.get('SettlementPrice', 0) # 前结算价
up_stop = detail_info.get('UpStopPrice', 0) # 当日涨停价
down_stop = detail_info.get('DownStopPrice', 0) # 当日跌停价
print(f"合约: {stock_code}")
print(f"前收盘价: {pre_close}, 前结算价: {settlement}")
print(f"涨停价: {up_stop}, 跌停价: {down_stop}")
总结:get_instrumentdetail 的数据更新依赖于券商早盘初始化,通常在 8:30-9:00 之间完成。建议在 9:00 之后调用以保证数据的准确性。