【miniQMT实盘量化4】获取实时行情数据

前言

上篇,我们介绍了如何获取历史数据,有了历史数据,我们可以进行分析和回测。但,下一步,我们更需要的是实时数据,只有能有效的监控实时行情数据,才能让我们变成市场上的“千里眼,顺风耳”。

接口汇总

与获取实时数据相关的接口,有以下几个

xtdata.get_full_tick()
xtdata.subscribe_whole_quote()
xtdata.subscribe_quote()
xtdata.unsubscribe_quote()

后文逐一展开说明。

实时行情 vs 历史行情

我们先探讨一下什么是实时行情,其实,实时,无非就是很近的历史,我们希望这个时间越近越好。获取到的最新行情的时间越接近他产生的时间,那就更多的获得了优先决策权。虽然几秒或者几百毫秒,对于人类而言微乎其微,但对于计算机来讲,可以做很多事。

订阅 vs 获取

熟悉编程设计模式的朋友,对“订阅”这个概念,不会陌生,但也有可能一部分非专业的朋友不太了解,我这里通俗易懂解释一下。

普通获取数据的接口,调用成功一次,会返回一次数据结果。那想想我们获取实时数据的场景,我们需要持续、不停的获取某一数据的最新值,那我就要持续轮询调用这个接口才能完成,对吧,比如,一秒调用一次。但这里存在一个问题,你也不知道最新数据是何时来的,假如若是最新数据0.5秒之后就已经更新了呢,那我们就浪费了0.5秒的机会,对吧。

而对于订阅模式的接口来讲,一旦这个接口被订阅成功,在之后的时间里,它会主动的给你推送数据最新数据,一般这种接口都会有一个callback函数作为参数,每次最新数据来的时候,该callback函数就会被调用一次(后面我们会结合具体例子演示)。这样,我们就降低了获取数据的延时性,数据会第一时间返回到我们的程序中。

那对应于本文要阐述的接口,get_full_tick就是普通获取接口,而subscribe_quotesubscribe_whole_quote就是订阅接口。另外,对于订阅接口,往往需要一个取消订阅的接口来解除订阅,不然数据将会一直推送,unsubscribe_quote的作用就是这个。

get_full_tick

这是全推数据的主动获取接口,所谓全推数据,就是当前时间最新的市场横截面数据。

这里没什么复杂的,只有一个参数,就是传入代码的数组,返回值是一个以股票代码为key的字典,对应的值就是该股票最新的tick数据。如果是非交易时间,这里返回了上一个交易日最后一个tick数据。

注意,此接口是不能传period参数,返回的数据默认是最新的tick周期数据。

from xtquant import xtdata

res = xtdata.get_full_tick(['600519.SH'])

res['600519.SH']

在这里插入图片描述

subscribe_whole_quote(推荐)

这是订阅全推数据的接口,与get_full_tick功能类似,只是模式不同,此接口采用订阅模式。

from xtquant import xtdata

def on_data (datas):
    print(datas)

seq = xtdata.subscribe_whole_quote(code_list=['600519.SH'], callback=on_data)

xtdata.run()

这里的xtdata.run()并不一定是必须的,这行代码只是为了阻塞该段代码一直处于运行状态,由于我们是订阅模式的接口,只要不取消订阅,就会一直返回数据。所以让程序处于一直运行状态比较好。

在这里插入图片描述

可以看到,on_data方法会被一直调用,每次都返回最新的tick。此接口只有两个参数code_listcallback,callback传入一个方法,具体的返回数据在这个方法中处理,落实到我们的例子中,就是on_data方法。

下面,我们再测试一下订阅的返回时间和速度,为代码解析返回数据的时间戳,并与当前系统时间做对比

from xtquant import xtdata
from datetime import datetime
import time

def on_data (datas):
    tick_time = datas['600519.SH']['time']
    timestamp_seconds = tick_time / 1000
    readable_time = datetime.fromtimestamp(timestamp_seconds).strftime('%Y-%m-%d %H:%M:%S.%f')
    # 获取当前时间戳(秒级)
    current_timestamp_seconds = time.time()
    current_readable_time = datetime.fromtimestamp(current_timestamp_seconds).strftime('%Y-%m-%d %H:%M:%S.%f')
    print(readable_time)
    print(current_readable_time)
    print(datas)

seq = xtdata.subscribe_whole_quote(code_list=['600519.SH'], callback=on_data)

xtdata.run()

根据下面的结果,我们可以得知:

1、该数据每三秒返回一次,也就是每三秒产生一个tick,这就是目前实时数据的最小时间单位。
2、返回的时间戳时间解析后,是大于系统时间的,大致是大个0.5~0.6秒之间,我认为这个时间戳应该是做了提前处理,以保证获取到数据的时间与系统时间接近。
在这里插入图片描述

