Metastock data format /* The orignal 255 record format */ typedef unsigned char u_char; typedef unsigned short u_short; /* * MASTER file description * floats are in Microsoft Basic format * strings are padded with spaces, not null terminated */ struct rec_1 { u_short num_files; /* number of files master contains */ u_short file_num; /* next file number to use (highest F# used) */ char zeroes[49]; }; struct rec_2to255 { /* description of data files */ u_char file_num; /* file #, i.e., F# */ char file_type[2]; /* CT file type = 0'e' (5 or 7 flds) */ u_char rec_len; /* record length in bytes (4 x num_fields) */ u_char num_fields; /* number of 4-byte fields in each record */ char reserved1[2]; /* in the data file */ char issue_name[16]; /* stock name */ char reserved2; char CT_v2_8_flag; /* if CT ver. 2.8, 'Y'; o.w., anything else */ float first_date; /* yymmdd */ float last_date; char time_frame; /* data format: 'I'(IDA)/'W'/'Q'/'D'/'M'/'Y' */ u_short ida_time; /* intraday (IDA) time base */ char symbol[14]; /* stock symbol */ char reserved3; /* MetaStock reserved2: must be a space */ char flag; /* ' ' or '*' for autorun */ char reserved4; }; /* * EMASTER data structure * floats are in IEEE format * strings are padded with nulls */ struct emashdr { u_short num_files; /* number of files in emaster */ u_short file_num; /* last (highest) file number */ char stuff[188]; }; struct emasdat { char asc30[2]; /* "30" */ u_char file_num; /* file number F# */ char fill1[3]; u_char num_fields; /* number of 4-byte data fields */ char fill2[2]; char flag; /* ' ' or '*' for autorun */ char fill3; char symbol[14]; /* stock symbol */ char fill4[7]; char issue_name[16]; /* stock name */ char fill5[12]; char time_frame; /* data format: 'D'/'W'/'M'/ etc. */ char fill6[3]; float first_date; /* yymmdd */ char fill7[4]; float last_date; char fill8[116]; }; /* seven-field data file description */ struct dathdr7 { u_short max_recs; /* 0 ==> unlimited size */ u_short last_rec; /* dathdr7 = 1; ctdata7 starts with 2 */ char zeroes[24]; }; struct ctdata7 { float date; float open; float high; float low; float close; float volume; float op_int; }; /* five-field data file description */ struct dathdr5 { u_short max_recs; u_short last_rec; char zeroes[16]; }; struct ctdata5 { float date; float high; float low; float close; float volume; }; /* IEEE floating point format to Microsoft Basic floating point format */ int fieee2msbin(float *src, float *dst) { union { float a; u_long b; } c; u_short man; u_short exp; c.a = *src; if (c.b) { /* not zero */ man = c.b >> 16; exp = ((man << 1) & 0xff00) + 0x0200; if (exp & 0x8000 != (man << 1) & 0x8000) return 1; /* exponent overflow */ man = man & 0x7f | (man >> 8) & 0x80; /* move sign */ man |= exp; c.b = c.b & 0xffff | (long)man << 16; } *dst = c.a; return 0; } /* Microsoft Basic floating point format to IEEE floating point format */ int fmsbin2ieee(float *src, float *dst) { union { float a; u_long b; } c; u_short man; u_short exp; c.a = *src; if (c.b) { /* not zero */ man = c.b >> 16; exp = (man & 0xff00) - 0x0200; if (exp & 0x8000 != man & 0x8000) return 1; /* exponent overflow */ man = man & 0x7f | (man << 8) & 0x8000; /* move sign */ man |= exp >> 1; c.b = c.b & 0xffff | (long)man << 16; } *dst = c.a; return 0; }