MT5でCSVが出力されない・文字化けする原因|保存先と文字コード

MT5でCSVが「出力されない」ときは、ほとんどが保存先の勘違いです。バックテスト中の出力は MQL5\Files ではなく、テスターのエージェントフォルダに書かれます。

「文字化けする」ときは、FileOpen で文字コードを指定しなかったためにUTF-16で書かれています。ファイル自体は壊れていません。

この記事では、2つの症状を切り分ける手順とそれぞれの直し方を扱います。確認環境:MetaTrader 5(Windows 11)/確認日 2026年9月1日。

症状は2つに切り分けられる

「CSVがおかしい」と感じたとき、原因はほぼこの2つのどちらかです。まずどちらかを判定してから手を動かしてください。

MT5のCSV出力でよくある2つの症状と原因
症状 原因 直す場所
ファイルが見つからない 保存先が想定と違う(特にバックテスト時) 探す場所を変える
開くと文字化けする UTF-16で書かれている 書く側か読む側のどちらか

「出力されない」と思っていたものが、実は別の場所に出ていただけ、というのが最も多いパターンです。先にこちらから確認します。

症状1:ファイルが見つからない — 保存先は1箇所ではない

MQL5はファイル操作をサンドボックスで制限しています。公式ドキュメントには次のように書かれています。

セキュリティ上の理由から、MQL5 言語ではファイルの扱いは厳しく制御されています。MQL5 手段を用いて操作されるファイルは、ファイルサンドボックスの外に存在することは出来ません。

出典:MQL5リファレンス「ファイル操作」 https://www.mql5.com/ja/docs/files

つまり、書き出し先は決められた場所にしかなりません。問題はその「決められた場所」が1つではないことです。

通常実行時の保存先

チャートに載せたインジケーターやEAが書き出す先は、ターミナルのデータフォルダ配下です。

  1. MT5のメニューから「ファイル」→「データフォルダを開く」を選ぶ
  2. 開いたフォルダの中の MQL5Files を開く

エクスプローラーでCドライブを探しても見つからないのは、このフォルダがユーザープロファイル配下の分かりにくい場所にあるためです。パスを手で入力せず、必ずこのメニューから開いてください。

MT5のファイルメニューで「データフォルダを開く」を選択している画面
MT5の「ファイル」→「データフォルダを開く」。パスを手で入力せず、必ずここから開く。
MQL5\Files 配下のZigZagExportsフォルダに出力されたCSVファイルを表示したエクスプローラー
通常実行時の出力先。MQL5\Files の配下にCSVが書き出されている。

バックテスト実行時の保存先(ここが最も多い原因)

ストラテジーテスターで動かしたときの出力は、上の MQL5\Files には書かれません。テスターは専用のエージェントプロセスで動いており、そのエージェントが自分のフォルダを持っているためです。

実機で確認したところ、ターミナルフォルダの直下に次のディレクトリが存在していました(2026年9月1日確認)。

<ターミナルフォルダ>\Tester\Agent-127.0.0.1-3000\MQL5\Files

Agent- の後ろはIPアドレスとポート番号で、環境によって変わります。エージェントを複数使う設定にしていると、このフォルダも複数できます。どのエージェントが処理したかで出力先が変わるため、全部のエージェントフォルダを見てください。

「コードは正しいのに何も出力されない」の大半はこれです。ファイルは書かれていて、見ている場所が違うだけです。

TesterフォルダのAgent-127.0.0.1-3000の中に、ターミナルとは別のMQL5フォルダがあることを示すエクスプローラー
バックテスト時の出力先。Tester\Agent-<IP>-<ポート>\ の下に、ターミナル直下とは別のMQL5フォルダがある。

なお、この「テスター実行時はエージェント配下に書かれる」という挙動は、上で引用したMQL5公式の「ファイル操作」ページには記載がありません。この記事の記述は実機でディレクトリの存在を確認した結果に基づくもので、公式ドキュメントの引用ではありません。

コードから保存先を確定させる

探すより、コードに出力させたほうが確実です。TerminalInfoString でデータフォルダのパスを取得できます。

// 実行中のプロセスが使っているデータフォルダを出す
Print("data path = ", TerminalInfoString(TERMINAL_DATA_PATH));
Print("common path = ", TerminalInfoString(TERMINAL_COMMONDATA_PATH));

これをバックテストで走らせると、エージェント側のパスが表示されます。推測で探すより速く、環境が変わっても通用します。

複数のMT5から同じファイルを読ませたい場合は、共通フォルダを使う手もあります。FileOpenFILE_COMMON を足すと、上の common path の側へ書かれます。

症状2:開くと文字化けする — 既定はUTF-16

ファイルは見つかったのに、Excelやテキストエディタで開くと日本語が壊れている、あるいは1文字ごとに空白が挟まったように見える。これはUTF-16で書かれたファイルを、UTF-8のつもりで開いている状態です。

なぜUTF-16になるのか

原因は FileOpen のフラグ指定です。MQL5公式ドキュメントの「入出力定数」には次のように書かれています。

