QMT订阅深度解析:get_market_data_ex 与 subscribe_quote 的区别

QUANT 2025-11-25 15:17:34 112 举报

QMT中两种主流的实时行情订阅方式,虽然它们都能实现数据订阅,但在设计理念、使用方式和适用场景上存在显著差异。

简单来说,它们的核心区别在于:一个是拉取+自动订阅的一体化模式,另一个是被动获取的专业订阅模式。


ContextInfo.get_market_data_ex(subscribe=True):一体化的“拉取”模式

我们可以将这个函数理解为一个全能选手。当我们 中调用它并保持默认参数 时,它会同时做两件事:

1      拉取数据:从我们的本地缓存中读取历史数据。

2      自动订阅:在后台默默地为我们订阅该股票的实时行情。

会自动将历史数据和最新接收到的实时数据拼接在一起,让我们在单次调用中就能获得一个连续的数据序列。需要主动调用这个函数来获取数据。


适用场景

当我们的策略逻辑需要在一个时间截面上,同时分析刚刚过去的NK线最新的行情时,这个函数非常方便。例如,在每个分钟线分笔数据的开始,我们需要计算过去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整理 ,一起学习欢迎 沟通


尊重知识,尊重市场 1

著作权归文章作者所有。

最新回复 ( 0 )
发新帖
0