English

MQL5の書き方(for MQL4デザイナー)

 

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桁で分、時間、週、月を管理しているからです。

例)

M1 0000 0000 0000 0001 = 1
H1 0100 0000 0000 0001 = 16385 (16384 + 1)
D1 0100 0000 0001 1000 = 16408 (16384 +24)
W1 1000 0000 0000 0001 = 32769 (32768 + 1)
M1 1100 0000 0000 0001 = 49153 (49152 + 1)
 

時間換算表

td>M30 240 16388
  MT4 MT5
M1 1 1
M2   2
M3   3
M4   4
M5 5 5
M6   6
M10   10
M12   12
M15 15 15
M20   20
30 30
H1 60 16385
H2   16386
H3  16387
H4
H6   16390
H8   16392
H12   16396
Daily 144 16408
Weekly 10080 32769
Monyhly 43200 49153

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株式会社代表取締役。