MT4のヒストリカルデータをCSVに出力(エクスポート)する

PythonでFXの自動売買の研究をしようと思っています。

「MT4とPythonの連携」でPythonと通信での連携を調査しましたが、データの受け合わたしだけであれば、ファイル連携が早いです。

そこで、今回はMT4のヒストリカルデータをCSVに出力するスクリプトを作ったので紹介します。
Pythonで読むつもりでCSVへ出力します。

ヒストリカルデータの入手。

下記の記事を参考に入手します。

「MT4でのバックテストの準備」

CSV出力用のスクリプト

実行方法:出力の仕方

スクリプトのダウンロード

下記スクリプトをダウンロードします。

ExportChart.mq4

スクリプトの配置とコンパイル

まず、MT4で下の赤丸のエディタを押して、MT4のMQLエディタを起動します。

エディタの起動

エディタが起動したら、「ナビゲータ」の「Script」フォルダを右クリックしてフォルダを開くを選びます。すると、Scriptを格納するフォルダがエクスプローラで開かれるので、先程ダウンロードしたスクリプトを、そのフォルダに格納します。

すると、ナビゲータの「Script」フォルダの下に「ExportChart.mq4」が表示されるので、ダブルクリックして開きます。ツールバーにある「コンパイル」を押せばコンパイル完了です。

コンパイルが終われば、エディタは不要なので閉じて良いです。

実行

配置とコンパイルが終われば、MT4の「ナビゲータ」にも「ExportChart」が表示されているはずです。

スクリプトは表示中のチャートに対して実行するように作ってあるので、まず、出力したいチャートを表示させて、選択しておきます。

その状態で、「ナビゲータ」の「ExportChart」をダブルクリックすればスクリプトが実行ダイアログが起動します。

ダイアログの「パラメータの入力」タブで、下記2つのパラメータを必要に応じて直します。

  • 抽出開始日時(初期値 2000.1.1 00:00)
  • 抽出終了日時(初期値 3000.1.1 00:00)

初期値は、2000/1/1から3000/1/1と千年の幅広い期間にしてあるので、絞りたい場合は日付等を経校してください。

細かいですが、使い勝手を考え、開始日時は含まれ、終了日時は含めない範囲にしています。例えば3/22だけ抽出したい場合は、

  • 抽出開始日時(初期値 2018.3.22 00:00)
  • 抽出終了日時(初期値 2018.3.23 00:00)

とすれば、3/22 00:00から3/22 23:59まで抽出します。

出力先

スクリプトでは、「EURUSD_1_20180319231947.csv」な感じのファイルに出力するよう実装しています。
ファイル名は、コメントの通り「通貨ペア+時間軸+実行日時(EURUDS_60_20180319215100.csv)」です。実行日時をつけたのはファイル名が重複してかけないとか消したとかならないようにしているためです。

出力フォルダは、「C:\Users\%USER%\AppData\Roaming\MetaQuotes\Terminal\%MQLID%\MQL4\Files」のようなパスです。
スクリプトを配置した環境の近くのフォルダです。

ソース

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property show_inputs

//プロパティ
input string startTime = "2000.1.1 00:00";   //抽出開始日時
input string endTime = "3000.1.1 00:00";     //抽出終了日時

//スクリプト開始
void OnStart()
{
   //ログファイル名を作る
   //  通貨ペア+時間軸+実行日時(EURUDS_60_20180319215100.csv)
   datetime localtime = TimeLocal();
   string filename = Symbol() + "_" + IntegerToString(Period()) + "_";
   filename += IntegerToString(TimeYear(localtime)) + IntegerToString(TimeMonth(localtime), 2, '0') + IntegerToString(TimeDay(localtime), 2, 0);
   filename += IntegerToString(TimeHour(localtime), 2, '0') + IntegerToString(TimeMinute(localtime), 2, '0') + IntegerToString(TimeSeconds(localtime), 2, '0');
   filename += ".csv";

   //抽出期間を文字列からdatetimeへ変換
   datetime from = StringToTime(startTime);
   datetime to = StringToTime(endTime);

   //書き込み用のCSVファイルオープン
   int handle = FileOpen(filename, FILE_WRITE | FILE_CSV, ",");

   //ヘッダ
   FileWrite(handle, "Time", "Open", "High", "Low", "Close");

   //チャートのサイズ
   int size = ArraySize(Time);

   //過去から出力
   for(int i = size - 1; i >= 0; i--){

      //期間の範囲外は無視
      if(Time[i] < from || to <= Time[i]){
         continue;
      }

      //出力
      FileWrite(
         handle,
         Time[i],
         Open[i],
         High[i],
         Low[i],
         Close[i]
      );

   }

   //ファイルクローズ
   FileClose(handle);
}

シェアする

  • このエントリーをはてなブックマークに追加

フォローする