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

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

FileSize関数は、MQL5で開かれたファイルのサイズ(バイト単位)を取得するための関数です。一見地味な関数ですが、実戦的なEA(エキスパートアドバイザー)やツールの開発においては、データの整合性を担保するために非常に重要な役割を果たします。

実務レベルでの主な活用シーンは以下の通りです。

  • ログファイルの肥大化防止(ローテーション): 稼働時間が長いEAではログが数GBに達し、ディスク容量を圧迫することがあります。FileSizeで容量をチェックし、一定サイズを超えたら新しいファイルに切り替える処理を実装します。
  • データの読み込み処理: 外部のCSVやバイナリファイルからデータを読み込む際、ファイル全体を一度に読み込むための配列サイズを決定するために使用します。
  • ダウンロード完了の確認: インターネットから取得したデータファイルが、予期せず途切れていないか、期待されるサイズに達しているかを検証します。

初心者が陥りやすいミスとして、「ファイル名を指定してサイズを取得しようとする」点があります。FileSizeはファイル名ではなく、FileOpen関数によって取得した「ファイルハンドル」に対して実行する必要があることを覚えておきましょう。

2. 構文と戻り値

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

ulong FileSize(
   int  file_handle    // FileOpenで取得したハンドル
);

パラメーター

  • file_handle: FileOpen() 関数が正常に実行された際に返される整数値(ハンドル)を指定します。

戻り値

  • ulong型: ファイルのサイズを「バイト(bytes)」単位で返します。
  • ファイルが開かれていない、あるいは無効なハンドルを渡した場合はエラーとなります。エラーの詳細は GetLastError() で確認可能です。

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

以下のサンプルは、特定のログファイルを開き、そのサイズが「1MB(メガバイト)」を超えているかどうかを確認する実用的なスクリプトです。

void OnStart()
{
    string fileName = "TradeLog_Sample.txt";
    // 読み取りモードでファイルを開く
    int fileHandle = FileOpen(fileName, FILE_READ | FILE_TXT);

    if(fileHandle != INVALID_HANDLE)
    {
        // ファイルサイズを取得(単位:バイト)
        ulong sizeInBytes = FileSize(fileHandle);

        // バイトをメガバイトに変換(1MB = 1024 * 1024 bytes)
        double sizeInMB = (double)sizeInBytes / (1024.0 * 1024.0);

        PrintFormat("ファイル名: %s", fileName);
        PrintFormat("サイズ: %I64u バイト (%.2f MB)", sizeInBytes, sizeInMB);

        // 実務的な条件分岐例:1MBを超えたら警告
        if(sizeInBytes > 1024 * 1024)
        {
            Print("警告:ログファイルが1MBを超えています。整理を検討してください。");
        }

        // 処理が終わったら必ずクローズする
        FileClose(fileHandle);
    }
    else
    {
        PrintFormat("エラー:ファイル %s を開けませんでした。コード: %d", fileName, GetLastError());
    }
}

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

開発時に注意すべきポイントをまとめました。

  1. ファイルポインタの影響を受けない: FileReadFileSeekで読み取り位置(ポインタ)が移動していても、FileSizeは常にファイル全体のサイズを返します。
  2. 型に注意 (ulong): ファイルサイズは非常に大きくなる可能性があるため、戻り値は int ではなく ulong(符号なし64ビット整数)です。大きなファイルを扱う際に int 型の変数に代入すると、オーバーフロー(数値の溢れ)が発生し、正しいサイズが取得できなくなるため注意してください。
  3. 書き込み直後のサイズ取得: FileWriteなどでデータを書き込んだ直後に FileSize を呼ぶ場合、OSのキャッシュの影響で正確なサイズが即座に反映されないことがあります。確実に最新のサイズを取得したい場合は、一度 FileFlush() を呼ぶか、ファイルを閉じてから開き直すのが安全です。
  4. ハンドル管理の徹底: FileOpen で取得したハンドルが INVALID_HANDLE でないことを必ず確認してから FileSize を呼び出してください。無効なハンドルを使用すると、実行時エラーが発生します。

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

プロのクオンツエンジニアとして、コードの最適化以上に強調したいのが「取引環境」の重要性です。MQL5でどれだけ完璧なロジックを組み、FileSizeを駆使して堅牢なログ管理を行っても、EAを「自宅のPC」で稼働させている限り、勝てる可能性は著しく低下します。

自動売買において、チャート上でエントリーシグナルが出てから証券会社のサーバーに注文が届くまでの「ネットワーク遅延(レイテンシ)」は致命的です。自宅の光回線では数ミリ秒から数百ミリ秒の揺らぎ(ジッター)が不可避であり、激しい値動きの中では、意図した価格から大きく乖離した場所で約定(スリッページ)してしまいます。このコンマ数秒の遅れが、月間の収支をプラスからマイナスへ容易に反転させます。プロの世界で戦うには、取引サーバーの物理的距離が近いデータセンター内に設置された「専用VPS」の導入が不可欠です。約定スピードを極限まで高める環境を整えることは、アルゴリズムを改良することと同等、あるいはそれ以上に優先すべき投資であることを肝に銘じてください。

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

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

コメント

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