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

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

FileGetIntegerは、MQL5で操作する「ファイル」のプロパティ(属性)を取得するための関数です。具体的には、ファイルサイズ、作成日時、更新日時、あるいは指定したファイルが現在開かれているかどうかといった情報を取得できます。

実務レベルの開発において、この関数は単に「情報を調べる」以上の重要な役割を担います。例えば、自作のログ出力システムや、外部から取り込む設定ファイルの読み込み処理などで、以下のようなシーンで頻繁に活用されます。

  • エラー回避の防波堤: ファイルを読み込む前に「ファイルが存在するか」「サイズが0ではないか」をチェックし、予期せぬ実行時エラーを防ぐ。
  • データの同期管理: ファイルの最終更新日時を監視し、データが更新されたタイミングでEAに新しい設定を再読み込みさせる。
  • ログの肥大化防止: ログファイルのサイズをチェックし、一定量を超えたら古いデータをアーカイブしたり削除したりする。

初心者が特につまずきやすいのは、「ファイルを開く前(名前指定)」と「開いた後(ハンドル指定)」の両方で使える点の使い分けです。ここを整理するだけで、ファイル操作の安定性は格段に向上します。


2. 構文と戻り値

FileGetIntegerには、用途に合わせて2つのオーバーロード(書き方)が存在します。

A. ファイルハンドルを指定する場合(既にFileOpenしている時)

long  FileGetInteger(
   int                         file_handle,   // FileOpenで取得したハンドル
   ENUM_FILE_PROPERTY_INTEGER  property_id    // 取得したいプロパティの種類
   );

B. ファイル名を指定する場合(ファイルを開かずに確認する時)

long  FileGetInteger(
   string                      file_name,     // ファイル名(パス)
   ENUM_FILE_PROPERTY_INTEGER  property_id,   // 取得したいプロパティの種類
   bool                        common_folder=false // 共通フォルダ(ターミナル間共有)かどうか
   );

主な取得できるプロパティ(property_id)

定数 内容 戻り値の型
FILE_EXISTS ファイルが存在するか 0 または 1
FILE_CREATE_DATE 作成日時 datetime (long)
FILE_MODIFY_DATE 最終更新日時 datetime (long)
FILE_SIZE ファイルサイズ(バイト) long
FILE_IS_READABLE 読み取り可能か 0 または 1
FILE_IS_WRITABLE 書き込み可能か 0 または 1

戻り値:
成功した場合は指定したプロパティの値を long 型で返します。失敗した場合は -1 を返します。


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

以下のコードは、EAの設定ファイルを読み込む前に、そのファイルの存在確認とサイズチェックを行う実戦的なスクリプトです。

//+------------------------------------------------------------------+
//| ファイル情報を確認し、安全に読み込むサンプルプログラム             |
//+------------------------------------------------------------------+
void OnStart()
{
   string fileName = "trade_config.csv";
   bool isCommon = false; // MQL5/Files フォルダ内を指す

   // 1. まずファイルが存在するかを確認(ハンドル不要の形式)
   if(!FileGetInteger(fileName, FILE_EXISTS, isCommon))
   {
      Print("エラー: 設定ファイル '", fileName, "' が見つかりません。");
      return;
   }

   // 2. ファイルサイズを確認(空のファイルを読み込む無駄を省く)
   long fileSize = FileGetInteger(fileName, FILE_SIZE, isCommon);
   Print("ファイルサイズ: ", fileSize, " バイト");

   if(fileSize == 0)
   {
      Print("警告: ファイルは存在しますが、中身が空です。");
      return;
   }

   // 3. 最終更新日時を確認(datetime型にキャストして表示)
   datetime lastMod = (datetime)FileGetInteger(fileName, FILE_MODIFY_DATE, isCommon);
   Print("最終更新日: ", TimeToString(lastMod));

   // 4. 安全が確認できたらファイルを開く
   int fileHandle = FileOpen(fileName, FILE_READ|FILE_CSV);
   if(fileHandle != INVALID_HANDLE)
   {
      // --- ここで読み込み処理を行う ---
      Print("ファイルを正常にオープンしました。ハンドル: ", fileHandle);

      // 読み込み終わったら必ず閉じる
      FileClose(fileHandle);
   }
   else
   {
      Print("エラー: ファイルオープンに失敗しました。エラーコード: ", GetLastError());
   }
}

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

  1. 「MQL5の砂場(サンドボックス)」の制限
    MQL5では、セキュリティ上の理由からアクセスできるフォルダが厳格に制限されています。基本的には MQL5\Files フォルダ内(または共通フォルダ)のファイルしか操作できません。これ以外の場所にあるファイルを FileGetInteger で確認しようとしても、常に「存在しない(-1)」となるため注意してください。

  2. 戻り値の型キャスト
    FileGetInteger はすべて long 型で値を返します。作成日時(FILE_CREATE_DATE)などを取得した際は、必ず (datetime) でキャストしないと、日付として正しく扱えません。

  3. ハンドルの有効性
    ハンドル指定(形式A)を使う場合、FileOpen が成功していることが前提です。INVALID_HANDLE に対して FileGetInteger を実行するとエラーになります。ファイルが存在するかどうかを調べるだけなら、ファイル名指定(形式B)を使うのが定石です。

  4. ファイルポインタの影響
    FILE_POSITION(現在の読み取り位置)などを取得する場合は、必ずハンドル指定で行う必要があります。読み取り中のループ内で「今どこまで読んだか」を把握する際に重宝します。


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

アルゴリズム取引において、FileGetInteger を駆使して完璧なロジックを組み上げたとしても、それだけで勝てるわけではありません。自動売買の成否を分ける最後の、そして最大の要因は「物理的な通信遅延(レイテンシ)」です。自宅のPCや一般的な光回線を利用した環境では、証券会社のサーバーとの間に数十〜数百ミリ秒の遅延が発生します。このわずかな遅延が、本来取れるはずだった利益をスリッページによって奪い、さらには損切りの遅れを招いて致命的な損失を生む原因となります。

クオンツエンジニアとして断言できるのは、プロレベルの約定スピードを実現するためには、証券会社のサーバーに極限まで物理距離が近い「専用のVPS(仮想専用サーバー)」の導入が不可欠であるということです。VPSを利用することで、ネットワーク遅延を1ミリ秒(1000分の1秒)単位まで短縮でき、EAのロジックが持つ真のパフォーマンスを引き出すことが可能になります。インフラの最適化は、コードの最適化と同じ、あるいはそれ以上に重要な戦略の一部なのです。

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

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

コメント

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