FILE_UNICODE と FILE_ANSI のどちらもが指定されない場合には、FILE_UNICODE が暗示されます。

FILE_CSV、FILE_BIN、FILE_TXT の 1 つも指定されない場合には、FILE_CSV が暗示されます。

出典:MQL5リファレンス「入出力定数」 https://www.mql5.com/ja/docs/constants/io_constants/fileflags

つまり FILE_ANSI を書かない限り、黙っていると2バイト文字(UTF-16)で書き出されます。「文字コードを指定していないからASCIIで出る」ではなく、「指定しないとUTF-16になる」が正解です。ここが直感と逆なので引っかかります。

実際のファイルの先頭バイトを見る

推測せずに、ファイルの先頭を見れば確定します。当サイトで開発しているインジケーターが出力しているファイルを実際に調べた結果です(2026年9月1日確認)。

同一のMT5環境から出力された2つのファイルの先頭バイト
ファイル 先頭バイト 意味
インジケーターが出力した台帳(.jsonl) FF FE 7B 00 UTF-16LE。FF FE がBOM、7B 00{
別の処理が出力したログ(.txt) 32 30 32 36 BOMなし。2026 という文字がそのまま1バイトずつ

同じMT5環境の中で、UTF-16のファイルとANSIのファイルが混在していました。書き出しているコードのフラグ指定が違うためです。「MT5の出力は全部UTF-16」でも「全部UTF-8」でもありません。ファイルごとに違います。だから毎回先頭バイトを見るのが早いのです。

先頭が FF FE ならUTF-16LE、EF BB BF ならUTF-8(BOM付き)、どれでもなければBOMなしです。

直し方は2つある

書く側を変える場合:FileOpenFILE_ANSI を明示します。自分が書いたコードなら、こちらが素直です。

// 文字コードを明示する。省略するとUTF-16になる
int handle = FileOpen("output.csv",
                      FILE_WRITE | FILE_CSV | FILE_ANSI,
                      ',');

読む側を変える場合:配布されているインジケーターの出力など、コードを触れない場合はこちらです。読み込み時に文字コードを指定します。

# PowerShell の場合。UTF-16LE は Unicode を指定する
Get-Content -Path "signal_history.jsonl" -Encoding Unicode

Excelで開く場合は、拡張子をダブルクリックせず、「データ」タブの「テキストまたはCSVから」で読み込み、文字コードに UTF-16 LE を指定してください。

当サイトでは、開発中のインジケーターが出力する台帳をこの方法で読んでいます。集計スクリプトで文字コードの指定を忘れると、中身が空に見えたり、1行も読めなかったりします。ファイルが壊れたと思って作り直す前に、まず読み方を疑ってください。

3ステップで切り分ける

  1. 通常実行かバックテストかを確認する。バックテストなら Tester\Agent-*\MQL5\Files を見る
  2. それでも無ければ、コードに TerminalInfoString(TERMINAL_DATA_PATH) を仕込んでパスを出力させる。推測で探さない
  3. ファイルがあるのに読めないなら、先頭バイトを確認する。FF FE ならUTF-16LEとして開く

ほとんどは1と3で解決します。2まで進む場合は、共通フォルダ(FILE_COMMON)を使っていないかも確認してください。

それでも直らない場合

  • ファイルが0バイトのまま:FileClose を呼んでいない可能性があります。書き込みはバッファに溜まるため、閉じるまで実体が書かれないことがあります。処理の途中で内容を確定させたい場合は FileFlush を使います
  • ハンドルが INVALID_HANDLE になる:パスにサンドボックス外を指定していないか確認してください。絶対パスは通りません
  • 列がずれる:FileOpen の第3引数の区切り文字と、読む側の設定が一致しているか確認します。省略時はタブ区切りとして扱われる点に注意してください
  • そもそもコンパイルが通っていない:古いコンパイル済みファイルが動いている可能性があります。MQL5のコンパイルエラーが消えない時に見る順番と、MT5にカスタムインジケーターを導入してコンパイルする手順を確認してください

この記事で確認していないこと

  • 他ブローカー・他ビルドでの再現。実機確認は1環境(Windows 11)のみです。エージェントフォルダの名前の付き方はビルドで変わる可能性があります
  • Wine/macOS環境での挙動。確認していません
  • テスター実行時の保存先についての公式な記述。MQL5公式の「ファイル操作」ページには記載がなく、実機での確認結果に基づいています

関連記事

出力そのものを作るのが面倒な場合

ここまでは自分でコードを書く前提の話です。目的が「ZigZagの高値・安値をデータとして取り出すこと」なら、出力側を自作する必要はありません。

当サイトで配布している ZigZagのCSV出力は、列構成と保存先を決め打ちにしてあるため、この記事で扱った保存先と文字コードの問題を踏まずに済みます。逆に、出力の形を自分で設計したい場合や、ZigZag以外の値が欲しい場合は、この記事の方法で自作するほうが早いです。

参照した公式ドキュメント

すべて2026年9月1日に確認しました。