超简单C++ 获取股票历史数据自动缓存本地二进制加速访问,省心 更新至2021-07-09

本文主要是介绍超简单C++ 获取股票历史数据自动缓存本地二进制加速访问,省心 更新至2021-07-09,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目前全网没有一个专门提供C++访问股票接口并专门提供给仅仅使用历史数据的人的资源

本资源付费获取源码,有需要的联系我本人(首页微信)。

2021-07-09最新版本上传到百度云可下载
2019-08-03

增加当日数据获取:

市盈率、市净率

2019-07-21自动缓存本地

2019-09-01

2019-09-04

2019-09-05

2019-09-08(去掉了map)

支持全部历史数据一次性获取:

收盘价, 最高价, 最低价, 开盘价, 前收盘, 涨跌额, 涨跌幅, 换手率, 成交量, 成交金额, 总市值, 流通市值

下载全部历史数据缓存本地用时:4374个记录(个股和指数) 24分钟-> 20分钟 560MB磁盘空间

下载单个个股平均用时:0.7秒

加载全部用时:1分钟->24秒

更新全部并加载:3分钟

加载全部占用内存:1.9GB->1.8GB->1.3GB

加载2019年以后的数据:120MB->90MB

加载2019年以后的数据:4.5秒

2019-09-22

支持全部历史数据一次性获取:收盘价, 最高价, 最低价, 开盘价, 前收盘, 成交量

下载单个个股平均用时:0.4秒

 更新数据的核心逻辑:

std::shared_ptr<CStock> CStockMgr::GetUserStock(const string & id)
{auto itr = m_allUserStock.find(id);if (itr == m_allUserStock.end())//不存在则惰性加载{auto pStock = LoadOneStockFromLocalAndWeb(id, m_needUpdate);//加载优先使用本地缓存二进制文件auto file = Path::GetStockHistoryDataDir() + id;if (!Path::Exist(file))//还没缓存过则就地缓存{SaveOneUserStockToLocalDir(pStock);}}return m_allUserStock.at(id);
}

int main()
{//UpdateStockNameList();auto pStock = CStockMgr::Instance().GetUserStock("sz000858");//"五粮液"PrintStock(pStock.get(), "sz000858");pStock = CStockMgr::Instance().GetUserStock("sh000001");//"上证指数"PrintStock(pStock.get(), "sh000001");pStock = CStockMgr::Instance().GetUserStock("sz399001");//"深圳成指"PrintStock(pStock.get(), "sz399001");return 0;
}

使用二进制读写本地数据


void CStockItem::writeTo(ostream & out) const
{auto& item = *this;out.write(reinterpret_cast<const char*>(&item.m_date), sizeof(item.m_date));//日期out.write(reinterpret_cast<const char*>(&item.m_close), sizeof(item.m_close));//收盘价out.write(reinterpret_cast<const char*>(&item.m_high), sizeof(item.m_high));//最高价out.write(reinterpret_cast<const char*>(&item.m_low), sizeof(item.m_low));//最低价out.write(reinterpret_cast<const char*>(&item.m_open), sizeof(item.m_open));//开盘价out.write(reinterpret_cast<const char*>(&item.m_qianfuquan_close), sizeof(item.m_qianfuquan_close));//前复权out.write(reinterpret_cast<const char*>(&item.m_last_close), sizeof(item.m_last_close));//前收盘out.write(reinterpret_cast<const char*>(&item.m_chg), sizeof(item.m_chg));//涨跌额out.write(reinterpret_cast<const char*>(&item.m_percent_chg), sizeof(item.m_percent_chg));//涨跌幅out.write(reinterpret_cast<const char*>(&item.m_turnover), sizeof(item.m_turnover));//换手率out.write(reinterpret_cast<const char*>(&item.m_volume), sizeof(item.m_volume));//成交量out.write(reinterpret_cast<const char*>(&item.m_amount), sizeof(item.m_amount));//成交额out.write(reinterpret_cast<const char*>(&item.m_tcap), sizeof(item.m_tcap));//总市值out.write(reinterpret_cast<const char*>(&item.m_mcap), sizeof(item.m_mcap));//流通市值
}istream& operator >> (istream& in, CStockItem& item)
{in.read(reinterpret_cast<char*>(&item.m_date), sizeof(item.m_date));//日期in.read(reinterpret_cast<char*>(&item.m_close), sizeof(item.m_close));//收盘价in.read(reinterpret_cast<char*>(&item.m_high), sizeof(item.m_high));//最高价in.read(reinterpret_cast<char*>(&item.m_low), sizeof(item.m_low));//最低价in.read(reinterpret_cast<char*>(&item.m_open), sizeof(item.m_open));//开盘价in.read(reinterpret_cast<char*>(&item.m_qianfuquan_close), sizeof(item.m_qianfuquan_close));//前复权in.read(reinterpret_cast<char*>(&item.m_last_close), sizeof(item.m_last_close));//前收盘in.read(reinterpret_cast<char*>(&item.m_chg), sizeof(item.m_chg));//涨跌额in.read(reinterpret_cast<char*>(&item.m_percent_chg), sizeof(item.m_percent_chg));//涨跌幅in.read(reinterpret_cast<char*>(&item.m_turnover), sizeof(item.m_turnover));//换手率in.read(reinterpret_cast<char*>(&item.m_volume), sizeof(item.m_volume));//成交量in.read(reinterpret_cast<char*>(&item.m_amount), sizeof(item.m_amount));//成交额in.read(reinterpret_cast<char*>(&item.m_tcap), sizeof(item.m_tcap));//总市值in.read(reinterpret_cast<char*>(&item.m_mcap), sizeof(item.m_mcap));//流通市值return in;
}

本地二进制缓存(一个文件才230K左右,900个文件才200MB,所有上市公司连同指数的全部数据也才800MB):

本地缓存数据:

股票名称列表输出到文件

这篇关于超简单C++ 获取股票历史数据自动缓存本地二进制加速访问,省心 更新至2021-07-09的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/ClamReason/article/details/89292424
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/423081

相关文章

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