捷克 发表于 2005-6-1 20:26

Originally posted by makemake at 2005-6-1 17:40


谢谢捷克朋友的解答!
你的每一次回答,都让我感动。
不知你对上述大智慧的有关版块文件的讨论有何新的见解,我盼望着你的指教。
不敢当,你把那几个文件传上来,我可以再试分析一下。

makemake 发表于 2005-6-2 09:13

谢谢!
      现在我传给你的是大智慧版块文件(3个,在大智慧安装目录\ZHDOC\Base下),它们之间的关系我弄不懂,请指教。

金卡绣球jk8.com 发表于 2005-6-2 12:24

呵呵,请大家先帮你看看板块结构;

正忙着转换宝的其它内容;

可以考虑看,那一堆 .cxt .ctf 是不是某个控件的自定义数据;
实在不行,只有硬读,但这样危险性很高的,读还勉强,写的话,实在没把握啊;

zxalex 发表于 2005-6-3 10:24

Originally posted by 捷克 at 2005-5-30 19:41
charbuffer;
         ..........
    fread (buffer,1,6,fp);//
    buffer=0;
   
   cout <<buffer<< endl;
.....
多谢~~~~

zxalex 发表于 2005-6-3 14:56

多谢各位高手的帮忙.
下面的程序可以把股票的名字读出来,但是价格数据好象不大对,请高手帮忙看看.


#include <iostream>
using namespace std;


typedef struct
   {
   char code;
   char unuse;
   char name;
      unsigned long date;
      unsigned long open;
      unsigned long low;
      unsigned long high;
      unsigned long close;
      unsigned long travl;
      unsigned long traca;
      unsigned long unk1;
          unsigned long unk2;
      unsigned long unk3;
   } RECORD;
   RECORD reco;
   int readrec(FILE *);


int main() {
         int   gpnum;
         FILE *fp;
         long lSize;
         charbuffer;




      // char * buffer;

         if((fp = fopen("0601day.DAD","r")) == NULL)
         {
         printf("Error: Cant open 000001.DAY !\n");
         exit(0);
         }
   //readrec(fp);




// header

   int j=6;
   for (int i=1;i<j;i++) {
   fread(&gpnum,4,1,fp);

}


   int k=20;
   for (int i=1;i<=k;i++) {
   readrec(fp);
}





   fclose(fp);



};


int readrec(FILE *fp)
   {
   float fn;


   fread(&reco,sizeof(RECORD),1,fp);
   cout << reco.code ;
   cout <<";";
   cout << reco.name ;
   cout <<";";
   cout << reco.date;
   cout <<";";
   cout << reco.open ;
   cout <<";";
   cout << reco.high ;
   cout <<";";
   cout << endl;



   return 0;
   }

捷克 发表于 2005-6-3 22:24

Originally posted by makemake at 2005-6-2 09:13
谢谢!
      现在我传给你的是大智慧版块文件(3个,在大智慧安装目录\ZHDOC\Base下),它们之间的关系我弄不懂,请指教。

PLANK.CTF放了每个板块板块名称 ,板块股票数,股票所在位置
18个字节一条记录对应一个板块
0-1 板块股票数
2-13,板块名称
14-17 第一支股票所在位置,
例如中小企业版
00000b74h: 20 00 D6 D0 D0 A1 C6 F3 D2 B5 A7 1C 00 00 C6 1C ;.中小企业?..?
00000b84h: 00 00                                           ; ..
32只股票,在C6 1C

PLANK.CXT放了股票和股票所在位置
12个字节一条记录
0-3 股票位置号 FF FF FF FF表示板块最后一个股票
4-9 股票代码
10 -1101 00 无意义
根据C6 1C我们找到了002016 和002017,向前我们找到了002015.....002018
000829是上一个板块的。
好像是对了
000157f8h: FF FF FF FF 30 30 30 38 32 39 01 00 A8 1C 00 00 ;

捷克 发表于 2005-6-3 22:34

试试float

typedef struct
   {
   char code;
   char unuse;
   char name;
      floatdate;
      float   open;
      float   low;
      float   high;
      float   close;
      float   travl;
      float   traca;
      float   unk1;
          float   unk2;
      float   unk3;
   } RECORD;
   RECORD reco;
   int readrec(FILE *);

Originally posted by zxalex at 2005-6-3 14:56
多谢各位高手的帮忙.
下面的程序可以把股票的名字读出来,但是价格数据好象不大对,请高手帮忙看看.


