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

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

MQL5のFileCopy関数は、指定したファイルをある場所から別の場所へコピーするための関数です。一見地味な関数ですが、実務レベルのEA(エキスパートアドバイザー)開発においては、システムの堅牢性を高めるために非常に重要な役割を果たします。

実務での主な活用シーン:
* ログのローテーションとバックアップ: 定期的に設定ファイルや取引記録を別名で保存し、不測の事態(メタトレーダーのクラッシュやデータの破損)に備えます。
* 共通データフォルダの利用: 複数のMT5ターミナル間でデータを共有したい場合、FILE_COMMONフラグを利用して共通フォルダへファイルをコピーし、他のEAから参照可能にします。
* 計算負荷の分散: 重い計算結果を出力したファイルを、分析用ツールが読み取れる場所にコピーして連携させます。

初心者の方は「ファイルを上書きしようとしてエラーになる」「そもそもファイルがどこにコピーされたか分からない」という点に陥りがちです。これは、MQL5の「サンドボックス(隔離環境)」というセキュリティ上の仕組みが関係しています。

2. 構文と戻り値

FileCopy関数の基本的な構文は以下の通りです。

bool FileCopy(
   const string  src_name,      // コピー元のファイル名
   int           common_flag,   // 場所を指定するフラグ(0 または FILE_COMMON)
   const string  dst_name,      // コピー先のファイル名
   int           mode_flags     // コピーモードのフラグ
);

パラメーター解説

  1. src_name: コピーしたい元のファイル名です。
  2. common_flag:
    • 0: 各ターミナルのデータフォルダ(MQL5\Files)内を指します。
    • FILE_COMMON: 全てのMT5で共有される共通フォルダ(Common\Files)を指します。
  3. dst_name: 新しく作成されるコピー後のファイル名です。
  4. mode_flags:
    • FILE_REWRITE: コピー先に同名のファイルがある場合、上書きします。このフラグを指定しない場合、同名ファイルがあるとコピーは失敗します。

戻り値

  • 成功した場合は true、失敗した場合は false を返します。失敗の理由は GetLastError() 関数で詳細を確認できます。

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

以下は、EAの設定ファイル(CSV)をバックアップとして別名保存する、実用的なコード例です。

void BackupSettings()
{
   string sourceFile = "EA_Settings.csv";
   string backupFile = "Backup/EA_Settings_Backup.csv";

   // コピー先のディレクトリが存在しない場合、MQL5は自動的に作成しません。
   // フォルダ作成が必要な場合は事前にFolderCreate等を行う必要がありますが、
   // ここではシンプルにファイル直下のコピーを想定します。

   // 1. ファイルをコピー(上書き許可設定)
   if(FileCopy(sourceFile, 0, backupFile, FILE_REWRITE))
   {
      Print("バックアップ成功: ", sourceFile, " -> ", backupFile);
   }
   else
   {
      // 失敗した場合はエラーコードを確認
      int errorCode = GetLastError();
      Print("バックアップ失敗。エラーコード: ", errorCode);

      // よくあるエラー:
      // 4015: ERR_FILE_IS_DIRECTORY (指定がディレクトリ)
      // 5002: ERR_FILE_NOT_FOUND (元のファイルがない)
      // 5003: ERR_FILE_EXISTS (上書きフラグがないのにファイルが存在する)
   }
}

void OnDeinit(const int reason)
{
   // EA終了時に設定ファイルをバックアップする運用例
   BackupSettings();
}

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

FileCopyを確実に動作させるためには、以下のルールを覚えておきましょう。

  1. サンドボックスの制限: MQL5\Files フォルダ、または Common\Files フォルダ以外へのコピーはできません。Cドライブの直下などに保存しようとしても、セキュリティ上の制約で拒否されます。
  2. ファイルが「開かれたまま」ではないか: コピー元またはコピー先のファイルが、FileOpen 関数で開かれたままの状態(ハンドルが閉じられていない状態)だと、コピーに失敗することがあります。必ず FileClose を行ってから実行してください。
  3. 上書きフラグの忘れ: FILE_REWRITE を指定し忘れると、2回目以降の実行(既にコピー先が存在する場合)で必ず失敗します。
  4. パスの区切り文字: フォルダを階層化する場合、区切り文字は /(スラッシュ)または \\(バックスラッシュ2つ)を使用してください。

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

アルゴリズムトレードにおいて、FileCopyなどでデータの管理を完璧に行っても、避けることができない「環境の壁」が存在します。それはネットワーク遅延(レイテンシ)です。FX取引は1ミリ秒(0.001秒)を争う世界であり、自宅のPCから一般的なインターネット回線を通じて注文を出すことは、プロのクオンツから見れば極めてリスクの高い行為です。

自宅PCでの運用は、プロバイダー経由の無数のノードを通過するため、約定までに致命的な遅延が発生し、スリッページによって期待収益が削り取られてしまいます。どれだけ優れたロジックを構築しても、物理的な距離と回線速度による損失はカバーできません。約定スピードを極限まで高め、安定した利益を追求するには、ブローカーのサーバーに近いデータセンターに設置された「専用のVPS(仮想専用サーバー)」の利用が必須です。プロのエンジニアが24時間365日の安定稼働と最速のレスポンスを求めるならば、VPS環境は「あれば便利」なものではなく、取引における「最低限のインフラ」であると認識すべきです。

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

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

コメント

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