最近在學(xué)習(xí)一種理論,真TMD的難啊,又沒有多少圖可以看,說到的以前的分鐘線數(shù)據(jù),在網(wǎng)上找了很久,都不容易看到。
不過利用通達(dá)信可以幫我們做到。通達(dá)信可以下載每天的分筆數(shù)據(jù),就利用這個(gè)文本文件去產(chǎn)生以前的分時(shí)圖!
用到的工具是著名的python,也是我最喜歡的語言。
需要說明的是,我安裝的是國信,路徑是e:\cwork\guosen , 為了方便看
歷史分時(shí)線我
我是將產(chǎn)生的5分鐘數(shù)據(jù)文件和1分鐘數(shù)據(jù)文件拷貝到英大的目錄下看的。由于我不知道通達(dá)信的1分鐘數(shù)據(jù)文件到底是如何命名的,所以我也把它取成lc5的文件名,真正看1分鐘圖時(shí)切換到5分鐘圖下看即可。當(dāng)然可能與真正的1分鐘圖、5分鐘圖有些許差異,但這并無大礙,況且同花順的1分鐘圖就和通達(dá)信的也存在細(xì)微的差異!
以下是CODE(注意:PYTHON 對(duì)縮進(jìn)式敏感的,空格不要隨意刪除!另外我用的python 2.5 的
2.6應(yīng)該可以運(yùn)行,3.0及以上應(yīng)該不可以! )
#!/usr/bin/python
#-*- encoding: gbk -*-
from __future__ import division
from
struct
import *
import os,time ,datetime,string,sys,math,re,shutil,glob
import zipfile,StringIO,getopt
#from readths2 import *
# 2010-09-02 by wanghp
basedir = r'e:\cwork\guosen' #如果你的安裝路徑不同,請(qǐng)改這里
exp_dir =
basedir + r'\T0002\export'
#exp_dir =
basedir + r'\T0002\export_back'
lc5_dir_sh = basedir + r'\Vipdoc\sh\fzline'
#lc5_dir_sh =
r'D:\2965\ydzqwsjy\Vipdoc\sh\fzline'
lc5_dir_sz = basedir + r'\Vipdoc\sz\fzline'
day_dir_sh = basedir + r'\Vipdoc\sh\lday'
day_dir_sz = basedir + r'\Vipdoc\sz\lday'
stkdict = {} #存儲(chǔ)股票ID和上海市、深圳市的對(duì)照
#############################################################
# read 通達(dá)信分筆數(shù)據(jù)
# example readfbtxt(readlines(),'20100831-600000.TXT')
# 返回的data格式為
# (stkid,datetime,price,amount,vol(股數(shù)),筆數(shù),buy or sale) 的list
#############################################################
def readfbtxt(p_lines,p_name):
"""讀通達(dá)信分筆數(shù)據(jù)
"""
data =
[]
shortname =
os.path.split(p_name)[1]
shortname =
os.path.splitext(shortname)[0]
sDay,stkID =
shortname.split('-')
if len(sDay)
!= 8 : return data
stky =
int(sDay[0:4])
stkm =
int(sDay[4:6])
stkd =
int(sDay[6:8])
line_no =
0
for l in
p_lines:
line_no += 1
if line_no <=3: continue
l = l.strip()
t = re.split('\s+',l)
k =
datetime.datetime(stky,stkm,stkd,int(t[0][0:2]),int(t[0][3:5]))
p =
float(t[1])
#price
vol = int(t[2])*100 #股數(shù)
amt = p *
vol
#成交量
bscnt =
0
#筆數(shù)
bstag =
''
#buy or sale
try:
bscnt =
int(t[3])
#筆數(shù)
bstag =
t[4]
#buy or sale
except IndexError,e:
pass
data.append((stkID,k,p,amt,vol,bscnt,bstag))
return
data
#############################################################
# 將分筆數(shù)據(jù)轉(zhuǎn)化為分筆數(shù)據(jù)
# p_data:傳入?yún)?shù) 為readfbtxt所返回
# data: 返回的數(shù)據(jù)格式為
# [stkid,datetime,open,high,low,close,amt,vol(股)]
#############################################################
def fbtxt2lc0(p_data):
"""分筆數(shù)據(jù)轉(zhuǎn)化為1分鐘數(shù)據(jù)"""
data =
[]
for i in
p_data:
t =
i[1]
#datetime
p =
i[2]
#price
data.append([i[0],t,p,p,p,p,i[3],i[4]])
return
data
#############################################################
# 將分筆數(shù)據(jù)轉(zhuǎn)化為1分鐘數(shù)據(jù)
# p_data:傳入?yún)?shù) 為readfbtxt所返回
# data: 返回的數(shù)據(jù)格式為
# [stkid,datetime,open,high,low,close,amt,vol(股)]
#############################################################
def fbtxt2lc1(p_data):
"""分筆數(shù)據(jù)轉(zhuǎn)化為1分鐘數(shù)據(jù)"""
data =
[]
for i in
p_data:
t =
i[1]
#datetime
p =
i[2]
#price
lend = len(data)
j = lend - 1
while j >= 0:
if data[j][1] == t:break
j -= 1
if j < 0: #沒有找到該時(shí)間
data.append([i[0],t,p,p,p,p,i[3],i[4]])
else:
#找到該時(shí)間
if p > data[j][3]: #high
data[j][3] = p
if p < data[j][4]: #low
data[j][4] = p
data[j][5] =
p
#close
data[j][6] += i[3] #amout
data[j][7] += i[4] #vol
#data.sort(key = lambda x:x[1]) #以datetime
排序
return
data
#############################################################
# 一個(gè)時(shí)間對(duì)應(yīng)的5分鐘區(qū)間段
# dt 傳入?yún)?shù) 為一個(gè)datetime.datetime or datetime.time
# 返回datetime 或time
#############################################################
def which5min(dt):
"""5 分鐘時(shí)間劃分
"""
if type(dt)
!= datetime.datetime and type(dt) !=
datetime.time:
return None
t = dt
ret =
None
if type(dt)
== datetime.datetime:
t = datetime.time(dt.hour,dt.minute,dt.second)
if t
< datetime.time(9,30) : return None
if t <
datetime.time(9,35): ret = datetime.time(9,35)
elif t
< datetime.time(9,40): ret =
datetime.time(9,40)
elif t
< datetime.time(9,45): ret =
datetime.time(9,45)
elif t
< datetime.time(9,50): ret =
datetime.time(9,50)
elif t
< datetime.time(9,55): ret =
datetime.time(9,55)
elif t
< datetime.time(10,0): ret =
datetime.time(10,0)
elif t
< datetime.time(10,5): ret =
datetime.time(10,5)
elif t
< datetime.time(10,10): ret =
datetime.time(10,10)
elif t
< datetime.time(10,15): ret =
datetime.time(10,15)
elif t
< datetime.time(10,20): ret =
datetime.time(10,20)
elif t
< datetime.time(10,25): ret =
datetime.time(10,25)
elif t
< datetime.time(10,30): ret =
datetime.time(10,30)
elif t
< datetime.time(10,35): ret =
datetime.time(10,35)
elif t
< datetime.time(10,40): ret =
datetime.time(10,40)
elif t
< datetime.time(10,45): ret =
datetime.time(10,45)
elif t
< datetime.time(10,50): ret =
datetime.time(10,50)
elif t
< datetime.time(10,55): ret =
datetime.time(10,55)
elif t
< datetime.time(11,0): ret =
datetime.time(11,0)
elif t
< datetime.time(11,5): ret =
datetime.time(11,5)
elif t
< datetime.time(11,10): ret =
datetime.time(11,10)
elif t
< datetime.time(11,15): ret =
datetime.time(11,15)
elif t
< datetime.time(11,20): ret =
datetime.time(11,20)
elif t
< datetime.time(11,25): ret =
datetime.time(11,25)
elif t
<= datetime.time(11,30): ret =
datetime.time(11,30)
# elif t
< datetime.time(13,0): ret =
datetime.time(13,0)
elif t
< datetime.time(13,5): ret =
datetime.time(13,5)
elif t
< datetime.time(13,10): ret =
datetime.time(13,10)
elif t
< datetime.time(13,15): ret =
datetime.time(13,15)
elif t
< datetime.time(13,20): ret =
datetime.time(13,20)
elif t
< datetime.time(13,25): ret =
datetime.time(13,25)
elif t
< datetime.time(13,30): ret =
datetime.time(13,30)
elif t
< datetime.time(13,35): ret =
datetime.time(13,35)
elif t
< datetime.time(13,40): ret =
datetime.time(13,40)
elif t
< datetime.time(13,45): ret =
datetime.time(13,45)
elif t
< datetime.time(13,50): ret =
datetime.time(13,50)
elif t
< datetime.time(13,55): ret =
datetime.time(13,55)
elif t
< datetime.time(14,0): ret =
datetime.time(14,0)
elif t
< datetime.time(14,5): ret =
datetime.time(14,5)
elif t
< datetime.time(14,10): ret =
datetime.time(14,10)
elif t
< datetime.time(14,15): ret =
datetime.time(14,15)
elif t
< datetime.time(14,20): ret =
datetime.time(14,20)
elif t
< datetime.time(14,25): ret =
datetime.time(14,25)
elif t
< datetime.time(14,30): ret =
datetime.time(14,30)
elif t
< datetime.time(14,35): ret =
datetime.time(14,35)
elif t
< datetime.time(14,40): ret =
datetime.time(14,40)
elif t
< datetime.time(14,45): ret =
datetime.time(14,45)
elif t
< datetime.time(14,50): ret =
datetime.time(14,50)
elif t
< datetime.time(14,55): ret =
datetime.time(14,55)
elif t
<= datetime.time(15,0): ret =
datetime.time(15,0)
else :
return None
if type(dt)
== datetime.datetime:
return
datetime.datetime(dt.year,dt.month,dt.day,ret.hour,ret.minute,ret.second)
else: return
ret
#############################################################
# 將1分鐘數(shù)據(jù)轉(zhuǎn)為5分鐘數(shù)據(jù)
# p_data:傳入?yún)?shù) 為fbtxt2lc1所返回
# data: 返回的數(shù)據(jù)格式為
# [stkid,datetime,open,high,low,close,amt,vol(股)]
#############################################################
def lc1tolc5(p_data):
"""1分鐘數(shù)據(jù)轉(zhuǎn)化為5分鐘數(shù)據(jù) """
if
len(p_data) <= 0: return None
data =
[]
for i in
p_data:
t = which5min(i[1])
#找對(duì)應(yīng)5分鐘的區(qū)段
if t == None:
raise ValueError,'time out of range: %s' % i[1]
lend = len(data)
j = lend - 1
while j >= 0:
if data[j][1] == t:break
j -= 1
if j < 0: #沒有找到該時(shí)間
data.append([i[0],t,i[2],i[3],i[4],i[5],i[6],i[7]])
else:
#找到該時(shí)間
if i[3] > data[j][3]: #high
data[j][3] = i[3]
if i[4] < data[j][4]: #low
data[j][4] = i[4]
data[j][5] =
i[5]
#close
data[j][6] +=
i[6]
#amout
data[j][7] +=
i[7]
#vol
#data.sort(key = lambda x:x[1]) #以datetime
排序
return
data
#############################################################
# read 5分鐘數(shù)據(jù)
# example
readlc5(r'E:\new_gxzq_v6\Vipdoc\sh\fzline\sh600000.lc5')
#############################################################
def readlc5(p_name):
"""tdx 5min 數(shù)據(jù)
日期上低16位表示月日,高16位表示分鐘
這個(gè)結(jié)構(gòu)個(gè)人感覺就不如同花順做的巧妙
在一個(gè)4字節(jié)中把 年 月 日 時(shí) 分 都記錄下來了
"""
f = open(p_name,'rb')
stkID = os.path.split(p_name)[1]
stkID = os.path.splitext(stkID)[0]
if string.lower(stkID[0:2]) == 'sh' or string.lower(stkID[0:2]) ==
'sz':
stkID = stkID[2:]
icnt = 0
data = []
while 1:
raw = f.read(4*8)
if len(raw) <= 0 : break
t = unpack('IfffffII',raw)
mins = (t[0] >> 16) &
0xffff
mds = t[0] & 0xffff
month = int(mds / 100)
day = mds % 100
hour = int(mins / 60)
minute = mins % 60
#datet = "d-d d:d" % (month,day,hour,minute)
data.append((stkID,(month,day,hour,minute),t[1],t[2],t[3],t[4],t[5],t[6],t[7]))