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

news2024/11/15 11:55:28

前言

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

接口汇总

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

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开通规则分享》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机照片误删解决方法分享

几个要点 1.检查回收站:一些情况下,我们会在删除文件时将它们移动到回收站中,查看回收站中是否有被删除的照片,这样可以直接恢复文件。 2.使用手机自带的恢复功能:一些手机自带照片恢复功能,可尝试在相册…

Sentinel 热点规则 (ParamFlowRule)

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 SpringbootDubboNacos 集成 Sentinel&…

二分查找——34. 在排序数组中查找元素的第一个和最后一个位置

文章目录 1. 题目2. 算法原理2.1 暴力解法2.2 二分查找左端点查找右端点查找 3. 代码实现4. 二分模板 1. 题目 题目链接:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) 给你一个按照非递减顺序排列的整数数组 nums&#…

【单片机】实验:数码管显示实验

STC89C5xRC #include <STC89C5xRC.H> unsigned char value[22] {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,P,U,T,Y,L,H};//可显示内容 unsigned char led[22] {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73,0x3E,0x31,0x6E,0x38,0x7…

万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志分层

万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志分层 前言 在 Python 的logging模块中&#xff0c;它不仅提供了基础的日志功能&#xff0c;还拥有一系列高级配置选项来满足复杂应用的日志管理需求。 说到logging 模块的高级配置&#xff0c;必须提及日志分…

【代码随想录】刷题笔记Day32

前言 实在不想做项目&#xff0c;周末和npy聊了就业的焦虑&#xff0c;今天多花点时间刷题&#xff01;刷刷刷刷&#xff01; 93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 分割startindex类似上一题&#xff0c;难点在于&#xff1a;判断子串合法性(0~255)、&…

C语言之sizeof 和 strlen 详细介绍

C语言之sizeof 和 strlen 文章目录 C语言之sizeof 和 strlen1. sizeof 和 strlen 的比较1.1 sizeof1.2 strlen1.3 sizeof 和 strlen 的对比 2. 练习2.1.1 一维数组2.1.2 字符数组 1. sizeof 和 strlen 的比较 1.1 sizeof sizeof是C语言中的一个关键字&#xff0c;计算的是变量…

国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐国产高云FPGA相关方案推荐国产高云FPGA基础教程 3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 Video Frame Buffer 图像缓存DDR3 Memory Interface 4、Go…

【前端学java】语法练习-工具类的封装(13)

往期回顾&#xff1a; 【前端学java】JAVA开发的依赖安装与环境配置 &#xff08;0&#xff09;【前端学 java】java的基础语法&#xff08;1&#xff09;【前端学java】JAVA中的packge与import&#xff08;2&#xff09;【前端学java】面向对象编程基础-类的使用 &#xff08…

leetcode:504. 七进制数

一、题目&#xff1a; 链接&#xff1a; 504. 七进制数 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; char* convertToBase7(int num) 二、思路 本题要将十进制数转换为二进制数&#xff0c;只要将十进制num数模7再除7&#xff0c;直到num等于0 每次将模7的结…

国际物流社交销售玩法拆解(三):打造社交电商式分销增长

这一篇&#xff0c;是国际物流行业社交销售玩法最后一篇&#xff0c;也是国际物流企业实现业务经营新增长、打造分销增长体系的新模式。以下&#xff0c;我们一起来拆解这一模式具体内容吧。 #01 国际物流第二曲线&#xff1a;社交电商 经营增长是企业的永恒话题。在客户成本…

【数据结构】树与二叉树(廿一):树和森林的遍历——先根遍历(递归算法PreOrder、非递归算法NPO)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语 5.2 二叉树5.3 树5.3.1 树的存储结构1. 理论基础2. 典型实例3. Father链接结构4. 儿子链表链接结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法5.3.3 树和森林的遍历1. 先根遍历&#xff08;递归&am…

【Web】Flask|Jinja2 SSTI

目录 ①[NISACTF 2022]is secret ②[HNCTF 2022 WEEK2]ez_SSTI ③[GDOUCTF 2023] ④[NCTF 2018]flask真香 ⑤[安洵杯 2020]Normal SSTI ⑥[HNCTF 2022 WEEK3]ssssti ⑦[MoeCTF 2021]地狱通讯 ①[NISACTF 2022]is secret dirsearch扫出/secret 明示get传一个secret ?…

【洛谷 P3743】kotori的设备 题解(二分答案+循环)

kotori的设备 题目背景 kotori 有 n n n 个可同时使用的设备。 题目描述 第 i i i 个设备每秒消耗 a i a_i ai​ 个单位能量。能量的使用是连续的&#xff0c;也就是说能量不是某时刻突然消耗的&#xff0c;而是匀速消耗。也就是说&#xff0c;对于任意实数&#xff0c;…

国家开放大学平时作业训练题

卷代号&#xff1a;1400 机器人技术及应用 参考试题 一、单项选择题&#xff08;每小题3分&#xff0c;共45分&#xff09; 1.在变径轮和变形车轮的设计中&#xff0c;借鉴了&#xff08; &#xff09;的设计&#xff0c;使得车轮可以主动变形进行越障。 A.滑块机构 …

王者荣耀游戏

游戏运行如下&#xff1a; sxt Background package sxt;import java.awt.*; //背景类 public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg Toolkit.getDefaultToolkit().getImage("C:\\Users\\24465\\D…

使用大语言模型 LLM 做文本分析

本文主要分享 传统聚类算法 LLM与嵌入算法 嵌入算法聚类 LLM的其他用法 聚类是一种无监督机器学习技术&#xff0c;旨在根据相似的数据点的特征将其分组在一起。使用聚类成簇&#xff0c;有助于解决各种问题&#xff0c;例如客户细分、异常检测和文本分类等。尽管传统的聚…

Django(九、choices参数的使用、多对多表的三种创建方式、Ajax技术)

文章目录 一、choices参数choices参数的用法choices 参数用法总结 二、MVC与MTV模式1.MVC2.MTV 三、多对多的三种创建方式1.全自动创建2.纯手动创建半自动创建 四、Django与Ajax1.什么是Ajax常见的场景Ajax案例 一、choices参数 在没有用到choices参数之前&#xff0c;我们在D…

【Linux】指令详解(一)

目录 1. 前言2. 与指令相关的知识2.1 文件2.2 路径 3. 常见指令3.1 pwd3.2 ls3.2.1 ls -l3.2.2 ls -la 3.3 mkdir3.4 cd3.5 clear3.6 touch 1. 前言 来学习一些Linux的指令和一些相关的知识。 第一步那肯定是打开自己的xshell。 这里可以修改字体和大小。 可以使用ctrl回车全…

特殊文件(XML文件)

一&#xff0c;XML文件概括 二&#xff0c;案例 <?xml version"1.0" encoding"UTF-8" ?> <!--注释&#xff1a;以上抬头声明必须写在第一不然报错--> <users><user id"1"><uame>张无忌</uame><性别&g…