突然间想使用Go从通达信读取A股历史行情信息,其实也蛮简单的。从通达信获取数据难点在于分析数据结构,而读取则各类语言分分钟搞定。
准备工作
- 下载安装通达信,通达信官网
- 下载历史行情数据
下载操作路径:系统->盘后数据下载
下载后数据按股票市场分别存放:
- 上海交易所:
{通达信安装目录}\vipdoc\sh\lday\*.day
- 深圳交易所:
{通达信安装目录}\vipdoc\sz\lday\*.day
通达信历史日线数据文件格式
每只股票一个day文件,如:sh000001.day。文件中每一天数据总共32字节。其中每32字节数据格式如下:
数据含义 | 数据类型 | 数据长度 | 举例 | 单位 |
---|---|---|---|---|
日期 | Integer | 4 | 20170703 | |
开盘价 | Integer | 4 | 2476 | 当前值/100,元 |
最高价 | Integer | 4 | 2520 | 当前值 /100,元 |
最低价 | Integer | 4 | 2436 | 当前值 / 100,元 |
收盘价 | Integer | 4 | 2457 | 当前值 / 100,元 |
成交金额 | single | 4 | 1317335898 | 元 |
成交量 | Integer | 4 | 45293799 | 股 |
保留 | Integer | 4 |
注意,因为价格均是两位小数,故文件中的价格放大100倍,以便按数字存储。
Go读取日线数据文件
文件每32字节存储一天数据,在Go中只需读取指定长度的字节,再转换为int即可。
第一步:读取文件 以万科股票为例,打开该day文件,获得 reader。
|
|
第二步:获取32字节数据
从文件流中填充32个字节的数据到oneDay中,如果无错误则可以按照数据格式读取单独一天的日行情数据。
注意取价格时需再除以100,已显示正确的金额。
|
|
第三步:遍历获取所有日线数据
|
|
历史数据可在其他网站上查看,下图来自搜狐数据
完整代码:
|
|
进价
有没有更好的办法来进行数据转换?如下格式处理,过于麻烦,幸好该格式数据不多。但容易弄错,或者调整麻烦。
|
|
可以利用Go的encoding/binary
包从reader中读取二元数据到指针对象中:
|
|
这样便可以方便的将byte读取到对象中,下面我们定义data结构:
|
|
注意,在binary读取buf到对象时,是依次遍历对象的内存结构赋值的,因为文件中各数据均是4位长度。故在定义字段类型时,选择int32,占4个字节。字段定义顺序便是内存结构顺序,同文件数据定义顺序保持一致。
但因为数据中均存放的是int32,而收盘价等需要进行转换,故对外时提供另一个结构体,已方便正常访问各数据。 在解析时,进行一次解析即可。
|
|
完整代码
|
|