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

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

MQL5のFolderClean関数は、指定したフォルダ内のすべてのファイルとサブフォルダを削除するための関数です。「フォルダそのもの」を削除するのではなく、「中身を空っぽにする」という役割を担います。

実務レベルのEA(エキスパートアドバイザー)開発において、この関数は主にデータの整理とストレージ管理に活用されます。例えば、以下のようなシーンです。

  • 一時ファイルのクリーンアップ: ロジック計算のために書き出した一時的なCSVファイルやキャッシュ用バイナリデータが溜まった際の一括削除。
  • バックテストの初期化: スクリーニング結果などをファイル出力するツールにおいて、実行のたびに前回の古いデータを消去して最新の状態に保つ。
  • ログ管理: 数ヶ月分溜まった古いカスタムログファイルを一掃し、ディスク容量を節約する。

初心者が特につまずきやすい点は、MQL5のファイル操作には「サンドボックス制約」があることです。FolderCleanで操作できるのは、原則としてMetaTrader 5(MT5)のデータフォルダ内にある「Files」フォルダ以下に限定されます。この制限を理解していないと、「コードは正しいはずなのにファイルが消えない」という事態に陥ります。


2. 構文と戻り値

FolderClean関数の構文は非常にシンプルです。

bool FolderClean(
   string  folder_name,       // フォルダパス
   int     common_flag = 0    // フラグ(共通フォルダかどうか)
);

パラメーター

  1. folder_name: 削除したい中身が入っているフォルダのパスを文字列で指定します。パスは「MQL5\Files」からの相対パスです。
  2. common_flag:
    • 0(デフォルト): 各ターミナル個別のデータフォルダ内を対象にします。
    • FILE_COMMON: すべてのMT5ターミナルで共有される共通フォルダ(Common)内を対象にします。

戻り値

  • 成功した場合は true を、失敗した場合は false を返します。失敗の理由を確認するには、GetLastError() 関数を呼び出します。

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

以下のサンプルは、EAの初期化時(OnInit)に古い作業用フォルダの中身を一度リセットする、実戦的なコード例です。

//+------------------------------------------------------------------+
//|                                              FolderClean_Demo.mq5|
//|                                  Copyright 2023, Quant Engineer  |
//+------------------------------------------------------------------+
#property strict

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   // 掃除したいフォルダ名
   string targetFolder = "TempData";

   // フォルダが存在するか確認し、なければ作成、あれば中身を削除
   if(!FolderCreate(targetFolder))
   {
      Print("フォルダの作成に失敗、または既に存在します。エラーコード:", GetLastError());
   }

   // フォルダ内のすべてのファイルとサブフォルダを削除
   if(FolderClean(targetFolder))
   {
      Print("フォルダ '", targetFolder, "' を正常にクリーンアップしました。");
   }
   else
   {
      Print("フォルダのクリーンアップに失敗しました。エラーコード:", GetLastError());
      // フォルダが空の場合も、状況によってはfalseを返すことがあります
   }

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // 終了時にも念のため中身を消去してディスクを綺麗にする
   if(FolderClean("TempData"))
   {
      Print("終了時にTempDataをクリーンアップしました。");
   }
}

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

FolderCleanを使用する際は、以下のリスクと仕様を必ず把握しておいてください。

  1. サブフォルダごと削除される:
    指定したフォルダ内の「ファイル」だけでなく、その中に作られた「サブフォルダ」も中身ごとすべて削除されます。必要な階層構造がある場合は、削除後に再構築する必要があります。
  2. ファイルが開かれていると失敗する:
    MT5内、あるいは他のプログラム(Excelなど)でそのフォルダ内のファイルを開いている場合、削除に失敗します。EAでファイルを出力した後は必ず FileClose() でハンドルを閉じているか確認してください。
  3. 書き込み権限と場所:
    前述の通り、MQL5\Files 以外(例えばデスクトップやCドライブ直下など)のフォルダをこの関数で操作することはできません。
  4. 「フォルダ自体」は残る:
    FolderCleanは中身を空にするだけで、指定したフォルダそのものは消えません。フォルダ自体を消したい場合は FolderDelete を使用します。ただし、FolderDelete はフォルダが空でないと失敗するため、「FolderCleanFolderDelete」という手順で実行するのが一般的です。

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

アルゴリズムのロジックがどれほど完璧であっても、それを実行する「インフラ環境」が脆弱であれば、プロの現場では通用しません。自宅のPCや一般的な光回線を利用した自動売買は、ネットワークの経由地が多く、ブローカーのサーバーに注文が届くまでに数十から数百ミリ秒の「レイテンシ(遅延)」が発生します。相場急変時、このわずかな遅延が原因で、表示価格から大きく乖離した価格で約定する「スリッページ」を引き起こし、期待期待値を根底から破壊します。

極限まで約定スピードを高め、スリッページによる損失を最小限に抑えるには、ブローカーの取引サーバーに物理的に近いデータセンターに設置された「専用VPS(仮想専用サーバー)」の使用が不可欠です。低遅延な環境は、単なる利便性の向上ではなく、トレードの期待値を守るための「必須の防衛策」です。プロのクオンツエンジニアが安定した収益を維持できるのは、コードの質だけでなく、こうした24時間365日の安定稼働と超低遅延を約束するプロ仕様のインフラを整えているからに他なりません。

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

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

コメント

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