如何在QMT中使用“订阅”数据和“反订阅”? 针对不同接口详细使用讲解

QUANT 2025-11-25 10:41:28 94 举报

我们不仅需要基于历史数据进行均线及指标的计算或者回测,更需要对市场的瞬息万变做出快速反应。实时捕捉到市场的每一次价格变动。QMT为我们提供了强大的“订阅”功能。


QMT中三个核心的订阅接口:

subscribe_quote

subscribe_whole_quote

unsubscribe_quote


 subscribe_quote 订阅行情数据(订阅单个或多个指定股票的特定周期行情数据(K线或Tick)。券商板订阅有行情数量限制(100)且仅能获取一档数据)。

 案例,订阅贵州茅台(600519.SH)的1分钟K线数据。每当有新的1分钟K线生成,我们就会打印出它的收盘价

# 1. 首先,定义(回调函数),告诉QMT收到数据后该做什么
def on_kline_update(data):
    """
    这个函数会在每次有新的1分钟K线数据推送过来时被自动调用。
    'data' 参数就是QMT推送给我们的最新数据。
    """
    stock_code = "600519.SH"
    # 从数据中提取茅台的最新收盘价
    latest_close_price = data[stock_code]["close"].iloc[-1]
    print(f"【实时接收】:贵州茅台最新1分钟收盘价为: {latest_close_price}")
 
# 2. 在策略初始化时,启动我们的“信号接收器”(回调函数)
def init(ContextInfo):
    print("策略启动,正在订阅贵州茅台的1分钟行情...")
    # 调用订阅接口,告诉它要订阅哪个股票、什么周期,以及数据来了该找谁(callback)
    ContextInfo.subscribe_quote("600519.SH", period="1m", callback=on_kline_update)
 
def handlebar(ContextInfo):
    # 在这个例子中,主要工作都由回调函数完成了,handlebar可以pass省略
    pass

好的,我们现在直接复制QMT看看结果:(可以看到 3s就将 价格推送给我们 ).

代码讲解:

•       on_kline_update(data):这是subscribe_quote的回调函数,作为订阅信号接收器。QMT会将新数据作为data参数传给它。

•       init(ContextInfo):这是策略的初始化部分,只在策略开始时运行一次。我们在这里完成订阅操作,是实战中最常用的方法

•       ContextInfo.subscribe_quote(...):这就是订阅动作本身。我们告诉它三件事:

  "600519.SH":要时刻盯住的目标标的

  period="1m":要关注的信息类型(1分钟K线等)

  callback=on_kline_update:信息来了之后,交给on_kline_update函数处理。


 subscribe_whole_quote:订阅全推数据,(订阅整个市场或一个股票列表的实时分笔(Tick)数据。全推数据只有分笔周期,每次增量推送数据有变化的品种).  

案例,假设我们需要同时监控3个股票的 实时信息:

# conding = gbk
def call_back(data):
    print(data)
    
def init(C):
    C.stock_list = ["000001.SZ","600519.SH", "510050.SH"]
    C.subID = C.subscribe_whole_quote(C.stock_list,callback=call_back)
def handlebar(C):
    print("============================")
    print("C.subID: ",C.subID)

好的,我们现在直接复制QMT看看结果:


代码讲解:

它与subscribe_quote非常相似,核心区别在于ContextInfo.subscribe_whole_quote:订阅全推数据可以获取到盘口数据

 

 unsubscribe_quote:反订阅全推数据,(订阅行情是需要占用资源的,通常在订阅的时候我们一般会设置订阅号,以便于订阅管理,每个账户的订阅数量是有上限的。如果订阅了不再需要的数据,就应该及时“退订”,把宝贵的资源留给更需要的地方。unsubscribe_quote 就是帮助我们完成订阅号的清理)

# conding = gbk
def call_back(data):
       print(data)
def init(C):
       C.stock_list = ["000001.SZ","600519.SH", "510050.SH"]
       C.subID = C.subscribe_whole_quote(C.stock_list,callback=call_back)
 
def handlebar(C):
       print("============================")
       print("C.subID: ",C.subID)
       if C.subID > 0:
              C.unsubscribe_quote(C.subID) # 取消行情订阅

代码讲解:

•       ContextInfo.sub_id = ContextInfo.subscribe_quote(...):在调用订阅函数时,它会返回一个数字,这就是这次订阅的唯一ID。我们必须用一个变量(如ContextInfo.sub_id)把它存起来。

•       ContextInfo.unsubscribe_quote(ContextInfo.sub_id):当需要取消时,把之前存好的ID作为参数传给这个函数即可。

 

总结

掌握了这三个订阅接口,我们就基本掌握了QMT策略与市场实时互动的钥匙。从现在开始,尝试用它们来构建您自己的事件驱动型策略吧!

关注我后期继续分享QMT,PTrade等 量化软件使用 希望对您有所帮助,也可以手把手教你一起使用🤭



尊重知识,尊重市场 1

著作权归文章作者所有。

最新回复 ( 0 )
发新帖
0
DEPRECATED: addslashes(): Passing null to parameter #1 ($string) of type string is deprecated (/data/user/htdocs/xiunophp/xiunophp.min.php:48)