超簡單C++ 獲取股票歷史數據自動緩存本地二進制加速訪問,省心 更新至2019-09-22

目前全網沒有一個專門提供C++訪問股票接口並專門提供給僅僅使用歷史數據的人的資源

本資源付費獲取源碼,有需要的聯繫我本人。百度雲下載

 

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):

本地緩存數據:

股票名稱列表輸出到文件

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章