QMT中两种主流的实时行情订阅方式,虽然它们都能实现数据订阅,但在设计理念、使用方式和适用场景上存在显著差异。
简单来说,它们的核心区别在于:一个是“拉取+自动订阅”的一体化模式,另一个是“被动获取”的专业订阅模式。
ContextInfo.get_market_data_ex(subscribe=True):一体化的“拉取”模式
我们可以将这个函数理解为一个“全能选手”。当我们在 中调用它并保持默认参数 时,它会同时做两件事:
1 拉取数据:从我们的本地缓存中读取历史数据。
2 自动订阅:在后台默默地为我们订阅该股票的实时行情。
会自动将历史数据和最新接收到的实时数据“拼接”在一起,让我们在单次调用中就能获得一个连续的数据序列。需要主动调用这个函数来获取数据。
适用场景
当我们的策略逻辑需要在一个时间截面上,同时分析“刚刚过去的N根K线”和“最新的行情”时,这个函数非常方便。例如,在每个分钟线分笔数据的开始,我们需要计算过去20根分钟线的均线,并结合当前价格做判断。
# 示例:在每个bar中获取含最新价的K线序列
def handlebar(ContextInfo):
# 获取包含历史和最新实时数据的过去20根1分钟K线
# QMT会自动处理订阅和数据拼接
data = ContextInfo.get_market_data_ex(
fields=["close"],
stock_code=["000001.SZ"],
period="1m",
count=20, # 获取最新的20条数据
subscribe=True # 默认就是True
)
# data里已经包含了最新的行情
current_price = data["000001.SZ"]["close"].iloc[-1]
print(f"最新价: {current_price}")ContextInfo.subscribe_quote:专业的“推送”模式
这个函数它只负责一件事:实时监控行情服务器只要监控的股票有新的行情数据(例如一个新的Tick或一根新的K线形成),服务器就会主动将这个新数据“推送”(Push)给我们的程序。
这种推送是通过我们在订阅时指定的回调函数(Callback)来实现的。每当新数据到来,QMT就会自动调用我们设定的那个函数。
适用场景
这种模式非常适合事件驱动的策略。例如,我们希望“一旦A股票的最新成交价突破10元,就立刻执行买入操作”。这种场景下,我们不需要反复去“拉取”数据,只需要在回调函数里设置好触发逻辑即可,效率更高,响应更及时。
#encoding:gbk
def call_back(data):
print(data)
# data 形如:{'000001.SZ': DataFrame}
for code, df in data.items():
# 取最新一行的收盘价(列名为 close)
last_close = df["close"].iloc[-1]
if last_close > 10:
print(code, "价格大于 10,买入")
#自行补充下单代码
def init(C):
C.subID = C.subscribe_quote("000001.SZ", "1d", callback=call_back)
def handlebar(C):
print("============================")
print("C.subID: ", C.subID)区别对比
为了让我们更直观地理解,我们将两者的区别整理在下表中:
总结与建议
• 如果我们是初学者,或者我们的策略逻辑比较简单,需要在每个 周期内分析一段时间的K线(包含最新价),那么强烈推荐使用 。它简单直接,一步到位。
• 如果我们的策略对实时性要求很高,需要对每一个Tick或价格变动做出快速反应,或者我们想构建更灵活、高效的事件驱动框架,那么即使用或者订阅全推函数配合回调函数
关注我,后续将持续将qmt/ptrad整理 ,一起学习欢迎 沟通。
著作权归文章作者所有。