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")

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


投稿日

カテゴリー:

,

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください