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

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

FileWriteIntegerは、MQL5でバイナリファイルに整数型(int, short, charなど)のデータを書き込むための関数です。

実務レベルのEA(エキスパートアドバイザー)開発において、この関数は「データの軽量化」と「高速な読み書き」を実現するために重宝されます。初心者は扱いやすいCSV形式(テキストファイル)を選びがちですが、CSVは人間が読める反面、ファイルサイズが大きくなり、読み書きの処理負荷(パース処理)も高くなります。

一方、FileWriteIntegerを用いたバイナリ形式での保存は、数値をそのままのビット列で記録するため、数千〜数万件のトレードログや独自のインジケーター値を保存しても、パフォーマンスを落とさずに運用できるのが最大のメリットです。

実務での活用例:
– EAが停止・再起動した際に状態を復元するための「マジックナンバー」や「ポジションID」の保存。
– 独自のバックテスト用ティックデータの蓄積。
– 複数のEA間で数値を高速に共有するためのフラグ管理。

2. 構文と戻り値

FileWriteIntegerの構文は以下の通りです。

uint FileWriteInteger(
   int  file_handle,   // ファイルハンドル
   int  value,         // 書き込む値
   int  size=INT_VALUE // 書き込むサイズ(バイト数)
);

パラメーター解説

  1. file_handle: FileOpen関数によって返されたファイル識別子です。
  2. value: ファイルに書き込みたい整数値です。
  3. size: 書き込むデータのサイズを指定します。以下の定数を利用するのが一般的です。
  4. CHAR_VALUE (1バイト): -128〜127 または 0〜255 の範囲。
  5. SHORT_VALUE (2バイト): -32,768〜32,767 の範囲。
  6. INT_VALUE (4バイト): 通常のint型(デフォルト)。

戻り値

実際に書き込まれたバイト数が返されます。書き込みに失敗した場合は 0 が返ります。

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

以下のサンプルコードは、EAが最後にエントリーした際のチケット番号をバイナリファイルに保存する実戦的な例です。

//--- データを保存するファイル名
const string FileName = "LastTicket.bin";

//+------------------------------------------------------------------+
//| チケット番号をファイルに保存する関数                                   |
//+------------------------------------------------------------------+
void SaveLastTicket(int ticket)
{
   // 1. ファイルをバイナリ書き込みモードで開く (FILE_BIN | FILE_WRITE)
   int file_handle = FileOpen(FileName, FILE_BIN|FILE_WRITE);

   if(file_handle != INVALID_HANDLE)
   {
      // 2. 整数値(チケット番号)を書き込む
      // チケット番号は通常大きいので INT_VALUE (4バイト) を使用
      uint bytes_written = FileWriteInteger(file_handle, ticket, INT_VALUE);

      if(bytes_written > 0)
      {
         Print("チケット番号を保存しました: ", ticket, " (", bytes_written, " bytes)");
      }
      else
      {
         Print("書き込みに失敗しました。エラーコード: ", GetLastError());
      }

      // 3. ファイルを必ず閉じる
      FileClose(file_handle);
   }
   else
   {
      Print("ファイルを開けませんでした。エラーコード: ", GetLastError());
   }
}

//+------------------------------------------------------------------+
//| スクリプト開始時の処理                                              |
//+------------------------------------------------------------------+
void OnStart()
{
   int myTicket = 12345678; // 例としてのチケット番号
   SaveLastTicket(myTicket);
}

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

① FILE_BINフラグの指定忘れ

FileWriteIntegerはバイナリ専用の関数です。FileOpen時に FILE_CSV を指定していると正しく動作しません。必ず FILE_BIN を指定してください。

② サイズ指定の不整合

例えば、sizeCHAR_VALUE(1バイト)を指定したのに、value500 という大きな数値を渡した場合、1バイト(0〜255)に収まらないデータは切り捨てられ、予期しない数値が保存されます。扱う数値の範囲に合わせて適切なサイズを選んでください。

③ ファイルポインタの意識

FileWriteIntegerを連続で呼び出すと、ファイル内の書き込み位置(ポインタ)が自動的に進みます。特定の場所を上書きしたい場合は、FileSeek関数を使って位置を制御する必要があります。

④ サンドボックス制限

MQL5では、ファイル操作ができるのはターミナルの「MQL5\Files」フォルダ内に限定されています。絶対パスでCドライブ直下などを指定することはできないため注意しましょう。

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

アルゴリズムトレードにおいて、FileWriteIntegerなどを用いた効率的なデータ処理を学ぶことは非常に重要ですが、それ以上に収益を左右するのが「物理的な通信環境」です。自宅のPCや一般的な光回線でEAを稼働させている場合、プロバイダー経由のネットワーク遅延(レイテンシ)が発生し、MT5上のシグナルが出てから証券会社に注文が届くまでに致命的なタイムラグが生じます。

このコンマ数秒の遅れは、特にボラティリティが高い局面において、スリッページによる利益の削り取りや、最悪の場合は約定拒否を招きます。極限まで約定スピードを高め、理論通りのエッジを享受するためには、証券会社のサーバーに物理的に近い場所に設置された「自動売買専用のVPS」の利用が不可欠です。ネットワーク遅延を最小化することは、高度なコードを書くことと同等、あるいはそれ以上にクオンツエンジニアが優先すべき技術的投資と言えます。

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

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

コメント

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