subscribe_quote

这是,单股订阅接口。最大的特点是,每次订阅只能传入一只股票代码,且该接口具有period参数,可以不止获取tick级别的数据。

from xtquant import xtdata
from datetime import datetime
import time

def on_data (datas):
    tick_time = datas['600519.SH'][0]['time']
    timestamp_seconds = tick_time / 1000
    readable_time = datetime.fromtimestamp(timestamp_seconds).strftime('%Y-%m-%d %H:%M:%S.%f')
    # 获取当前时间戳(秒级)
    current_timestamp_seconds = time.time()
    current_readable_time = datetime.fromtimestamp(current_timestamp_seconds).strftime('%Y-%m-%d %H:%M:%S.%f')
    print(readable_time)
    print(current_readable_time)
    print(datas)

seq = xtdata.subscribe_quote(stock_code='600519.SH', period='tick', callback=on_data)

xtdata.run()

可以看到,返回结果与subscribe_whole_quote区别不大,只是值多了一层数组。

在这里插入图片描述
这个接口可以将peroid设为1m,1h,1d等,但其订阅频率依旧是三秒一次,比如,当订阅1m也就是分钟线时,会每三秒返回当前分钟线的最新值,也就是分钟线的收盘价会不停变化。

另外,根据迅投官方的声明,这个单股订阅的接口不宜订阅过多,性能上也不如全推订阅。

在这里插入图片描述
所以,个人建议订阅实时数据时,最好还是使用全推订阅接口。如果想监听分钟线、小时线、或日线这种频率较低的数据,完全可以用轮询获取最新历史数据的方法,来代替。

unsubscribe_quote

这是取消订阅的接口,其实也是相当重要,订阅模式的接口,不同于普通接口,一旦订阅成功,就会有一个进程一直在监听并返回数据,当不在需要订阅时,需要显示的调用取消订阅接口,才能停止此次订阅。若大量调用订阅且不及时取消时,可能会造成大量的CPU和内存占用。

from xtquant import xtdata
import time

def on_data (datas):
    print(datas)

seq = xtdata.subscribe_whole_quote(code_list=['600519.SH'], callback=on_data)

time.sleep(10)

xtdata.unsubscribe_quote(seq)

print('取消订阅成功')

在本例中,我们首先调用全推订阅接口,该接口会返回一个订阅号seq,然后我们阻塞程序10秒钟,10秒钟后取消订阅。可以看到下图,程序运行10秒后终止,且订阅也被取消。

在这里插入图片描述

在实际使用中,可以根据自己的需要,在适合的时机调用unsubscribe_quote,比如程序终止前,或者有GUI的应用,也可以设计一个按钮负责取消订阅。

交易时间段内使用

需要注意的是,本文提到的两个订阅接口,在非交易时间都是无法触发callback的,也就是说,在使用或者测试这两个接口时,要选在开盘时间内,盘后在测试实时数据接口,是比较困难的。

总结

关于如何获取实时数据的内容,就讨论到这里。实时数据,是做量化实盘交易的数据基础,一个稳定,好用的实时数据源,可以更好的帮我们实现实盘量化策略。

miniQMT在这个功能上提供了实时订阅的模式,功能相对来说比较完善。

miniQMT具体开通方法及要求,可以参看《QMT开通规则分享》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/169221.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计 基于SpringBoot的企业内部网络管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

Android设计模式--责任链模式

无善无恶心之体,有善有恶意之动。知善知恶是良知,为善去恶是格物。 一,定义 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直…

探索标准数字隔离ACML-7400-500E:主要特性与应用

ACML-7400-500E标准数字隔离是现代电子系统中的重要组成部分的一员,提供安全可靠的数字信号分离方法。本文深入探讨了该隔离器的核心特性,讨论了其双电源电压兼容性、宽工作温度范围、高速数据功能以及各种安全认证。 双电源电压兼容性 标准数字隔离器…

Motion Plan之搜素算法笔记

背景: 16-18年做过一阵子无人驾驶,那时候痴迷于移动规划;然而当时可学习的资料非常少,网上的论文也不算太多。基本就是Darpa的几十篇无人越野几次比赛的文章,基本没有成系统的文章和代码讲解实现。所以对移动规划的认…

代码随想录算法训练营第四十九天| 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