#include <iostream>
using namespace std;


typedef struct
   {
   char code;
   cha ...

makemake 发表于 2005-6-4 10:22

Originally posted by 捷克 at 2005-6-3 22:24


PLANK.CTF放了每个板块板块名称 ,板块股票数,股票所在位置
18个字节一条记录对应一个板块
0-1 板块股票数
2-13,板块名称
14-17 第一支股票所在位置,
例如中小企业版
00000b74h: 20 00 D6 D0 D0 A ...

谢谢捷克的指教!
如果论坛多出几个象你这样无私奉献的高人,那该多好!
祝好人一生平安!

zxalex 发表于 2005-6-7 13:49

关于时间截取

谢谢捷克的指导.
还有一个问题,我现在提取DAD日数据文件没有问题,但是在5分钟数据时,发现提取的日期有问题,能不能解释一下啊,谢谢!

捷克 发表于 2005-6-8 20:14

时间数据传上来,我分析一下试试

Originally posted by zxalex at 2005-6-7 13:49
谢谢捷克的指导.
还有一个问题,我现在提取DAD日数据文件没有问题,但是在5分钟数据时,发现提取的日期有问题,能不能解释一下啊,谢谢!

makemake 发表于 2005-6-8 21:16

分析家分笔成交数据存储格式:
上海当天分笔成交数据存储文件为:\superstk\data\sh\report.dat
深圳当天分笔成交数据存储文件为:\superstk\data\sz\report.dat
20020801.prp,20020802.prp,.... 20020823.prp 等文件是历史分笔成交数据文件,
上海历史分笔成交数据存储文件目录为:\superstk\data\sh\
深圳历史分笔成交数据存储文件目录为:\superstk\data\sz\
起止地址数据内容   数据含义数据类型
00 - 03F4 9B 13 FC 日线文件标志 Integer
04 - 0710 02 00 00 保留 Integer
08 - 0B00 91 40 3D 保留 Integer
0C - 0FD2 02 00 00 证券总数 Integer
10 - 1351 05 00 00 需添加之起始块号 Integer
14 - 1750 05 00 00 当前最后空块号 Integer

00000018 00040017 商品索引( 0x40000, 256k,64 pages)
                  每索引长 0x40共可容纳 0x1000 4096个索引
18 - 2133 39 39 30 证券代码 Char
22 - 2530 31 00 FF 日线记录数 Integer
26 - 57FF FF BA 03...FF FF 记录块号 Word
......

00040018 00040FFF 不明何用!

   地   址    数据内容    数据含义       数据类型      
41000 - 41003 98 00 66 3D 日期         Integer   
41004 - 41007 00 00 18 41 最新价         Single      
41008 - 4100B 00 80 B4 43 累计成交量   Single   
4100C - 4100F 80 46 A7 48 累计成交金额   Single   
41010 - 41011 EA AA       委买量1      Integer
41012 - 41013 2A 3F       委买量2      Integer
41014 - 41015 24 57       委买量3      Integer   
41015 - 41017 23 01       委卖量1      Integer      
41018 - 41019 8E 5B       委卖量2      Integer
4101A - 3101B 80 40       委卖量3      Integer
4101C         16       委买价1的小数部分 Byte
4101D         9A       委买价2的小数部分 Byte
4101E         80       委买价3的小数部分 Byte
4101F         40       委卖价1的小数部分 Byte
41020         30       委卖价2的小数部分 Byte
41021         57       委卖价3的小数部分 Byte
41022 - 41023 00 80    买入,卖出标识   Byte
1.)从18h开始至40017h每64byte为一条股票数据分配记录,含义如上表18h - 57h所示;
2.)从41000h开始每4068byte为一股票数据存储块,每个股票数据存储块共存储113条记录,每一条记录的长度为36 byte:
    具体含义如上表41000h - 41023h所示;
3.) 日期字段意义均为:实际日期 = CDate('1970-01-01')+(日期字段 div 86400);即“日期字段”除以86400所得数为
    实际日期距1970年01月01日的天数。
4.)委买,委卖价由最新价加委买,委卖价小数部分得到,如:
   委买价1的小数部分=16h(<80h), 则委买价1=最新价+32/100;(16h=32d)
   委买价2的小数部分=9Ah(>80h), 则委买价2=最新价-(256-154)/100;(9Ah=154d)
5.)单笔成交量用本笔累计数减上笔累计数得到,
   若买入,卖出标识为80h,则单笔成交量是买入量;
   若买入,卖出标识为C0h,则单笔成交量是卖出量。

