Python讀取通達信本地數據


一、通達信日線*.day文件


    文件名即股票代碼
    每32個字節為一天數據
    每4個字節為一個字段,每個字段內低字節在前
    00 ~ 03 字節:年月日, 整型
    04 ~ 07 字節:開盤價*1000, 整型
    08 ~ 11 字節:最高價*1000,  整型
    12 ~ 15 字節:最低價*1000,  整型
    16 ~ 19 字節:收盤價*1000,  整型
    20 ~ 23 字節:成交額(元),float型
    24 ~ 27 字節:成交量(手),整型
    28 ~ 31 字節:上日收盤*1000, 整型


二、通達信5分鍾線*.5文件
    每32個字節為一個5分鍾數據,每字段內低字節在前
    00 ~ 01 字節:日期,整型,設其值為num,則日期計算方法為:
                  year=floor(num/2048)+2004;
                  month=floor(mod(num,2048)/100);
                  day=mod(mod(num,2048),100);
   02 ~ 03 字節: 從0點開始至目前的分鍾數,整型
    04 ~ 07 字節:開盤價(分),整型
    08 ~ 11 字節:最高價(分),整型
    12 ~ 15 字節:最低價(分),整型
    16 ~ 19 字節:收盤價(分),整型
    20 ~ 23 字節:成交額(元),float型
    24 ~ 27 字節:成交量(股)
    28 ~ 31 字節:(保留)

 

三、在 vipdoc/sh 目錄下新建了個 pythondata 文件夾,注意文件路徑分隔符是 /

import struct
import datetime


def stock_csv(filepath, name):
    data = []
    with open(filepath, 'rb') as f:
        file_object_path = 'D:/通達信/vipdoc/sh/pythondata/' + name +'.csv'
        file_object = open(file_object_path, 'w+')
        while True:
            stock_date = f.read(4)
            stock_open = f.read(4)
            stock_high = f.read(4)
            stock_low= f.read(4)
            stock_close = f.read(4)
            stock_amount = f.read(4)
            stock_vol = f.read(4)
            stock_reservation = f.read(4)

            # date,open,high,low,close,amount,vol,reservation

            if not stock_date:
                break
            stock_date = struct.unpack("l", stock_date)     # 4字節 如20091229
            stock_open = struct.unpack("l", stock_open)     #開盤價*100
            stock_high = struct.unpack("l", stock_high)     #最高價*100
            stock_low= struct.unpack("l", stock_low)        #最低價*100
            stock_close = struct.unpack("l", stock_close)   #收盤價*100
            stock_amount = struct.unpack("f", stock_amount) #成交額
            stock_vol = struct.unpack("l", stock_vol)       #成交量
            stock_reservation = struct.unpack("l", stock_reservation) #保留值

            date_format = datetime.datetime.strptime(str(stock_date[0]),'%Y%M%d') #格式化日期
            list= date_format.strftime('%Y-%M-%d')+","+str(stock_open[0]/100)+","+str(stock_high[0]/100.0)+","+str(stock_low[0]/100.0)+","+str(stock_close[0]/100.0)+","+str(stock_vol[0])+"\r\n"
            file_object.writelines(list)
        file_object.close()

stock_csv('D:/通達信/vipdoc/sh/lday/sh000001.day', '1')

看了一下1.CSV 文件的輸出數據,正確!

這么多年數據格式沒變,也沒加密。感謝通達信!祝通達信事業蒸蒸日上!

 

四、批量解析

import os
import struct
import datetime


def stock_csv(filepath, name):
    data = []
    with open(filepath, 'rb') as f:
        file_object_path = 'D:/通達信/vipdoc/sh/pythondata/' + name +'.csv'
        file_object = open(file_object_path, 'w+')
        while True:
            stock_date = f.read(4)
            stock_open = f.read(4)
            stock_high = f.read(4)
            stock_low= f.read(4)
            stock_close = f.read(4)
            stock_amount = f.read(4)
            stock_vol = f.read(4)
            stock_reservation = f.read(4)

            # date,open,high,low,close,amount,vol,reservation

            if not stock_date:
                break
            stock_date = struct.unpack("l", stock_date)     # 4字節 如20091229
            stock_open = struct.unpack("l", stock_open)     #開盤價*100
            stock_high = struct.unpack("l", stock_high)     #最高價*100
            stock_low= struct.unpack("l", stock_low)        #最低價*100
            stock_close = struct.unpack("l", stock_close)   #收盤價*100
            stock_amount = struct.unpack("f", stock_amount) #成交額
            stock_vol = struct.unpack("l", stock_vol)       #成交量
            stock_reservation = struct.unpack("l", stock_reservation) #保留值

            date_format = datetime.datetime.strptime(str(stock_date[0]),'%Y%M%d') #格式化日期
            list= date_format.strftime('%Y-%M-%d')+","+str(stock_open[0]/100)+","+str(stock_high[0]/100.0)+","+str(stock_low[0]/100.0)+","+str(stock_close[0]/100.0)+","+str(stock_vol[0])+"\r\n"
            file_object.writelines(list)
        file_object.close()


path = 'D:/通達信/vipdoc/sh/lday/'
listfile = os.listdir('D:/通達信/vipdoc/sh/lday/')
for i in listfile:
    stock_csv(path+i, i[:-4])

 順便寫個簡單的公式,其實與macd差不多

BASE:0;
J10:SUM(C,10)/10 NODRAW;
PL10:(C-J10)/J10*100 COLORSTICK;
PL10SUM:IF(PL10>=0,SUM(PL10,BARSLASTCOUNT(PL10>=0)),SUM(PL10,BARSLASTCOUNT(PL10<0)));
PL60:=(C-MA(C,60))/MA(C,60)*100;
PL60SUM:IF(PL60>=0,SUM(PL60,BARSLASTCOUNT(PL60>=0)),SUM(PL60,BARSLASTCOUNT(PL60<0)))  NODRAW;
PL10DAY:IF(PL10>=0,BARSLASTCOUNT(PL10>=0),0-BARSLASTCOUNT(PL10<0)) NODRAW;
MMAX:=MAX(MAX(MAX(MAX(MAX(MA(C,5),MA(C,10)),MA(C,20)),MA(C,30)),MA(C,60)),MA(C,120));
XL60:(MA(C,60)-REF(MA(C,60),10))/REF(MA(C,60),10)*100 NODRAW;
PL250:(C-MA(C,250))/MA(C,250)*100 NODRAW;
PL10SUMA:IF(C>MA(C,250),PL10SUM,1000)  NODRAW;

  

 

參考:https://blog.csdn.net/weixin_33755554/article/details/86306394

https://www.jianshu.com/p/9dd3ef74fe96


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM