通达信历史数据存储在安装根目录下的vipdoc文件夹下,如D:\new_tdx\vipdoc\sh\lday,为沪市数据,深市数据为:D:\new_tdx\vipdoc\sz\lday,依各自通达信安装目录不同有差异。文件名为:'sh'或'sz'+代码+.day。数据格式如下结构,占32个字节:
struct stockData
{
unsigned int date;
int open;
int high;
int low;
int close;
float amo;
int vol;
int other;
};
八个数据分别为日期、开盘价、最高价、最低价、收盘价、成交金额、成交量、备用;数据是*100后的整数。为连续数据,
打开VS2019,新建一个TdxHistoryData的C++控制台空项目,
新建空项目
双击打开TdxHistoryData.cpp源文件,添加修改如以下:
// TdxHistoryData.cpp : 此文件包含 'main' 函数。程序执行将在此处开始并结束。
#include <Windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
struct stockData
{
unsigned int date;
int open;
int high;
int low;
int close;
float amo;
int vol;
int other;
};
void getHistoryData(string filePath, vector<stockData>& Data_Vec)
{
Data_Vec.clear();
fstream ifs(filePath, ios::in | ios::binary);
if (!ifs.is_open())
{
MessageBox(NULL, TEXT('无法打开文件!'), NULL, MB_ICONINFORMATION | MB_YESNO);
return;
}
stockData stkData;
while (!ifs.eof())
{
ifs.read((char*)&stkData, sizeof(stockData));
Data_Vec.push_back(stkData);
}
if (Data_Vec[Data_Vec.size() - 1].date == Data_Vec[Data_Vec.size() - 2].date)
Data_Vec.pop_back();
ifs.close();
}
int main()
{
string filePath = 'D:\\new_tdx\\vipdoc\\sh\\lday\\sh688981.day';
vector<stockData> vecData;
getHistoryData(filePath, vecData);
cout << '数据路径:' << filePath << endl;
cout << '----------------------------------------------------' << endl;
cout << '日期\t\t开盘价\t收盘价\t最高价\t最低价\t成交量\t金额'<<endl;
for (int i = 0; i < vecData.size(); i++)
{
cout << vecData[i].date << '\t' << (float)vecData[i].open / 100 << '\t' << (float)vecData[i].close / 100 << '\t' << (float)vecData[i].high / 100
<< '\t' << (float)vecData[i].low / 100 << '\t' << vecData[i].vol / 100 << '\t' << vecData[i].amo / 100000000 << '亿' << endl;
}
cout << '共计:' << vecData.size()<<'天数据';
}
整理好以上源文件,菜单调试---开始执行(不调试),直接编译运行,显示结果如下:
读取数据结果
读取数据每次读32字节,连续读完即可。中间有一个疑问,全部读完存入vector后,最后两个数据是重复的,不知什么原因,只好加一个判断,如重复则弹出一个。
注:需要每天下载通达信数据,否则读到数据不完整 或没有。
欢迎沟通交流。
联系客服