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