makemake 发表于 2005-6-8 21:22

在111楼分析家分笔成交数据存储格式中, 委买价1, 委买价2, 委买价3及 委卖价1, 委卖价2, 委卖价3是怎么算出来的?,分别是多少呢?
   读了上述说明,我不是很明白,请捷克指教。
   谢谢!

[ Last edited by makemake on 2005-6-8 at 21:23 ]

梦仙阁主 发表于 2005-6-8 23:53

zxalex 发表于 2005-6-9 10:56

Originally posted by 捷克 at 2005-6-8 20:14


谢了,我在下一楼把程序放上来.老大你运行一下看看就知道了.

zxalex 发表于 2005-6-9 11:00

程序:


#include <iostream>
#include <time.h>
using namespace std;


typedef struct
   {

      float date;
      time_t date2;
      float open;
      float high;
      float low;
      float close;
      float travl;
      float traca;
      float unk1;
          float unk2;

   } RECORD;
   RECORD reco;
   int readrec(FILE *);

   typedef struct
   {
          char code;
                   char unuse;
   char name;

} HEADER;

HEADER head;
int readhead(FILE *);


int main() {
         int   gpnum;
         FILE *fp;
         long lSize;
         charbuffer;




      // char * buffer;

         if((fp = fopen("min0603.DAD","r")) == NULL)
         {
         printf("Error: Cant open 000001.DAY !\n");
         exit(0);
         }
   //readrec(fp);




// header

   int j=6;
   for (int i=1;i<j;i++) {
   fread(&gpnum,4,1,fp);

}

   readhead(fp);
   int k=5;
   for (int i=1;i<=k;i++) {
   readrec(fp);
}





   fclose(fp);



};


int readrec(FILE *fp)
   {
   float fn;


   fread(&reco,sizeof(RECORD),1,fp);

   cout << ctime(&reco.date2);
   cout <<";";
   cout << reco.open ;
   cout <<";";
   cout << reco.high ;
   cout <<";";
   cout << reco.low;
   cout <<";";
   cout << reco.close;
   cout <<";";
   cout << reco.travl;
   cout <<";";
   cout << reco.traca;
   cout <<";";
   cout << endl;



   return 0;
   }

   int readhead(FILE *fp)
      {
      float fn;


      fread(&head,sizeof(HEADER),1,fp);
      cout << head.code ;
      cout <<";";
      cout << head.name ;
      cout <<";";
      cout << endl;



      return 0;
   }

数据文件:MIN0603.DAD

[ Last edited by zxalex on 2005-6-10 at 14:14 ]

发表于 2005-6-10 18:02

捷克 发表于 2005-6-10 18:37

4.)委买,委卖价由最新价加委买,委卖价小数部分得到,如:
   委买价1的小数部分=16h(<80h), 则委买价1=最新价+32/100;(16h=32d)
   委买价2的小数部分=9Ah(>80h), 则委买价2=最新价-(256-154)/100;(9Ah=154d)
上面有笔误应为

4.)委买,委卖价由最新价加委买,委卖价小数部分得到,如:
   委买价1的小数部分=16h(<80h), 则委买价1=最新价+32/100;(16h=22d)
   委买价2的小数部分=9Ah(>80h), 则委买价2=最新价-(256-154)/100;(9Ah=154d)
h 表示16进制,d表示10进制。
16h = (1*16+6)d=22d
其他应该好理解
我想可能这种表示法有缺陷,如最新价100.01,委买价 110.01,他最大表示100.01+127/100=101.28.

Originally posted by makemake at 2005-6-8 21:22
在111楼分析家分笔成交数据存储格式中, 委买价1, 委买价2, 委买价3及 委卖价1, 委卖价2, 委卖价3是怎么算出来的?,分别是多少呢?
   读了上述说明,我不是很明白,请捷克指教。
   谢谢!

捷克 发表于 2005-6-10 18:48

#include <iostream>
#include <time.h>
using namespace std;


typedef struct
{

    float date;
    time_t date2;
    float open;
    float high;
    float low;
    float close;
    float travl;
    float traca;
    float unk1;
    float unk2;

} RECORD;
RECORD reco;
int readrec(FILE *);

typedef struct
{
    char code;
    char unuse;
    char name;

} HEADER;

HEADER head;
int readhead(FILE *);


