2024.10

林貴晴/AMSER Inc.

MetaTrader 5(MT5)は、使用している証券会社の過去データを自動でインストールされるため、利便性が大幅に向上しています。複雑な過去データのインポート作業が不要で、データの信頼性も向上が期待できます。
一方、MetaTrader 4(MT4)にはCSV形式で過去データをエクスポートする機能があります。これにより、任意のタイミングでデータを取り出し、外部ツールを使って独自の分析を行うことができます。残念ながら、MT5にはこのエクスポート機能が搭載されていないため、出力方法が必要です。

MT4からエクスポートしたデータは、ExcelやPythonで多様な分析に活用可能です。Excelを使用すると時系列分析や基本的な統計指標の計算が手軽に行え、データをグラフ化することで視覚的に理解を深めやすくなります。また、Pythonを使えばより詳細な解析が可能で、「TA-Lib」などのライブラリを用いることで、KAMAやMAMAといった高度なテクニカルインジケーターを使用したテクニカル分析が実現できます。

MT5で四本値(始値、高値、安値、終値)とボリュームをCSVで書き出す方法
今回は、MT5で四本値とボリュームをCSVで書き出す方法について解説します。
MT5やMT4ではボリュームとしてティックボリュームが提供されているため、実際の取引量ではなく「ティック数」を示している点に注意が必要です。

input datetime Start = D'2024.01.01 00:00'; // 開始日時
input datetime End = D'2024.1.31 23:59';   // 終了日時

void OnInit()
   {
   // 出力ファイル名 通貨ペア 期間 拡張子
   string FileName = (string)_Symbol + "_" + (string)_Period + ".csv";

   // ファイルを開く
   int Handle = FileOpen(FileName, FILE_WRITE | FILE_CSV | FILE_ANSI);

   // CSVのヘッダー書き込み
   FileWrite(Handle, "Time,Open,High,Low,Close,Volume");

   // ヒストリカルデータ格納用変数を配列で宣言
   MqlRates rates[];

   // rates変数にヒストリカルデータをコピー
   int bars = CopyRates(_Symbol, _Period, Start, End, rates);

   // ファイルの書き込み
   for(int i = 0; i < bars; i++)
      {
      FileWrite(Handle,
                StringFormat("%s,%f,%f,%f,%f,%d",
                             TimeToString(rates[i].time, TIME_DATE | TIME_MINUTES),
                             rates[i].open,
                             rates[i].high,
                             rates[i].low,
                             rates[i].close,
                             rates[i].tick_volume));
      }
   // 終了処理
   FileClose(Handle);
   Print("作成完了:ファイル(F) -> データフォルダーを開く(D) MQL5 / Files /" + FileName);
   ExpertRemove();
   }
                    

特定のタスクやアクションを一度だけ実行したい場合には、スクリプトを使用します。
しかし、スクリプトではinputのようなパラメーター変更ができないため、今回のコードはEAとして作成しました。

出力するファイル名は通貨ペア名と時間足で構成しています。
MT5の時間足はMT4と異なり、単純な「分」の数で表されていません。
分単位(M1~M30)は分の数で表されますが、時間足や日足(H1~D1)は「16384+時間」、週足は32769、月足は49153といった数字になります。
その理由は二進数に変換するとわかりやすくなります。最初の2桁で分、時間、週、月を管理しているからです。

例)

M10000 0000 0000 0001 = 1
H10100 0000 0000 0001 = 16385 (16384 + 1)
D10100 0000 0001 1000 = 16408 (16384 +24)
W11000 0000 0000 0001 = 32769 (32768 + 1)
M11100 0000 0000 0001 = 49153 (49152 + 1)

時間換算表

td>M30 240 16388

MT4MT5
M111
M22
M33
M44
M555
M66
M1010
M1212
M151515
M2020
3030
H16016385
H216386
H316387
H4
H616390
H816392
H1216396
Daily14416408
Weekly1008032769
Monyhly4320049153

MQL5の特徴的な使い方として、MqlRates構造体でrates[]配列を宣言し、CopyRates()関数を使用してfrom_dateからto_dateまでの四本値とボリュームをすべて配列に代入しています。
MqlRates構造体は以下のメンバーになります。

struct MqlRates
 {
  datetime time;
  double   open;
  double   high;
  double   low;
  double   close;
  long     tick_volume;
  int     spread;
  long     real_volume;
 };

                    

CSVの作成には行数の制限がないため、時間はかかりますが、20年分の1分足データのような大量のデータでも書き込むことが可能です。AccessやPower Query、Pythonではそのまま扱えますが、Excelには約104万行の上限があるため、上限を超える場合は新しいデータが読み込まれません。特に、長期間の1分足や5分足データでは上限を超えることがあるため注意が必要です。

今回のコード例では、MT5で四本値とティックボリュームをCSVに出力する方法と、MT5の時間足の数字がMT4とは異なる設計である理由について解説しました。MQL5では構造体の配列に過去データを一括で代入できるため、使い方を理解すれば、MQL4よりも非常に簡単に扱えます。本記事が、MT4からMT5への移行や活用のための実践的な手引きとして、読者の取引環境の改善に役立つことを願っています。

執筆者紹介

林貴晴

林 貴晴(AMSER株式会社代表取締役)

内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役。