SQL Server直接读取同花顺股票数据

SQLCenter 2010-08-22 11:17:57
加精
CSDN的朋友,从明天本人开始要为生计奔波,没时间上CSDN了,混迹CSDN一个月,有什么得罪的地方,请多多包涵。

消失之前,总想写点什么,纯技术帖是写不出来,太久没玩数据库,前几天看到有朋友问道股票数据的问题,那就写一个直接用OPENROWSET读取同花顺股票数据的方法吧,适合盘后分析。

方法不算好方法,但比较简单,以前我做数据分析的时候,都是用这个方法,平时数据库不存数据,需要分析的时候动态调入,调入速度很快,有更好方法的朋友请多多指教。

下面是日线数据(600787只是例子不构成任何投资建议):


--===============================================================
-- 文件头16个字节剖析(日线)
-- 0x6864312E3000 6 固定
-- 0x???????? 4 记录数
-- 0x4800 2 记录开始位置: 64是错的, 文件头 + 列定义 = 72
-- 0x3800 2 每记录的长度: 56
-- 0x0E00 2 每记录的列数: 14
-----------------------------------------------------------------
-- 列定义: 04表示列长度
-- 0x01300004 4 日期
-- 0x07700004 4 开盘价
-- 0x08700004 4 最高价
-- 0x09700004 4 最低价
-- 0x0B700004 4 收盘价
-- 0x13700004 4 成交金额(元)
-- 0x0D700004 4 成交量(股)
-- 0x0E700004 4 FFFFFFFF
-- 0x0F700004 4 FFFFFFFF
-- 0x11700004 4 FFFFFFFF
-- 0x12700004 4 FFFFFFFF
-- 0x50700004 4 FFFFFFFF
-- 0xE7700004 4 FFFFFFFF
-- 0xE8700004 4 FFFFFFFF
--===============================================================
if object_id('tempdb.dbo.#') is not null drop table #
go
declare @ varbinary(max), @max int, @e float
select @ = BulkColumn, @e = 10 from OPENROWSET(BULK N'X:\...\history\shase\day\600787.day', SINGLE_BLOB) as bin
select @max = substring(@,10,1)+substring(@,9,1)+substring(@,8,1)+substring(@,7,1)
select top (@max) n = identity(int,72,56) into # from syscolumns a, syscolumns b
;with cte as
(
select
-- SQL没有提供按字节reverse(binary)的函数或方法,只能substring每个字节倒过来合成:
d = convert(int,substring(@, 4+n,1)+substring(@, 3+n,1)+substring(@, 2+n,1)+substring(@, 1+n,1)),
o = convert(int,substring(@, 8+n,1)+substring(@, 7+n,1)+substring(@, 6+n,1)+substring(@, 5+n,1))&0x0FFFFFFF,
p = convert(int,substring(@,12+n,1)+substring(@,11+n,1)+substring(@,10+n,1)+substring(@, 9+n,1))&0x0FFFFFFF,
q = convert(int,substring(@,16+n,1)+substring(@,15+n,1)+substring(@,14+n,1)+substring(@,13+n,1))&0x0FFFFFFF,
r = convert(int,substring(@,20+n,1)+substring(@,19+n,1)+substring(@,18+n,1)+substring(@,17+n,1))&0x0FFFFFFF,
s = convert(int,substring(@,24+n,1)+substring(@,23+n,1)+substring(@,22+n,1)+substring(@,21+n,1))&0x0FFFFFFF,
t = convert(int,substring(@,28+n,1)+substring(@,27+n,1)+substring(@,26+n,1)+substring(@,25+n,1))&0x0FFFFFFF,
u = convert(int,substring(@, 8+n,1))/16,
v = convert(int,substring(@,12+n,1))/16,
w = convert(int,substring(@,16+n,1))/16,
x = convert(int,substring(@,20+n,1))/16,
y = convert(int,substring(@,24+n,1))/16,
z = convert(int,substring(@,28+n,1))/16
from #
)
select
id = row_number()over(order by d desc),
日期 = d,
开盘 = o*power(@e,(u&7)*power(-1,sign(u&8))),
最高 = p*power(@e,(v&7)*power(-1,sign(v&8))),
最低 = q*power(@e,(w&7)*power(-1,sign(w&8))),
收盘 = r*power(@e,(x&7)*power(-1,sign(x&8))),
金额 = s*power(@e,(y&7)*power(-1,sign(y&8))),
成交 = t*power(@e,(z&7)*power(-1,sign(z&8)))
from cte

