最近我在研究通达信日线历史数据.day文件的格式,网上查了很久也没看到,好像都是比较老版本的通达信数据格式。网上看到的是32字节代表一天数据,头4个字节代表日期整形等等,但是解析出来还是不对。请研究过或了解的各位大牛多多指教,谢谢!
http://www.cnblogs.com/zeroone/archive/2013/07/10/3181251.html
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#define DEBUG
#define sh_ETF_1 510010 //上证ETF基金代码
#define sh_ETF_2 517800
#define sh_zb_1 600000 //上证主板股票代码
#define sh_zb_2 605600
#define sh_kc_1 688001 //上证科创板股票代码
#define sh_kc_2 688999
#define sz_ETF_1 159001 //深圳ETF基金代码
#define sz_ETF_2 159999
#define sz_zb_1 1 //深圳主板股票代码
#define sz_zb_2 3817
#define sz_cy_1 300001 //深圳创业板股票代码
#define sz_cy_2 301093
char input_sh[] = "C:\MyProgram\证券\dg\vipdoc\sh\lday\sh600000.day"; //上证日线目录(使用时修改这四行)
char input_sz[] = "C:\MyProgram\证券\dg\vipdoc\sz\lday\sz000000.day"; //深证日线目录
char export_sh[] = "D:\通达信日线数据\sh\sh600000.csv"; //上证输出文件目录
char export_sz[] = "D:\通达信日线数据\sz\sz000000.csv"; //深证输出文件目录
typedef struct //定义数据结构
{
int32_t date; //4字节 日期
int32_t open;
int32_t high;
int32_t low;
int32_t close;
float amount; //成交额
int32_t vol; //成交量(股)
int32_t reservation;//预留字段
} StockData;
StockData stockData;
char *built_path(char *afetr_path, const char *before_path, int stock_code); //合成路径函数
int open_file(const char *day_file, const char *csv_file, float ratio); //打开文件函数
int convert_data(FILE *fp_in, FILE *fp_out, float ratio); //将二进制文件转写成文本文件
int main(int argc, char *argv[])
{
#ifndef DEBUG
puts("提示:通达信日线数据转换格式已经开始,\n\n\n"
"..........请等待半分钟..........");
#endif
char sh_in[strlen(input_sh) + 1]; //重新合成后的上证日线数据目录文件名
char sz_in[strlen(input_sz) + 1]; //重新合成后的深证日线数据目录文件名
char sh_out[strlen(export_sh) + 1]; //合成上证输出文件路径
char sz_out[strlen(export_sz) + 1]; //合成深证输出文件路径
FILE *fp_in, *fp_out;
float ratio;
int i;
for(i = sh_ETF_1; i <= sh_ETF_2; ++i) //下面批量转换上证ETF基金日线数据并输出
{
ratio = 0.001;
built_path(sh_in, input_sh, i); //合成转换前文件路径
built_path(sh_out, export_sh, i); //合成转换后文件路径
open_file(sh_in, sh_out, ratio); //打开文件,转换数据
}
for(i = sh_zb_1; i <= sh_zb_2; ++i) //下面批量转换上证主板日线数据并输出
{
ratio = 0.01;
built_path(sh_in, input_sh, i); //合成转换前文件路径
built_path(sh_out, export_sh, i); //合成转换后文件路径
open_file(sh_in, sh_out, ratio); //打开文件,转换数据
}
for(i = sh_kc_1; i <= sh_kc_2; ++i) //下面批量转换上证科创板日线数据并输出
{
ratio = 0.01;
built_path(sh_in, input_sh, i); //合成转换前文件路径
built_path(sh_out, export_sh, i); //合成转换后文件路径
open_file(sh_in, sh_out, ratio); //打开文件,转换数据
}
for(i = sz_ETF_1; i <= sz_ETF_2; ++i) //下面批量转换深证ETF日线数据并输出
{
ratio = 0.001;
built_path(sz_in, input_sz, i); //合成转换前文件路径
built_path(sz_out, export_sz, i); //合成转换后文件路径
open_file(sz_in, sz_out, ratio); //打开文件,转换数据
}
for(i = sz_zb_1; i <= sz_zb_2; ++i) //下面批量转换深证主板日线数据并输出
{
ratio = 0.01;
built_path(sz_in, input_sz, i); //合成转换前文件路径
built_path(sz_out, export_sz, i); //合成转换后文件路径
open_file(sz_in, sz_out, ratio); //打开文件,转换数据
}
for(i = sz_cy_1; i <= sz_cy_2; ++i) //下面批量转换深证创业板日线数据并输出
{
ratio = 0.01;
built_path(sz_in, input_sz, i); //合成转换前文件路径
built_path(sz_out, export_sz, i); //合成转换后文件路径
open_file(sz_in, sz_out, ratio); //打开文件,转换数据
}
puts("\n转换格式完成。");
return(0);
}
char *built_path(char *afetr_path, const char *before_path, int stock_code) //合成路径函数
{
strcpy(afetr_path, before_path);
char temp[8];
itoa(stock_code, temp, 10); //股票代码整数转字符串
int i = strlen(temp);
int j = strlen(afetr_path) - 4 - i;
int k;
for(k = 0; k < i; ++k)
afetr_path[j + k] = temp[k];
return afetr_path;
}
int open_file(const char *day_file, const char *csv_file, float ratio) //打开文件函数
{
FILE *fp_in, *fp_out;
if((fp_in = fopen(day_file, "rb")) == NULL) // 打开待转换的文件
{
#ifdef DEBUG
printf("Error: Can not open %s !\n", day_file);
#endif
return(1);
}else
{
#ifdef DEBUG
printf("源文件 %s 已被打开。\n", day_file);
#endif
}
if((fp_out = fopen(csv_file, "w")) == NULL) //打开(新建)输出文件
{
#ifdef DEBUG
printf("Error: Can not build %s !\n", csv_file);
#endif
fclose(fp_in);
return(1);
}else
{
#ifdef DEBUG
printf("输出文件 %s 已被打开。\n....开始转换数据....\n", csv_file);
#endif
if(0 == convert_data(fp_in, fp_out, ratio)) // 转换文件
{
#ifdef DEBUG
puts("转换完成。");
#endif
}else
{
#ifdef DEBUG
puts("转换失败!");
#endif
}
}
fclose(fp_in);
fclose(fp_out);
return(0);
}
int convert_data(FILE *fp_in, FILE *fp_out, float ratio)
{
char s_temp[8]; //临时变量
char s_data[16];
fprintf(fp_out, "日期,开盘价,最高价,最低价,收盘价,成交量,成交额\n");
fread(&stockData, sizeof(StockData), 1, fp_in);
while(!feof(fp_in))
{
itoa(stockData.date, s_temp, 10); //从整形转换为日期格式字符串
s_data[0] = s_temp[0];
s_data[1] = s_temp[1];
s_data[2] = s_temp[2];
s_data[3] = s_temp[3];
s_data[4] = '-'; //在中间插入“-”
s_data[5] = s_temp[4];
s_data[6] = s_temp[5];
s_data[7] = '-'; //在中间插入“-”
s_data[8] = s_temp[6];
s_data[9] = s_temp[7];
s_data[10] = '\0'; //
fprintf(fp_out, "%s,%.3f,%.3f,%.3f,%.3f,%d,%.2f,\n",
s_data, //日期如2019-10-23形式
(float)stockData.open * ratio, //开盘价
(float)stockData.high * ratio,
(float)stockData.low * ratio,
(float)stockData.close * ratio,
stockData.vol, //成交量(股)
stockData.amount); //成交额
fread(&stockData, sizeof(StockData), 1, fp_in);
}
return 0;
}
//本程序在WIN7 64位,Dev-Cpp.5.11下编辑通过。思路来自本站