招商证券股票day数据格式分析
今天没事想把招商证券保存的股票数据提取出来, 后来发现招商证券的软件是采用是通达信做的, 这样直接通过查找通达信的数据格式就搞定了.
主要参考: http://alantop.5166.info/gpdatasoft/gpformat/gpformat.htm#_Toc224993378
通达信日线
每条数据文件占32个字节。每四个字节代表一个变量。如下所示:
1 2 3 4 5 6 7 8 9 10 11 | struct stockDay { uint32_t date; //日期 uint32_t open; //开盘价,单位:分 uint32_t high; //最高价,单位:分 uint32_t low; //最低价,单位:分 uint32_t close; //收盘价,单位:分 float amount; //交易金额,单位:元 uint32_t vol; //成交量,单位:股 int32_t reserv; //保留,有时用来保存上一交易日收盘价 }; |
我分别使用C和Go写了个简单的提取程序.
C代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> struct stockDay { uint32_t date; //日期 uint32_t open; //开盘价,单位:分 uint32_t high; //最高价,单位:分 uint32_t low; //最低价,单位:分 uint32_t close; //收盘价,单位:分 float amount; //交易金额,单位:元 uint32_t vol; //成交量,单位:股 int32_t reserv; //保留,有时用来保存上一交易日收盘价 }; void printDay(struct stockDay *day) { printf("日期: %d, ", day->date); printf("开盘价: %.2f, 最高价: %.2f, 最低价: %.2f, 收盘价: %.2f, ", day->open/100.0, day->high/100.0, day->low/100.0, day->close/100.0); printf("交易金额: %f, 交易量: %d\n", day->amount, day->vol); } int main() { FILE *p; int i = 0; char *file = "./sh600529.day"; struct stockDay *day = malloc(sizeof(struct stockDay)); p = fopen(file, "r"); if (p) { fseek(p, 0, SEEK_END); uint64_t iFileLen = ftell(p)/(sizeof(struct stockDay)); rewind(p); for (i = 0; i < iFileLen; i++) { memset(day, 0, sizeof(struct stockDay)); fread(day, sizeof(struct stockDay), 1, p); printDay(day); } } else { printf("Read File: %s Error!\n", file); } free(day); fclose(p); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | package main import ( "bytes" "encoding/binary" "fmt" "io/ioutil" "unsafe" ) type StockDay struct { date uint32 //日期 open uint32 //开盘价,单位:分 high uint32 //最高价,单位:分 low uint32 //最低价,单位:分 cls uint32 //收盘价,单位:分 amount float32 //交易金额,单位:元 vol uint32 //成交量,单位:股 reserv int32 //保留,有时用来保存上一交易日收盘价 } func main() { contents, _ := ioutil.ReadFile("./sh887001.day") //println(string(contents)); var day StockDay size := int(unsafe.Sizeof(day)) fmt.Printf("sizeof: %d, days: %d\n", size, len(contents)/size) for i := 0; i < len(contents); i += 32 { buf := bytes.NewBuffer(contents[i : i+4]) err := binary.Read(buf, binary.LittleEndian, &day.date) if err != nil { fmt.Println("binary.Read failed: ", err) } buf = bytes.NewBuffer(contents[i+4 : i+8]) err = binary.Read(buf, binary.LittleEndian, &day.open) buf = bytes.NewBuffer(contents[i+8 : i+12]) err = binary.Read(buf, binary.LittleEndian, &day.high) buf = bytes.NewBuffer(contents[i+12 : i+16]) err = binary.Read(buf, binary.LittleEndian, &day.low) buf = bytes.NewBuffer(contents[i+16 : i+20]) err = binary.Read(buf, binary.LittleEndian, &day.cls) buf = bytes.NewBuffer(contents[i+20 : i+24]) err = binary.Read(buf, binary.LittleEndian, &day.amount) buf = bytes.NewBuffer(contents[i+24 : i+28]) err = binary.Read(buf, binary.LittleEndian, &day.vol) fmt.Printf("%v\n", day) } } |
代码也贴在Github上: https://gist.github.com/1578661
ps: 目前5分钟线的月份和日期对不上, 不知道哪位高手搞过?
–EOF–
![[Google]]( http://wifihack.net/blog/wp-content/plugins/easy-adsense-lite/google-light.gif)
Recent Comments