MT4のヒストリカルデータ読み込み時の留意点

目次

はじめに

MT4を使ってEAを運用する際、バックテストが重要なプロセスになります。バックテストを行うには過去データ、いわゆるヒストリカルデータが必要です。今回は、MT4にヒストリカルデータ(.hstファイル)をダウンロードして読み込ませる際に気をつけたいポイントをまとめます。

まず、.hstファイルにはバージョンが存在し、主に2つのバージョン「400」と「401」があります。これらのバージョンには互換性がなく、例えばバージョン400のファイルは、MT4 build 574以降のバージョンでは読み込むことができません。

バージョンの違い

参考 .hst file format . . . Old and New (Jan 2014) - Symbols - MQL4 and MetaTrader 4 - MQL4 programming forum

.hst ファイルフォーマット (MT4 Build 509 以前)

データ型フィールド名説明サイズ
intversionデータベースバージョン - 4004 バイト
stringcopyright[64]著作権情報64 バイト
stringsymbol[12]シンボル名12 バイト
intperiodシンボルの時間枠4 バイト
intdigits小数点以下の桁数4 バイト
datetimetimesignデータベース作成のタイムスタンプ4 バイト
datetimelast_sync最後の同期時刻4 バイト
intunused[13]予約領域(将来使用)52 バイト
各バーの配列 (シングルバイト右詰め)
データ型フィールド名説明サイズ
datetimectmバーの開始時間4 バイト
doubleopen始値8 バイト
doublelow最安値8 バイト
doublehigh最高値8 バイト
doubleclose終値8 バイト
doublevolumeティック量8 バイト

.hst ファイルフォーマット (MT4 Build 574 以降)

データ型フィールド名説明サイズ
intversionデータベースバージョン - 4014 バイト
stringcopyright[64]著作権情報64 バイト
stringsymbol[12]シンボル名12 バイト
intperiodシンボルの時間枠4 バイト
intdigits小数点以下の桁数4 バイト
datetimetimesignデータベース作成のタイムスタンプ4 バイト
datetimelast_sync最後の同期時刻4 バイト
intunused[13]予約領域(将来使用)52 バイト
各バーの配列 (シングルバイト右詰め)
データ型フィールド名説明サイズ
datetimectmバーの開始時間8 バイト
doubleopen始値8 バイト
doublehigh最高値8 バイト
doublelow最安値8 バイト
doubleclose終値8 バイト
longvolumeティック量8 バイト
intspreadスプレッド4 バイト
longreal_volume実ボリューム8 バイト

対応方法

もし、ダウンロードしたヒストリカルデータが読み込めない場合、バイナリエディタを使用してファイルのヘッダー部分を確認し、バージョンを確認することができます。画像にあるように、バージョン番号はファイルの最初の4バイトに記録されています。
以下の画像を参考に、バージョン400と401の構造の違いを確認してください。使っているバイナリエディタはImHexです。それ以外でもいいですが、hstファイルは大きくなるのでそれを全部メモリに展開してしまうようなソフトだとパソコンが固まる可能性があるため向いていません。

hstバージョン400のバイナリ画像

hstバージョン401のバイナリ画像

見比べてみると、明らかに、データ構造が違うのがわかります。最初の4バイトが、バージョン情報なので、最初のものだと90 01 なので、リトルエンディアンなので、0x0190(16進数) となり、10進数で400。よって、バージョン番号は400。下は91 01 となりリトルエンディアンなので0x0191(16進数)となりバージョン番号は10進数で表したものなので、401となる。上のデータはデューカスコピー社から持ってきたものであるが、Copyrightも書かれてないので変なデータだなとは思う。

まとめ

MT4でバックテストを行う際に、ヒストリカルデータをダウンロードしても読み込めない場合があります。その場合は、まず.hstファイルのバージョンを確認し、MT4のバージョンと互換性があるかどうかをチェックしましょう。