Decompress and read Dukascopy .bi5 tick files

后端 未结 3 1183
有刺的猬
有刺的猬 2020-12-31 18:13

I need to open a .bi5 file and read the contents to cut a long story short. The problem: I have tens of thousands of .bi5 files containing time-ser

3条回答
  •  温柔的废话
    2020-12-31 18:54

    import requests
    import struct
    from lzma import LZMADecompressor, FORMAT_AUTO
    
    # for download compressed EURUSD 2020/06/15/10h_ticks.bi5 file
    res = requests.get("https://www.dukascopy.com/datafeed/EURUSD/2020/06/15/10h_ticks.bi5", stream=True)
    print(res.headers.get('content-type'))
    
    rawdata = res.content
    
    decomp = LZMADecompressor(FORMAT_AUTO, None, None)
    decompresseddata = decomp.decompress(rawdata)
    
    firstrow = struct.unpack('!IIIff', decompresseddata[0: 20])
    print("firstrow:", firstrow)
    # firstrow: (436, 114271, 114268, 0.9399999976158142, 0.75)
    # time = 2020/06/15/10h + (1 month) + 436 milisecond
    
    secondrow = struct.unpack('!IIIff', decompresseddata[20: 40])
    print("secondrow:", secondrow)
    # secondrow: (537, 114271, 114267, 4.309999942779541, 2.25)
    
    # time = 2020/06/15/10h + (1 month) + 537 milisecond
    # ask = 114271 / 100000 = 1.14271
    # bid = 114267 / 100000 = 1.14267
    # askvolume = 4.31
    # bidvolume = 2.25
    
    # note that 00 -> is january
    # "https://www.dukascopy.com/datafeed/EURUSD/2020/00/15/10h_ticks.bi5" for january
    # "https://www.dukascopy.com/datafeed/EURUSD/2020/01/15/10h_ticks.bi5" for february
    
    #  iterating
    print(len(decompresseddata), int(len(decompresseddata) / 20))
    for i in range(0, int(len(decompresseddata) / 20)):
        print(struct.unpack('!IIIff', decompresseddata[i * 20: (i + 1) * 20]))
    

提交回复
热议问题