MQL5でCSVを読み込む方法|1列ずつ読む

MQL5でCSVを読み込むには、FileOpen に FILE_READ|FILE_CSV と区切り文字(カンマなら ',')を指定し、FileReadString を1回呼ぶごとに1列ずつ読みます。行の終わりは FileIsLineEnding、ファイルの終わりは FileIsEnding で見分けます。

読めない時に多いのは、ファイルの置き場所(MQL5\Files の外は読めない)と、文字コードの指定(FILE_ANSI か FILE_UNICODE か)の2つです。

(確認環境:MetaTrader 5 / Windows 11。関数の仕様は MQL5 公式リファレンス、コードは MetaEditor でコンパイルできることを確認しています)

読み込みの基本形

例として、1行目が見出しで、2行目から「通貨ペア,時間足,番号,種類,時刻,足の位置,価格」が並ぶCSVを読みます(当サイトの ZigZag の書き出しと同じ列です)。

void ReadCsv(const string fileName)
  {
   // MQL5\Files\ からの相対パス。カンマ区切り・ANSI(Shift_JIS等)として読む
   int h = FileOpen(fileName, FILE_READ | FILE_CSV | FILE_ANSI, ',');
   if(h == INVALID_HANDLE)
     {
      Print("開けませんでした: ", fileName, " エラー: ", GetLastError());
      return;
     }
   // 1行目(見出し)を読み飛ばす
   do
      FileReadString(h);
   while(!FileIsLineEnding(h) && !FileIsEnding(h));

   int rows = 0;
   while(!FileIsEnding(h))
     {
      string   symbol = FileReadString(h);
      string   tf     = FileReadString(h);
      long     seq    = StringToInteger(FileReadString(h));
      string   type   = FileReadString(h);
      datetime time   = StringToTime(FileReadString(h));
      long     shift  = StringToInteger(FileReadString(h));
      double   price  = StringToDouble(FileReadString(h));
      rows++;
      PrintFormat("%s %s #%d %s %s %.5f", symbol, tf, (int)seq, type, TimeToString(time), price);
     }
   FileClose(h);
   Print("読み込んだ行数: ", rows);
  }

ポイントは3つです。

  • FileReadString は区切り文字まで読む:公式リファレンスでは、CSVの時は「現在の位置から最も近い区切り文字、またはテキストの終わりまで」読むとされています。1行を丸ごと読む関数ではありません
  • 数値も文字として読んでから変換する:StringToInteger・StringToDouble・StringToTime で変換します(数値専用の FileReadNumber もあります)
  • 列の数を固定で読む:上の例は1行7列を前提にしています。列数が行によって違うCSVでは、FileIsLineEnding で行の終わりを確かめながら読みます

読めない時の確認

1. ファイルの置き場所

MQL5のプログラムが読めるのは、原則としてデータフォルダの MQL5\Files\ の中だけです(テスターでは別の場所になります)。FileOpen に書くのは、このフォルダからの相対パスです。サブフォルダの中なら "ZigZagExports\\ファイル名.csv" のように \\ で区切ります。

複数のMT5で共有したいファイルは、FILE_COMMON を付けると、共通フォルダ(Terminal\Common\Files)を使います。データフォルダの場所は MT5 で Ctrl+Shift+D を押すと開けます。

2. 文字コード

CSVの作り方 指定するフラグ
エクセルで「CSV(コンマ区切り)」で保存(日本語版) FILE_ANSI
MQL5で FILE_ANSI を付けて書き出した FILE_ANSI
MQL5でフラグを付けずに書き出した(既定は Unicode) 何も付けない(FILE_UNICODE)

書き出した側と同じ指定にしないと、文字化けしたり、1文字目から読めなかったりします。FILE_ANSI で開くと、読んだ文字は Unicode に変換されます(公式リファレンス)。書き出し側の指定はMQL5でCSVを出力する方法、文字化けの見分け方はMT5でCSVが出力されない・文字化けする原因にまとめています。

3. 区切り文字

FileOpen の4つ目の引数を省略すると、区切りはタブになります。カンマ区切りのCSVなら ',' を必ず指定します。

4. 他のソフトで開いたまま

エクセルでCSVを開いたままだと、MQL5から開けないことがあります。エラー番号を見て、閉じてからもう一度試します。

読み込んだデータの使い道

外で作ったCSVをEAやインジケーターに読ませると、次のようなことができます。

  • 自分で決めた価格帯や時間帯の一覧を読み込み、チャートに線を引く
  • 過去に書き出した山と谷(ZigZag)の一覧を読み、押し目の深さを集計する
  • 取引の記録を読み、時間帯ごとの成績を出す

ZigZag の山と谷をCSVにする方法はMT5のZigZagをCSVに出力する方法にあります。当サイトのZigzagColor_csv(¥3,400)は、確定した山と谷だけを上の例と同じ列でCSVに書き出すインジケーターです。読み込んだ後の集計は、PythonならZigZagのCSVをPythonで集計する、エクセルなら波の大きさを時間足ごとに集計するで紹介しています。

まとめ

  • FileOpen(名前, FILE_READ|FILE_CSV|FILE_ANSI, ',') で開き、FileReadString で1列ずつ読む
  • 行の終わりは FileIsLineEnding、ファイルの終わりは FileIsEnding
  • 置き場所は MQL5\Files の中。文字コードと区切り文字を書き出し側と合わせる