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

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

FileReadIntegerは、MQL5で開いたバイナリファイルから「整数型(Integer)」のデータを読み出すための関数です。

実務開発において、CSVのようなテキスト形式ではなく、バイナリ形式でデータを扱う最大のメリットは「処理速度の速さ」と「ファイルサイズの節約」にあります。EA(エキスパートアドバイザー)が数ミリ秒を争うロジックを実行している際、巨大なCSVをパース(解析)するのは非効率です。

実務での主な活用例:
* マジックナンバーの管理: 稼働中のEAがどのマジックナンバーを使用しているかを外部ファイルに保存し、再起動時に読み込む。
* 取引統計のキャッシュ: 過去のトレード回数や連敗数など、計算に時間がかかる数値を保存しておく。
* 独自インジケーターのデータ受け渡し: 外部ツールで計算した数値をバイナリ化し、高速にEAへ取り込む。

初心者が特につまずきやすいのは、「読み込むデータのバイトサイズ」の指定です。保存した時と異なるサイズ(例:longで保存したのにintで読み込む)を指定すると、全くデタラメな数値が返ってくるため、データ型への深い理解が求められます。

2. 構文と戻り値

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

long  FileReadInteger(
   int              file_handle,   // ファイルハンドル
   ENUM_DATATYPE    size=INT_VALUE // 整数型のサイズ
   );

パラメーター

  1. file_handle: FileOpen() 関数によって返されたファイルハンドルを指定します。
  2. size: 読み込むデータの型を指定します。以下の列挙型から選択します。
    • CHAR_VALUE (1バイト)
    • SHORT_VALUE (2バイト)
    • INT_VALUE (4バイト)
    • LONG_VALUE (8バイト)
      ※デフォルトは INT_VALUE です。

戻り値

読み込まれた整数値が long 型で返されます。エラーが発生した場合は、ファイルポインタがファイルの終端に達しているなどの理由が考えられます。詳細なエラー確認には GetLastError() を使用します。

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

以下のコードは、EAが停止しても前回の「総トレード数」を記憶しておくために、バイナリファイルへ数値を書き込み、再度読み込む実用的な例です。

//--- ファイル名の定義
string fileName = "TradeCounter.bin";

//+------------------------------------------------------------------+
//| データをファイルから読み込む関数                                 |
//+------------------------------------------------------------------+
long ReadTradeCount()
{
   // バイナリ・読み込みモードでファイルを開く
   int fileHandle = FileOpen(fileName, FILE_BIN|FILE_READ);
   long count = 0;

   if(fileHandle != INVALID_HANDLE)
   {
      // LONG_VALUE(8バイト)として整数を読み込む
      count = FileReadInteger(fileHandle, LONG_VALUE);

      FileClose(fileHandle);
      Print("データの読み込みに成功: ", count);
   }
   else
   {
      Print("ファイルが存在しないか、読み込みに失敗しました。");
   }

   return count;
}

//+------------------------------------------------------------------+
//| データをファイルに書き込む関数                                   |
//+------------------------------------------------------------------+
void SaveTradeCount(long count)
{
   // バイナリ・書き込みモードでファイルを開く
   int fileHandle = FileOpen(fileName, FILE_BIN|FILE_WRITE);

   if(fileHandle != INVALID_HANDLE)
   {
      // 整数値を書き込む
      FileWriteInteger(fileHandle, count, LONG_VALUE);

      FileClose(fileHandle);
      Print("データの保存に成功: ", count);
   }
   else
   {
      Print("ファイルの書き込みに失敗しました。エラーコード: ", GetLastError());
   }
}

//+------------------------------------------------------------------+
//| EAの初期化イベント                                               |
//+------------------------------------------------------------------+
int OnInit()
{
   long lastCount = ReadTradeCount();
   // 読み込んだ数値を使ってロジックを再開
   return(INIT_SUCCEEDED);
}

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

  1. FILE_BINフラグの必須性
    FileReadInteger はバイナリファイル専用の関数です。FileOpen 時に FILE_BIN フラグを忘れると、予期しない動作をします。CSV(FILE_CSV)の場合は FileReadString で読み取った後に型変換を行うのが一般的です。

  2. ファイルポインタの移動
    この関数を実行すると、読み込んだバイト数分だけファイルポインタ(読み取り位置)が自動的に進みます。複数の数値を連続で読み込む場合は、書き込んだ順番を正確に守る必要があります。

  3. エンディアンの問題
    MQL5はリトルエンディアンを採用していますが、外部のシステムから生成されたバイナリファイルを読み込む場合、バイトオーダーが異なると数値が逆転して読み取られることがあります。

  4. 型の不一致(最大のバグ要因)
    FileWriteIntegerSHORT_VALUE として書き込んだものを、FileReadIntegerINT_VALUE として読み込むと、隣接するメモリ領域のデータまで読み込んでしまい、壊れたデータになります。「保存時の型」と「読み込み時の型」は必ず一致させてください。

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

アルゴリズムトレードにおいて、FileReadInteger等を用いた高速なデータ処理を実装しても、実行環境が適切でなければその努力は無に帰します。多くのエンジニアが陥る最大の罠は「自宅PCでの稼働」です。

FXの自動売買において、あなたのEAが発注ボタンを押してからブローカーのサーバーに届くまでの「ネットワーク遅延(レイテンシ)」は、収益性に直結します。自宅のインターネット回線では、物理的な距離やプロバイダーの混雑により、数十〜数百ミリ秒の遅延が常態化しています。この遅延の間に価格が動き、不利な価格で約定する「スリッページ」が発生すれば、どんなに優れたロジックも期待値がマイナスに転じます。

極限まで約定スピードを高め、プロの世界で戦うためには、ブローカーのサーバーと同じデータセンター内、あるいは至近距離に設置されたトレード専用のVPS(仮想専用サーバー)を利用することが不可欠です。24時間365日、安定した低遅延環境を確保することは、高度なコードを書くこと以上に、トレードの勝率を左右する技術的な必須条件と言えます。

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

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

コメント

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