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

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

MQL5のFileWrite関数は、開いたファイルにデータを書き込むための関数です。主にCSV形式などのテキストベースのファイルを作成する際に使用されます。

実務レベルの開発において、この関数は単なる「記録用」に留まりません。例えば、以下の用途で頻繁に活用されます。

  • 独自ログの作成: 標準のターミナルログでは追いきれない、複雑なロジックの判定プロセスを詳細に記録する。
  • バックテスト結果の外部出力: ストラテジーテスターの結果をCSV化し、PythonやExcelで高度な統計分析(ポートフォリオ最適化など)を行う。
  • 機械学習用の教師データ作成: テクニカル指標の値と、その後の価格変動の結果をセットで出力し、学習用データセットを構築する。

初心者が特につまずきやすいのは、「ファイルを開く(FileOpen)→書き込む(FileWrite)→閉じる(FileClose)」という一連のフローを忘れてしまう点や、MQL5特有の「サンドボックス規制(指定のフォルダ以外には保存できない)」という仕様です。この関数の基本を抑えることは、堅牢なトレードシステム構築への第一歩となります。

2. 構文と戻り値

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

uint FileWrite(
   int           file_handle,   // ファイルハンドル
   ...                          // 書き込むデータ(カンマ区切りで複数指定可能)
   );

パラメーター

  1. file_handle: FileOpen関数によって返された、操作対象ファイルのID(ハンドル)です。
  2. … (可変引数): ファイルに書き込みたい任意のデータ(int, double, stringなど)をカンマ区切りで並べます。FILE_CSVフラグでファイルを開いている場合、これらのデータは自動的に区切り文字(通常はカンマ)で区切られて書き込まれます。

戻り値

  • uint型: 書き込みに成功した場合は「書き込まれたバイト数」が返されます。
  • 書き込みに失敗した場合は 0 が返されます。エラーの詳細は GetLastError() 関数で確認できます。

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

以下のコードは、新規注文(成行買い)が約定した際に、その時の価格や時刻をCSVファイルに記録するシンプルなEAの例です。

//+------------------------------------------------------------------+
//|                                              TradeLogger_Sample  |
//|                               Copyright 2023, Quant Engineer JP  |
//+------------------------------------------------------------------+
#property strict

// トレード履歴を保存するファイル名
string fileName = "TradeHistory.csv";

//--- 注文約定時に呼び出される(簡易的なデモ用)
void OnTick()
{
   // 本来はPositionSelectなどで判定するが、今回はFileWriteの例示のため
   // 特定の条件(例:1分足の開始時など)で1度だけ実行する想定
}

// 独自のログ書き込み関数
void LogTrade(string symbol, string type, double price)
{
   // 1. ファイルを開く(FILE_WRITE: 書き込み、FILE_CSV: CSV形式、FILE_READ: 既存データ保持のため)
   // FILE_COMMONを指定しない場合、MQL5/Files フォルダ内に保存されます
   int fileHandle = FileOpen(fileName, FILE_WRITE|FILE_CSV|FILE_READ|FILE_ANSI, ',');

   if(fileHandle != INVALID_HANDLE)
   {
      // ファイルの末尾に移動(追記モード)
      FileSeek(fileHandle, 0, SEEK_END);

      // 2. データの書き込み
      // 時刻、通貨ペア、売買種別、価格を一行に書き込む
      uint bytesWritten = FileWrite(fileHandle, 
                                    TimeCurrent(), 
                                    symbol, 
                                    type, 
                                    DoubleToString(price, _Digits));

      if(bytesWritten > 0)
      {
         Print("ログ記録成功: ", fileName);
      }
      else
      {
         Print("書き込み失敗。エラーコード: ", GetLastError());
      }

      // 3. ファイルを閉じる(※必須)
      FileClose(fileHandle);
   }
   else
   {
      Print("ファイルオープン失敗。エラーコード: ", GetLastError());
   }
}

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

  1. サンドボックス制限: MQL5はセキュリティ上の理由から、PC内のどこにでもファイルを保存できるわけではありません。通常は Terminal/MQL5/Files フォルダ内に限定されます。共通のデータフォルダを使用したい場合は FILE_COMMON フラグを検討してください。
  2. 型変換の自動処理: FileWrite は数値を文字列に変換して書き込みますが、小数点以下の桁数を厳密に管理したい場合は、あらかじめ DoubleToString() 関数で文字列に変換してから渡すのがベストプラクティスです。
  3. CSVの区切り文字: FileOpen 時に指定した区切り文字(デリミタ)と、FileWrite で渡す引数の関係を意識してください。通常はカンマ(,)を使用しますが、欧州圏の設定ではセミコロン(;)が使われることもあります。
  4. ファイルハンドルの放置: FileClose を忘れると、他のプログラム(Excelなど)からファイルを開けなくなったり、メモリリークの原因になったりします。

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

アルゴリズムトレードにおいて、FileWriteで正確なログを残すことは重要ですが、それ以上に重要なのが「実行環境」です。どれほど洗練されたMQL5コードを書いても、自宅のPCや一般的な光回線で運用している限り、物理的なネットワーク遅延(レイテンシ)からは逃れられません。プロの現場では、証券会社のサーバーと同じデータセンター内、あるいは極めて近い距離にある専用のVPS(仮想専用サーバー)を利用するのが常識です。

ネットワークの遅延は、数ミリ秒の差で有利な価格を逃し、スリッページを増大させます。特にボラティリティが高い局面では、自宅環境とVPS環境で利益率に致命的な差が生まれることも珍しくありません。バックテストでは勝てているのにリアル口座で勝てない原因の多くは、ロジックではなくこの「約定スピード」にあります。極限までエッジを追求するなら、24時間安定稼働し、低レイテンシを実現するトレード専用VPSの導入は、もはや投資コストではなく必須のインフラと言えるでしょう。

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

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

コメント

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