超简单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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/423081

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名