6

Dukascopy のティック データをダウンロードし、easylzma ライブラリで解凍しました。元の圧縮バイナリ ファイルは EURUSD/2010/00/08/12h_ticks.bi5 (EURUSD/2010/ian/8/12h) です。解凍すると、次の形式になります。

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

(元の圧縮ファイルは EURUSD/2010/00/08/ 12h_ticks.bi5からダウンロードできます。lzmaで解凍すると、次のファイルが得られます: 12h_ticks )

バイナリ ファイルの読み取り:

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();

次の結果が得られます。

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

なにが問題ですか?バイナリ ファイルからデータを読み取ることができません。私を助けてください。

4

2 に答える 2

9

データはファイルにビッグ エンディアン形式で格納されているようです。ロードするときは、リトル エンディアンに変換する必要があります。

#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;
}

これにより、次の結果が得られます。

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

ByteSwap 関数について詳しく知りたい場合は、ここから ByteSwap 関数を取得しました。 C++ でビッグ エンディアン値とリトル エンディアン値を変換するにはどうすればよいですか?

于 2012-12-26T04:18:07.410 に答える
5

ii1はこの時間内の秒です

ii2はAsk*10000です

ii3は入札*10000

ff1はAskVolumeです

ff2は入札ボリュームです

于 2013-03-14T15:17:08.213 に答える