【MQL5】FileWriteString関数の使い方と自動売買実装コード

1. FileWriteString関数の概要と実務での活用法

MQL5の FileWriteString 関数は、開いているファイルに対して「文字列(string型)」を直接書き込むための関数です。

実務開発において、この関数は単なるテキスト出力以上の重要な役割を担います。例えば、自作EAの挙動を詳細に残す「独自ログの生成」、PythonやRなどの外部ツールで分析するための「価格データのCSVエクスポート」、あるいは「複数EA間でのステータス共有」などが代表的な活用例です。

初心者が特につまずきやすいのは、「ファイルを開く(FileOpen)→ 書き込む(FileWriteString)→ 閉じる(FileClose)」という一連の作法を忘れてしまう点です。また、MQL5には「サンドボックス構造」というセキュリティ上の制約があり、ファイル操作ができる場所が厳格に決まっている点も、実務レベルでは必ず押さえておくべき知識となります。


2. 構文と戻り値

FileWriteString 関数の基本構文は以下の通りです。

uint  FileWriteString(
   int           file_handle,    // ファイルハンドル
   string        text_string,    // 書き込む文字列
   int           length = -1     // 書き込む文字数(省略時は全文字)
   );

パラメーターの解説

  1. file_handle: FileOpen 関数によって返されたファイル識別番号(ハンドル)を指定します。
  2. text_string: ファイルに書き込みたい文字列を入力します。
  3. length: 書き込む文字数を制限したい場合に指定します。デフォルトの -1 は「文字列の末尾まで全て書き込む」ことを意味し、通常はこのまま使用します。

戻り値

書き込みに成功すると、実際に書き込まれたバイト数uint 型で返します。書き込みに失敗した場合は 0 が返されます。エラーの詳細は GetLastError() 関数で確認可能です。


3. 具体的な使い方・実践サンプルコード

以下のサンプルコードは、EAが動作している時に特定の条件(ここでは単純にTick毎)で、ファイルに日時と価格を記録する実用的なスクリプトです。

//+------------------------------------------------------------------+
//|                                              SampleFileWrite.mq5 |
//+------------------------------------------------------------------+
void OnTick()
{
   string fileName = "TradeLog.csv";
   string logText = TimeToString(TimeCurrent()) + "," + DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits) + "\n";

   // 1. ファイルを開く(FILE_WRITE:書き込み, FILE_TXT:テキストモード, FILE_SHARE_READ:他アプリの読み取り許可)
   // 既にあるファイルに追記する場合は、FILE_READ も組み合わせて FileSeek で末尾へ移動するのが一般的です。
   int fileHandle = FileOpen(fileName, FILE_WRITE | FILE_READ | FILE_TXT | FILE_SHARE_READ);

   if(fileHandle != INVALID_HANDLE)
   {
      // 2. ファイルの末尾に移動(追記の準備)
      FileSeek(fileHandle, 0, SEEK_END);

      // 3. 文字列を書き込む
      uint bytesWritten = FileWriteString(fileHandle, logText);

      if(bytesWritten > 0)
      {
         // 成功時の処理(デバッグ用)
         // Print("書き込み成功: ", bytesWritten, " bytes");
      }

      // 4. ファイルを必ず閉じる(忘れるとファイルがロックされます)
      FileClose(fileHandle);
   }
   else
   {
      Print("ファイルオープン失敗 エラーコード: ", GetLastError());
   }
}

このコードでは、FileSeek を使ってファイルの末尾に移動してから書き込むことで、ログをどんどん「追記」していく形にしています。


4. 使用上の注意点とよくあるエラー

① 書き込み先の「サンドボックス」制限

MQL5では、セキュリティの観点からファイルの読み書きができる場所が制限されています。基本的には MQL5\Files フォルダ内(またはそのサブフォルダ)に限定されます。デスクトップやドキュメントフォルダなど、任意の場所に直接書き込むことはできませんので注意してください。

② エンコーディング(ANSI vs Unicode)

FileOpen 時に FILE_ANSI フラグを付けるか、FILE_UNICODE フラグを付けるかで、書き込まれるデータのサイズが変わります。
FILE_ANSI: 1文字1バイト(日本語などは文字化けの可能性あり)
FILE_UNICODE: 1文字2バイト(日本語も安全に扱えるが、外部ツールで開く際に注意が必要)

③ ファイルハンドルの閉じ忘れ

FileClose を忘れると、MT5がそのファイルを掴みっぱなしになり、手動で削除したり別のEAからアクセスしたりできなくなります。特にループ処理の中で FileOpen を多用する場合は、必ず対になる FileClose を記述する癖をつけましょう。


5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムトレーダーとして FileWriteString でログを精密に取ることは重要ですが、どれほど優れたロジックを組んでも、実行環境が貧弱であればすべてが台無しになります。多くの初心者が陥る罠は、自宅のPCや一般的なWi-Fi環境でEAを稼働させてしまうことです。自宅PCからの注文は、物理的な距離による「ネットワーク遅延(レイテンシ)」が大きく、MT5上で注文ボタンが押されてからブローカーのサーバーに届くまでに、コンマ数秒のタイムラグが発生します。

このわずかな遅延の間に価格が滑り(スリッページ)、バックテストでは勝てていたはずのロジックが、リアル口座では損失を積み上げる原因となります。プロのクオンツや専業トレーダーにとって、ブローカーのデータセンターに物理的に近い場所にある「専用のVPS(仮想専用サーバー)」を利用することは、もはやオプションではなく必須条件です。約定スピードを極限まで高め、安定した24時間稼働を実現して初めて、あなたのコードはその真価を発揮します。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました