9,542 views
この記事は最終更新から 3164日 が経過しています。
(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
今後複数種類の通貨ペアのヒストリカルデータを高頻度でダウンロードするような状況になれば、コンバータを作ることになるはず。ざっとググったら海外サイトにあったのでそれを使わせていただくかもしれない。でも作るかも。