int main() {
    int   gpnum;
    FILE *fp;
    long lSize;
    charbuffer;




    // char * buffer;

    if((fp = fopen("min0603.DAD","r")) == NULL)
    {
      printf("Error: Cant open 000001.DAY !\n");
      exit(0);
    }
    //readrec(fp);




    // header

    int j=6;
    for (int i=1;i<j;i++) {
      fread(&gpnum,4,1,fp);

    }

    readhead(fp);
    int k=5;
    for (int i=1;i<=k;i++) {
      readrec(fp);
    }





    fclose(fp);



};


int readrec(FILE *fp)
{
    float fn;
    int*tp ;
    struct tm * tmp;


    fread(&reco,sizeof(RECORD),1,fp);
    tp = (int*)&reco.date2;
    tmp = gmtime(tp);

//cout << ctime(&reco.date2);
    cout << 1900+tmp->tm_year
         << "-" << 1+tmp->tm_mon
         << "-" << tmp->tm_mday;
    cout <<";";
    cout << reco.open ;
    cout <<";";
    cout << reco.high ;
    cout <<";";
    cout << reco.low;
    cout <<";";
    cout << reco.close;
    cout <<";";
    cout << reco.travl;
    cout <<";";
    cout << reco.traca;
    cout <<";";
    cout << endl;



    return 0;
}

int readhead(FILE *fp)
{
    float fn;


    fread(&head,sizeof(HEADER),1,fp);
    cout << head.code ;
    cout <<";";
    cout << head.name ;
    cout <<";";
    cout << endl;



    return 0;
}

Originally posted by zxalex at 2005-6-9 11:00
程序:


#include <iostream>
#include <time.h>
using namespace std;


typedef struct
   {

      float date;
      time_t date2;
      float open;
      float high;
       ...

wms1 发表于 2005-6-10 21:27

不懂,,,支持。。。。。。。。。。。。。。。

zxalex 发表于 2005-6-12 13:49

Originally posted by 捷克 at 2005-6-10 18:48
#include <iostream>
#include <time.h>
using namespace std;


typedef struct
{

    float date;
    time_t date2;
    float open;
    float high;
    float low;
    float cl ...

谢谢捷克,不过你的程序编译不通过.我稍微改了一下,编译通过了,但是时间的输出结果显示还是有问题.麻烦你再帮我看一下好吗,谢谢!

#include <iostream>
#include <time.h>
using namespace std;


typedef struct
{

    float date;
    time_t date2;
    float open;
    float high;
    float low;
    float close;
    float travl;
    float traca;
    float unk1;
    float unk2;

} RECORD;
RECORD reco;
int readrec(FILE *);

typedef struct
{
    char code;
    char unuse;
    char name;

} HEADER;

HEADER head;
int readhead(FILE *);


int main() {
    int   gpnum;
    FILE *fp;
    long lSize;
    charbuffer;




    // char * buffer;

    if((fp = fopen("min0603.DAD","r")) == NULL)
    {
      printf("Error: Cant open 000001.DAY !\n");
      exit(0);
    }
    //readrec(fp);




    // header

    int j=6;
    for (int i=1;i<j;i++) {
      fread(&gpnum,4,1,fp);

    }

    readhead(fp);
    int k=5;
    for (int i=1;i<=k;i++) {
      readrec(fp);
    }





    fclose(fp);



};


int readrec(FILE *fp)
{
    float fn;
    time_t*tp ;
    struct tm * tmp;


    fread(&reco,sizeof(RECORD),1,fp);
    //tp = (time_t*)~reco.date2;
    //tmp = gmtime(&tp);
   tmp=gmtime(&reco.date2);


//cout << ctime(&reco.date2);
    cout << 1900+tmp->tm_year
         << "-" << 1+tmp->tm_mon
         << "-" << tmp->tm_mday;
    cout <<";";
    cout << reco.open ;
    cout <<";";
    cout << reco.high ;
    cout <<";";
    cout << reco.low;
    cout <<";";
    cout << reco.close;
    cout <<";";
    cout << reco.travl;
    cout <<";";
    cout << reco.traca;
    cout <<";";
    cout << endl;



    return 0;
}

int readhead(FILE *fp)
{
    float fn;


    fread(&head,sizeof(HEADER),1,fp);
    cout << head.code ;
    cout <<";";
    cout << head.name ;
    cout <<";";
    cout << endl;



    return 0;
}
页: 1 2 3 4 5 [6] 7 8 9 10 11 12
查看完整版本: 各类数据转换,提取,原码,接口编程交流专贴(暂名)