Reading data from the Dukascopy tick binary

I downloaded the Dukascopy tick data and I am unpacking it using the easylzma library. The original compressed binary file is EURUSD / 2010/00/08 / 12h_ticks.bi5 (EURUSD / 2010 / ian / 8 / 12h) After unpacking, we get the following format:

+-------------------------+--------+-------+ | time | Bid | Ask | +-------------------------+--------+-------+ 000003CA 00022EC0 00022EB6 40CCCCCD 41180000 000004F5 00022EB6 00022EB1 4099999A 404CCCCD 

(You can download the original compressed file from: EURUSD / 2010/00/08 / 12h_ticks.bi5 . After unpacking with lzma we get the file: 12h_ticks )

Reading a binary file:

 int ii1; int ii2; int ii3; float ff1; float ff2; ifstream in("12h_ticks",ofstream::binary); in.read((char*)(&ii1), sizeof(int)); in.read((char*)(&ii2), sizeof(int)); in.read((char*)(&ii3), sizeof(int)); in.read((char*)(&ff1), sizeof(float)); in.read((char*)(&ff2), sizeof(float)); std::cout << " ii1=" << ii1 << std::endl; std::cout << " ii2=" << ii2 << std::endl; std::cout << " ii3=" << ii3 << std::endl; std::cout << " ff1=" << ff1 << std::endl; std::cout << " ff2=" << ff2 << std::endl; in.close(); 

I get the following result:

 ii1=-905773056 ii2=-1070726656 ii3=-1238498816 ff1=-4.29492e+08 ff2=8.70066e-42 

What's wrong? I cannot read data from a binary file. Please help me.

+6
source share
2 answers

The data appears to be stored in large end format in a file. You will need to convert it to a small end when you download it.

 #include <iostream> #include <fstream> #include <algorithm> template<typename T> void ByteSwap(T* p) { for (int i = 0; i < sizeof(T)/2; ++i) std::swap( ((char *)p)[i], ((char *)p)[sizeof(T)-1-i] ); } int main() { int ii1; int ii2; int ii3; float ff1; float ff2; std::ifstream in("12h_ticks",std::ofstream::binary); in.read((char*)(&ii1), sizeof(int)); in.read((char*)(&ii2), sizeof(int)); in.read((char*)(&ii3), sizeof(int)); in.read((char*)(&ff1), sizeof(float)); in.read((char*)(&ff2), sizeof(float)); ByteSwap(&ii1); ByteSwap(&ii2); ByteSwap(&ii3); ByteSwap(&ff1); ByteSwap(&ff2); std::cout << " ii1=" << ii1 << std::endl; std::cout << " ii2=" << ii2 << std::endl; std::cout << " ii3=" << ii3 << std::endl; std::cout << " ff1=" << ff1 << std::endl; std::cout << " ff2=" << ff2 << std::endl; in.close(); return 0; } 

This gives the result:

 ii1=970 ii2=143040 ii3=143030 ff1=6.4 ff2=9.5 

I grabbed the ByteSwap function from here if you want to know more about this subject. How to convert big-endian and little-endian values ​​to C ++?

+8
source

ii1 - seconds during this hour

ii2 sets * 10000

ii3 - bet * 10000

ff1 sets the volume

ff2 - bet volume

+5
source

All Articles