文档讲解:代码随想录 视频讲解:代码随想录B站账号 状态:看了视频题解和文章解析后做出来了 123.买卖股票的最佳时机III class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) 0:return 0dp [[0] * 5 for _ in…

Android Studio常见问题

Run一直是上次的apk 内存占用太大,导致闪退

python -opencv 边缘检测

python -opencv 边缘检测 边缘检测步骤: 第一步:读取图像为灰度图 第二步:进行二值化处理 第三步:使用cv2.findContours对二值化图像提取轮廓 第三步:将轮廓绘制到图中 代码如下: from ctypes.wintypes import SIZ…

【Java】抽象类和接口

文章目录 一、抽象类1.抽象类的概念2.抽象类的语法3.抽象类的特性4.抽象类的作用 二、接口1.接口的概念2.语法规则3.接口的使用4.接口的特性5.实现多个接口6.接口间的继承7.接口的使用实例8.Clonable 接口和深拷贝9.抽象类和接口的区别 三、Object类1.获取对象信息2.对象的比较…

《视觉SLAM十四讲》-- 建图

11 建图 11.1 概述 (1)地图的几类用处: 定位:导航:机器人在地图中进行路径规划;避障重建交互:人与地图之间的互动 (2)几类地图 稀疏地图稠密地图语义地图 11.2 单目…

【Spring boot】RedisTemplate中String、Hash、List设置过期时间

文章目录 前言Redis中String设置时间的方法Redis中Hash和List设置时间的方法Redis中Hash的put、putAll、putIfAbsent区别 前言 时间类型:TimeUnit import java.util.concurrent.TimeUnit;TimeUnit.SECONDS:秒 TimeUnit.MINUTES:分 TimeUnit.HOURS&…

基于Vue+SpringBoot的医院门诊预约挂号系统 开源项目

项目编号: S 033 ,文末获取源码。 \color{red}{项目编号:S033,文末获取源码。} 项目编号:S033,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…

设计模式-责任链-笔记

动机(Motivation) 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有个接受者,如果显示指定,将必不可少地带来请求者与接受者的紧耦合。 如何使请求的发送者不需要指定具体的接受…

【JavaEE初阶】 CSS相关属性,元素显示模式,盒模型,弹性布局,Chrome 调试工具||相关讲解

文章目录 🎋字体属性🚩设置字体🚩字体大小🚩字体粗细🚩文字样式 🎍文本属性🚩文本颜色🎈认识 RGB🎈设置文本颜色 🚩文本对齐🚩文本装饰&#x1f6…

buildadmin+tp8表格操作(9)预设的表格渲染

buildadmin中,为我们预设了很多 单元格的渲染方式,我们在使用的时候,只需要在定义中写好预设的名称就可以了 当我们使用的时候,我们只需要添加相应的名称就可以了 以下就是相应的效果 这些效果其实我们也有其它的方法来实现&a…

亚马逊第二个大语言模型 Olympus 即将上线

据外媒爆料,亚马逊正在训练他的第二个大语言模型——Olympus,很有可能在今年12月份上线。亚马逊计划将Olympus接入在线零售商店、Echo等设备上的Alexa语音助手,并为AWS平台提供新的功能。据说这个大语言模型规模达到2万亿(2000B&a…

【C/PTA】函数专项练习(二)

本文结合PTA专项练习带领读者掌握函数,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。 目录 6-1 符号函数6-2 求排列数6-3 求一个大于10的n位整数w的后n-1位的数,并作为函数值返回。6-4 其右上三角(含主对角线…

Windows SDK

Windows SDK (10.0.22621) for Windows 11,版本 22H2 (2023 年 10 月更新) 提供了用于生成 Windows 应用程序的最新标头、库、元数据和工具。 使用此 SDK 为Windows 11版本 22H2 和早期 Windows 版本生成通用 Windows 平台 (UWP) 和 Win32 应用程序。 Windows 应用…

I.MX6ULL开发笔记(一)——环境搭建、镜像烧录、网络连接

本系列为使用野火IMX6ULL开发的学习笔记,使用的开发板为如下: 具有的硬件资源有如下: 文章目录 一、环境搭建Win11安装WSL安装串口驱动安装串口工具安装Ubuntu与windows文件互传 二、镜像烧录修改串口终端登录前信息 三、fire-config工具配…

44、echarts图形自动轮播tooltip提示,并显示高亮

自动轮播方法 参数myChart代表echarts的实例名称, options指定图表的配置项和数据, num类目数量(原因:循环时达到最大值后,使其从头开始循环), time轮播间隔时长 //自动轮播显示高亮--tooltip提示 export function autoHover(myChart, option, num, ti…

Linux操作系统使用及C高级编程-D6-D8Linux shell脚本

利用shell命令写的脚本文件,后缀是.sh shell脚本是一个解释型语言,不需要编译,可直接执行 书写:vi test.sh #!/bin/bash:说明使用的是/bin目录下的bash 说明完后即可编写脚本文件 bash test.sh:运行文…