PythonからMQL4のhstファイルを書き出すときにハマったこと

株式投資

Pythonでhstファイルを書き出すときには、ヘッダを以下のように書き出して

    version = 401
    _copyright = "(C)opyright 2003, MetaQuotes Software Corp."
    digit = 2
    time_sign = int(time.time())
    last_sync = 0
    unused = ""
    buf = pack("1I64s12s4I52s", version, _copyright, symbol, period, digit, time_sign, last_sync, unused)
    outfile.write(buf)

価格データはこのように書き出せばいいのですが、

    buf = pack("1q4d8x4x8x", price_dict["time"], price_dict["open"], price_dict["high"], price_dict["low"], price_dict["close"])
    outfile.write(buf)

なぜかどうしても読み込みに失敗して途中までしか読み込めない。

自分のコーディングミスかPythonのバグかMT4のバグかと3日くらい探してみたけど分からず途方に暮れていたのですが、
一念発起してバイナリエディタで書きだしたバイナリと期待値を比べてみるとdoubleの書き出しの途中で余計なバイトが1バイト追加されている。

packしたデータをbin2ascii.hexlifyした時には無いデータなので、
これは書き出し時の問題だと踏んでoutfileの初期化部を見てみると、

    outfile_day = open(directory + symbol + str(periodDay) + ".hst", "w")

ぐへーバイナリモード付いてない

正しくはこう。

    outfile_day = open(directory + symbol + str(periodDay) + ".hst", "wb")

バイナリモードついていなくてもそれっぽいデータを書きだすから気づかなかった。
むしろめちゃくちゃなデータのほうが早く見つかったかも^^;

コメント

タイトルとURLをコピーしました