日落斜阳
2015-12-23 08:39
采纳率: 0%
浏览 5.3k

求教通达信日线.day文件数据格式

  最近我在研究通达信日线历史数据.day文件的格式,网上查了很久也没看到,好像都是比较老版本的通达信数据格式。网上看到的是32字节代表一天数据,头4个字节代表日期整形等等,但是解析出来还是不对。请研究过或了解的各位大牛多多指教,谢谢!
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • devmiao 2016-02-07 23:31
    打赏 评论
  • =潇十一郎= 2021-10-16 16:07

    #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下编辑通过。思路来自本站

    打赏 评论

相关推荐 更多相似问题