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

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

MQL5のFolderCreateは、その名の通り「新しいフォルダを作成する」ための関数です。しかし、単にフォルダを作るだけの機能と侮ってはいけません。実務レベルのEA(エキスパートアドバイザー)開発において、この関数は「データの整理整頓」と「システムの堅牢性」を支える重要な役割を担います。

実務での主な活用シーン:
* ログの階層管理: 通貨ペア別や日付別にフォルダを分け、実行ログやエラーログを整理する。
* バックテスト結果の保存: 最適化(最適化)プロセスで生成された大量のCSVデータを、テスト実行時ごとにフォルダを分けて保存する。
* スクリーンショットの整理: エントリーや決済の瞬間のチャート画像を保存する際、戦略ごとにディレクトリを分類する。

初心者が特につまずきやすいのは、MQL5の「サンドボックス(砂場)制限」です。FolderCreateで作成できるフォルダは、セキュリティ上の理由からメタトレーダーが許可した特定のディレクトリ(通常はMQL5/Filesフォルダ以下)に限定されます。PCのCドライブ直下などに自由にフォルダを作れるわけではない点に注意が必要です。


2. 構文と戻り値

FolderCreate関数の構文は非常にシンプルですが、第2引数のフラグが重要です。

bool FolderCreate(
   string  folder_name,       // 作成するフォルダのパス
   int     common_flag = 0    // 共通フォルダフラグ
);

パラメーター解説

  1. folder_name (string):
    作成したいフォルダ名、またはパスを指定します。例えば "Logs\\Trade_2023" のように階層構造で指定することも可能です。
  2. common_flag (int):
    • 0 (デフォルト): 現在使用しているメタトレーダー(ターミナル)のデータフォルダ内に作成します。
    • FILE_COMMON: すべてのメタトレーダー(MT4/MT5)で共有される「共通フォルダ」内に作成します。複数のEA間でデータを共有したい場合に便利です。

戻り値

  • 成功した場合:true
  • 失敗した場合:false(エラーの詳細は GetLastError() 関数で確認します)

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

以下は、EAの稼働時に「通貨ペア名」と「当日の日付」を組み合わせたフォルダを自動生成し、ログ保存の準備をする実践的なサンプルコードです。

//+------------------------------------------------------------------+
//| フォルダ作成のデモスクリプト                                           |
//+------------------------------------------------------------------+
void OnStart()
{
   // 1. 作成したいフォルダのパスを構築
   // 例:Logs\EURUSD\20231027
   datetime now = TimeCurrent();
   string dateStr = TimeToString(now, TIME_DATE);
   StringReplace(dateStr, ".", ""); // ドットを除去して見やすくする

   string folderPath = "TradeLogs\\" + _Symbol + "\\" + dateStr;

   // 2. FolderCreateを実行
   // 指定した中間フォルダ(TradeLogsや_Symbol)が存在しない場合、一括で作成してくれます
   if(FolderCreate(folderPath, 0))
   {
      Print("フォルダ作成成功: ", folderPath);

      // 作成されたフォルダ内にテストファイルを作成してみる
      string fileName = folderPath + "\\init_log.txt";
      int fileHandle = FileOpen(fileName, FILE_WRITE|FILE_TXT);

      if(fileHandle != INVALID_HANDLE)
      {
         FileWrite(fileHandle, "EA initialized at: ", TimeToString(now));
         FileClose(fileHandle);
         Print("ログファイルを作成しました: ", fileName);
      }
   }
   else
   {
      // 失敗した場合はエラーコードを確認
      int errorCode = GetLastError();
      Print("フォルダ作成失敗。エラーコード: ", errorCode);
   }
}

このコードのポイントは、FolderCreate が「ネスト(階層化)されたフォルダ」を一度に作成できる点です。親フォルダが存在しなくても、パスを記述すれば末端まで自動的に生成されます。


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

1. バックスラッシュの扱いに注意
MQL5(C++ベース)では、文字列内でフォルダの区切りを示す \(バックスラッシュ)はエスケープシーケンスとして扱われます。パスを指定する際は、"Logs\\Folder" のように \\ と2つ重ねて書く必要があります。

2. FILE_COMMON フラグの挙動
FILE_COMMON を指定して作成したフォルダは、PC内の全てのMT5/MT4からアクセスできる領域に保存されます。便利な反面、他のEAが同名のフォルダを操作してデータを上書きしてしまうリスクがあるため、命名規則を工夫しましょう。

3. 書き込み権限とセキュリティ
MQL5の外部(DesktopやMy Documentsなど)にフォルダを作ることは標準機能では不可能です。もしどうしても外部に出したい場合は、WinAPI(Windowsのシステム関数)を呼び出す高度な実装が必要になりますが、初心者のうちは推奨されません。


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

アルゴリズムトレードにおいて、ロジックと同じ、あるいはそれ以上に重要なのが「実行環境」です。自宅のPCや一般的な光回線でEAを稼働させることは、プロのクオンツから見れば極めてリスクの高い行為と言わざるを得ません。家庭用回線には避けられない「ネットワーク遅延(レイテンシ)」が存在し、MT5が注文を出してから証券会社のサーバーに届くまでの数ミリ秒〜数十ミリ秒の遅れが、スリッページを引き起こし、期待収益を劇的に削り取るからです。

特にボラティリティが高い局面では、一瞬の遅延が致命的な損失に直結します。プロレベルの約定スピードを確保し、システムを24時間安定して稼働させるには、証券会社のサーバーに物理的に近いデータセンターに設置された「専用のVPS(仮想専用サーバー)」の導入が必須条件です。インフラへの投資を惜しむことは、勝てるロジックをドブに捨てることと同義であると理解しましょう。

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

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

コメント

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