/*
id 日期 开盘 最高 最低 收盘 金额 成交
-------- ----------- -------- -------- -------- -------- ------------ ------------
1 20100820 8.35 8.39 8.09 8.25 107211287 13054826
2 20100819 8.61 8.61 8.38 8.45 86104465 10147807
3 20100818 8.38 8.65 8.32 8.61 115737744 13614804
. . . . . . . .
. . . . . . . .
. . . . . . . .
3214 19970122 10.75 10.8 10.23 10.46 29105000 2810400
3215 19970121 10.8 11.42 10.8 10.93 94426000 8567400
*/



下面是分钟线数据,具体内容就不写了,只是调整一下数字表#标识列的初始大小和增量问题:


--===============================================================
-- 文件头16个字节剖析(5/1分钟线)
-- 0x6864312E3000 6 固定
-- 0x???????? 4 记录数
-- 0x3800 2 记录开始位置: 56是对的, 文件头 + 列定义 = 56
-- 0x2800 2 每记录的长度: 40
-- 0x0A00 2 每记录的列数: 10
-----------------------------------------------------------------
-- 列定义: 04表示列长度
-- 0x01300004 4 日期: 已加密, 不要问怎么解密, 我不知道.
-- 0x07700004 4 开盘价
-- 0x08700004 4 最高价
-- 0x09700004 4 最低价
-- 0x0B700004 4 收盘价
-- 0x13700004 4 成交金额(元)
-- 0x0D700004 4 成交量(股)
-- 0x0E700004 4 FFFFFFFF
-- 0x0F700004 4 FFFFFFFF
-- 0x12700004 4 FFFFFFFF
--===============================================================


用SQL来分析二进制文件格式还是比较方便的,可以直接select/convert,快捷直观。我一般用来分析game的存档文件,呵呵。

欢迎排砖。
...全文
10209 156 打赏 收藏 转发到动态 举报
写回复
用AI写文章
156 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnp2nx 2012-12-17
  • 打赏
  • 举报
回复
看不懂,收藏先
allen12345 2012-09-10
  • 打赏
  • 举报
回复
哦,好,收藏起来
zclin1971 2010-10-26
  • 打赏
  • 举报
回复
好东西,慢慢学习
sontiq 2010-10-19
  • 打赏
  • 举报
回复
能不能给个详细的一分钟线的提取方法?
quakegao 2010-10-16
  • 打赏
  • 举报
回复
xxxxxxx
meteortear 2010-09-22
  • 打赏
  • 举报
回复
正是我要找的,谢谢了
kangda 2010-09-12
  • 打赏
  • 举报
回复
[Quote=引用 146 楼 sqlcenter 的回复:]

引用 145 楼 kangda 的回复:

请问,怎么才能取得到日k线数据中的涨幅、振幅、换手率呢?


这些数据是计算出来的
[/Quote]
嗯,我现在取得到开高低收、成交量、成交金额,算出了涨幅、振幅。

现在不知道怎么取换手率的相关数据,你能说一下吗?谢谢了。
kangda 2010-09-11
  • 打赏
  • 举报
回复
请问,怎么才能取得到日k线数据中的涨幅、振幅、换手率呢?
szymis 2010-09-11
  • 打赏
  • 举报
回复
很好的代码
SQLCenter 2010-09-11
  • 打赏
  • 举报
回复
[Quote=引用 145 楼 kangda 的回复:]

请问,怎么才能取得到日k线数据中的涨幅、振幅、换手率呢?
[/Quote]

这些数据是计算出来的
adiag 2010-09-02
  • 打赏
  • 举报
回复 1
我也应该贡献一下吧,
分钟数据的日期是这样解密的:
select 1911040935/100000000+1990,1911040935/1000000%100,1911040935/10000%100,1911040935/100%100,1911040935%100

而且分钟数据比较少,只能下载1年的。

jAmEs_ 2010-08-27
  • 打赏
  • 举报
回复
看一看,不说话
myfanjun 2010-08-27
  • 打赏
  • 举报
回复
厉害。高手
chen870201 2010-08-26
  • 打赏
  • 举报
回复
好强大的程序啊~
Aries2010 2010-08-26
  • 打赏
  • 举报
回复
迷茫啊~~~
ladygaga1090 2010-08-26
  • 打赏
  • 举报
回复
看不懂。。
heling0223 2010-08-26
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
qiuhui00 2010-08-26
  • 打赏
  • 举报
回复
没看懂啊没看懂,期待楼主能详细解答一下。。。
bl_song 2010-08-26
  • 打赏
  • 举报
回复
只能看得懂一点儿。。。
liang8976 2010-08-26
  • 打赏
  • 举报
回复
呵呵,不错,值得学习
加载更多回复(122)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