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

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

MQL5でファイル操作を行う際、非常に重要な役割を担うのが FileSeek 関数です。この関数を一言で言えば、「ファイルの読み書きを開始する位置(ファイルポインタ)を移動させるためのコマンド」です。

実務レベルの開発では、主に以下のケースで活用されます。

  • ログの追記: 既存のCSVファイルの末尾に新しいトレード記録を追加する。
  • 設定の更新: バイナリファイルの特定の位置にあるデータだけを書き換える。
  • 最新データの取得: 巨大なデータファイルの最後の方だけを読み取る。

初心者が特につまずきやすいのは、「今、ファイル内のどこを読み書きしているのか」という視覚的なイメージが欠落してしまう点です。ファイルを開いた直後、ポインタは先頭(0バイト目)にありますが、読み書きを進めるごとに自動で後ろへ移動します。FileSeek を使いこなせないと、既存のデータを意図せず上書きしてしまったり、空のデータを読み取ってしまう原因になります。


2. 構文と戻り値

FileSeek 関数の構文は以下の通りです。

bool FileSeek(
   int                  file_handle,    // ファイルハンドル
   long                 offset,         // 移動させるバイト数
   ENUM_FILE_POSITION   origin          // 移動の起点
);

パラメーター解説

  1. file_handle: FileOpen 関数で取得したハンドル番号です。
  2. offset: 起点から何バイト移動させるかを指定します。正の数なら後ろへ、負の数なら前へ移動します。
  3. origin: どこを基準にするかを指定する列挙型です。
    • SEEK_SET: ファイルの先頭から。
    • SEEK_CUR: 現在のポインタ位置から。
    • SEEK_END: ファイルの終端(末尾)から。

戻り値

  • 移動に成功すれば true、失敗すれば false を返します。

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

以下は、EA(エキスパートアドバイザー)の運用中に、取引記録をCSVファイルの「末尾」に追記していく実用的なサンプルコードです。

// 取引記録を保存する関数
void SaveTradeLog(string message)
{
   string fileName = "TradeLog.csv";

   // ファイルを読み書きモードで開く(FILE_WRITE, FILE_READ)
   // FILE_CSVを指定してテキスト形式で扱う
   int fileHandle = FileOpen(fileName, FILE_WRITE|FILE_READ|FILE_CSV|FILE_ANSI);

   if(fileHandle != INVALID_HANDLE)
   {
      // --- FileSeekの活用ポイント ---
      // ファイルの末尾(SEEK_END)に移動して、既存のデータを消さずに追記する
      if(FileSeek(fileHandle, 0, SEEK_END))
      {
         // 現在時刻とメッセージを書き込む
         FileWrite(fileHandle, TimeToString(TimeCurrent()), message);
         Print("ログを追記しました: ", message);
      }
      else
      {
         Print("FileSeekに失敗しました。エラーコード: ", GetLastError());
      }

      // ファイルを閉じて変更を確定させる
      FileClose(fileHandle);
   }
   else
   {
      Print("ファイルを開けませんでした。エラーコード: ", GetLastError());
   }
}

// EAのティック時イベント
void OnTick()
{
   // 例:何らかの条件でログを出力
   static bool firstRun = true;
   if(firstRun)
   {
      SaveTradeLog("EAが起動し、監視を開始しました。");
      firstRun = false;
   }
}

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

① 単位は「バイト」であること

offset に指定するのは「行数」や「文字数」ではなく「バイト数」です。特にUnicode形式(MQL5のデフォルト)でファイルを開いている場合、半角英数1文字でも2バイト消費します。ズレを防ぐため、CSV操作では SEEK_SETSEEK_END を使って、構造の区切りまで一気に飛ばすのが定石です。

② ファイルオープン時のモード

FileOpenFILE_WRITE だけを指定してファイルを開くと、既存のデータはすべて消去(上書き準備)されます。既存データがある状態で FileSeek を使って追記したい場合は、必ず FILE_READ|FILE_WRITE の両方を組み合わせて開く必要があります。

③ ハンドルの確認

FileSeek を呼び出す前に、必ず file_handleINVALID_HANDLE ではないことを確認してください。無効なハンドルに対して操作を行うと、実行時エラーが発生しEAが停止する恐れがあります。


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

アルゴリズムトレードにおいて、ロジックと同じ、あるいはそれ以上に重要なのが「実行環境のレイテンシ(遅延)」です。どれほど FileSeek で高速にログを管理し、洗練されたコードを書いても、自宅のPCから一般的なインターネット回線を通じて注文を出している限り、プロの世界では勝負になりません。

自宅PCでの運用は、ネットワーク経路上の無数のルーターを経由するため、パケットの到達に数ミリ秒から数百ミリ秒の揺らぎ(ジッター)が発生します。このわずかな遅延が、スリッページを増大させ、バックテストの結果とリアルトレードの乖離を生む致命的な要因となります。約定スピードを極限まで高め、証券会社のサーバーサイドに近い環境で優位性を確保するためには、ブローカーのデータセンターに物理的に近い専用のVPS(仮想専用サーバー)導入が不可欠です。インフラを軽視するトレーダーは、目に見えないコストで利益を削り続けていることに気づくべきです。

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

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

コメント

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