(16) 【MT4】 ヒストリカルデータ(hstファイル)フォーマット

投稿者: | 2017年9月18日

8,524 views

この記事は最終更新から 2565日 が経過しています。

(1) hstファイルフォーマット

MT4のヒストリカルデータは hstなる独自フォーマットで提供されている。
hstはバイナリファイルであり、メモ帳などのテキストエディタで中身を開いて見ることはできない。

こちらにファイルフォーマットの詳細が書かれている。
MQL5: .hst file format . . . Old and New (Jan 2014)

新旧両バージョンの差は以下の通り。
相違点1: ヘッダ部先頭4バイトに格納されているバージョン番号が異なる。(新は401, 旧は400)
相違点2: 新は各BARデータの末端にSpreadとVolumeが格納されている。旧にはこれが無い。
相違点3: 新はvolumeが整数値で格納されている。旧は浮動小数点値で格納されている。

もし hst → csvコンバートプログラムを作る場合は上記3点を注意する必要があるが、
ただ単に 「このデータは新旧どっちだろう?」 と確認したい場合は 「相違点1」 のみを見ればよい。

(2) 新 or 旧を確認

(2) 過去データの収集」 で取得したヒストリカルデータはどっちだろう?
まぁMetaTrader5でロードしたときに Spreadが入っていなかったから旧なのは明らかなのだが。

簡単なPythonプログラムでファイル先頭4バイトを覗いてみる。

>>> import struct
>>> fh = open("USDJPY.hst", "rb")
>>> struct.unpack("I",fh.read(4))
(400,)

バージョン番号400が入っているので旧バージョンの hstファイルだと確認できた。

(3) 一応スクリプトを作っておく

もしかしたら今後 hst to csvコンバータを作るかもしれないので、新旧判定用スクリプトを作っておく。

judge_hst_version.py

import argparse
import struct

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-f','--fname', required=True)
    args = parser.parse_args()
    #------------------------------
    fh = open(args.fname, "rb")
    v = struct.unpack("I", fh.read(4))
    fh.close()
    #------------------------------
    if v[0] <= 400:
        print("Old version")
    else:
        print("New version")

if __name__=="__main__": main()

コマンドラインからの使い方はこう。
-f オプションでhstファイルを指定する。

[user@linux]$ python judge_hst_version.py -f USDJPY.hst
Old version

今後複数種類の通貨ペアのヒストリカルデータを高頻度でダウンロードするような状況になれば、コンバータを作ることになるはず。ざっとググったら海外サイトにあったのでそれを使わせていただくかもしれない。でも作るかも。


コメントを残す

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


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)