MQL5でCSVを出力する方法|FileWriteの既定はタブ区切り

MQL5でCSVを書き出す流れはFileOpen → FileWrite → FileCloseの3つだけです。ただし、この3行を書けてもExcelで開くと文字化けしたり、列が分かれなかったりします。

原因は2つの既定値です。①区切り文字を省略するとカンマではなくタブになる ②FILE_ANSI を指定しないとUnicodeで書かれる。どちらもMQL5公式リファレンスに明記されています。

(確認環境:MetaTrader 5 / Windows 11)

最小のコード

int h = FileOpen("out.csv", FILE_WRITE|FILE_CSV|FILE_ANSI, ',');
if(h == INVALID_HANDLE)
  {
   Print("open失敗 err=", GetLastError());
   return;
  }

FileWrite(h, "time", "close");
FileWrite(h, TimeToString(iTime(_Symbol,_Period,1)),
             DoubleToString(iClose(_Symbol,_Period,1), _Digits));

FileClose(h);

FileClose を忘れると、内容が書き込まれないまま終わることがあります。途中でreturnする経路を作る時は特に注意してください。

🔴 罠①:区切り文字の既定はタブ

公式リファレンスには「区切り文字が指定されない場合、既定はタブになる」と書かれています。

つまり FileOpen("out.csv", FILE_WRITE|FILE_CSV) と書くと、拡張子が .csv でも中身はタブ区切りになります。Excelで開くと全部が1列に入った状態になります。

カンマ区切りにしたいなら、第3引数に明示的に ',' を渡してください。

🔴 罠②:FILE_ANSI を付けないとUnicodeになる

MQL5のファイル関数は、FILE_ANSI が無ければテキストをUnicodeとして扱います。

指定 書き出される形式 Excelで開くと
FILE_ANSI あり 1バイト文字 そのまま開ける
指定なし Unicode(UTF-16) 環境によって化ける・1列になる

日本語を含まない数値だけのCSVなら FILE_ANSI が扱いやすく、日本語のラベルを入れるなら受け取る側の設定と合わせる必要があります。どちらが正しいかではなく、開く側に合わせると考えてください。

出力したCSVが開けない・化ける場合の切り分けはMT5でCSVが出力されない・文字化けする原因にまとめています。

🔴 罠③:double をそのまま渡すと桁が暴れる

公式リファレンスによると、double型は小数点以下16桁の精度で出力され、値によっては指数表記になります。

価格を FileWrite(h, price) とそのまま渡すと、150.1230000000000047 のような値が並びます。

対策は自分で文字列にしてから渡すことです。

FileWrite(h, DoubleToString(price, _Digits));

_Digits はその銘柄の小数点以下の桁数です。銘柄仕様に合わせた桁で揃うため、後から集計する時に扱いやすくなります。

保存先は3か所ある

条件 保存先
通常 MQL5\Files
FILE_COMMON を指定 全MT5で共有されるフォルダ
ストラテジーテスターで実行 テストエージェント側のフォルダ

3行目が見落とされます。バックテスト中に書き出したCSVは、いつもの MQL5\Files には出てきません。「出力されない」と思っている時、実際には別の場所に出ています。

通常のフォルダは、MT5の「ファイル」→「データフォルダを開く」から辿れます。

なお、MQL5から書き込めるのはこのフォルダの中だけです。デスクトップなど任意の場所を指定しても書き込めません。

追記したい場合

FILE_WRITE だけを指定すると、既存の内容は消えて上書きされます。追記したい時は FILE_READ|FILE_WRITE で開いてから、末尾へ移動します。

int h = FileOpen("out.csv", FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI, ',');
FileSeek(h, 0, SEEK_END);

FileSeek を忘れると先頭から上書きされます。ログのように貯めていく用途では必ず入れてください。

何を書き出すと役に立つか

画面を目で数える検証は、本数が増えるほど破綻します。判定に使っている値をそのまま書き出して、表計算で数えた方が早く、再現もできます。

実際にZigZagの高値・安値をCSVにして検証する例はMT5のZigZagをCSVに出力する方法にまとめています。この指標には、書き出した値が後から変わるという固有の注意点があります。

スクリプトとして1回だけ実行する形にする場合はMT5のスクリプトとEAの違いを参照してください。

まとめ

  1. 流れは FileOpen → FileWrite → FileClose
  2. 🔴 区切り文字の既定はタブ。カンマにするなら第3引数で明示する
  3. 🔴 FILE_ANSI が無いとUnicodeで書かれる
  4. 🔴 double は小数点以下16桁で出る。DoubleToString で桁を揃える
  5. テスター実行時の保存先はテストエージェント側。いつもの場所には出ない

書き出す元になる足データの取り方はMQL5で足データを取得する方法にまとめています。取引履歴を画面側から書き出す場合はMT5の取引履歴を書き出す方法が早いです。

書き出したCSVを、反対にMQL5で読み込む方法はMQL5でCSVを読み込む方法にまとめています。

本記事はMQL5の仕様と実装方法を説明したものであり、特定の売買を推奨するものではありません。仕様はビルドによって変わる可能性があります。投資判断はご自身の責任で行ってください。