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

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

FileReadNumberは、MQL5で開いたファイル(CSVファイルやバイナリファイル)から、数値データを読み取るための関数です。

実務レベルのEA開発において、この関数は「外部データの取り込み」という重要な役割を担います。例えば、Pythonなどの外部ツールで算出した機械学習のスコア、別システムで書き出した最適化済みのパラメータ、あるいは動的に変化するターゲット価格などをEAにインポートする際に多用されます。

初心者が特につまずきやすいのは、「ファイルポインタ(読み取り位置)」の概念です。この関数は一度数値を読み取ると、自動的に次のデータの位置までポインタを移動させます。そのため、ループ処理で連続して読み取る際には非常に便利ですが、特定の箇所の数値だけを何度も読み直したい場合には工夫が必要です。

また、CSVファイルのようなテキスト形式から読み取る場合、カンマやタブなどの区切り文字を適切に解釈して数値型(double)に変換してくれるため、データ解析とEAの橋渡し役として非常に優秀です。


2. 構文と戻り値

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

double FileReadNumber(
   int  file_handle    // ファイルハンドル
);

パラメーター

  • file_handle: FileOpen() 関数によって返された整数値のハンドルです。このハンドルを指定することで、どのファイルを操作するかをプログラムに伝えます。

戻り値

  • double型: 読み取った数値を返します。
  • ファイルがバイナリ形式(FILE_BIN)の場合はそのデータ型のサイズに合わせて読み取ります。
  • テキスト形式(FILE_CSV)の場合は、次の区切り文字までの文字列を数値に変換して返します。

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

以下は、あらかじめ用意したCSVファイルから「目標利益(Take Profit)」と「損切り幅(Stop Loss)」の数値を読み込み、EAの変数に代入する実践的なサンプルコードです。

//+------------------------------------------------------------------+
//| ファイルから数値を読み込むサンプルコード                                |
//+------------------------------------------------------------------+
void ReadSettingsFromFile()
{
   string fileName = "trade_params.csv";
   // ファイルを読み取りモード、CSV形式、共有読み取り許可で開く
   int fileHandle = FileOpen(fileName, FILE_READ|FILE_CSV|FILE_ANSI, ',');

   if(fileHandle != INVALID_HANDLE)
   {
      Print("ファイルを開きました: ", fileName);

      // 1番目の数値を読み込む(例:利確幅)
      double takeProfit = FileReadNumber(fileHandle);

      // 2番目の数値を読み込む(例:損切幅)
      double stopLoss = FileReadNumber(fileHandle);

      PrintFormat("読み込み成功: TP=%.1f, SL=%.1f", takeProfit, stopLoss);

      // 必ずファイルを閉じる
      FileClose(fileHandle);
   }
   else
   {
      // ファイルが開けなかった場合のエラー処理
      Print("ファイルが開けませんでした。エラーコード: ", GetLastError());
   }
}

// EAの初期化時に実行する例
int OnInit()
{
   ReadSettingsFromFile();
   return(INIT_SUCCEEDED);
}

このコードでは、trade_params.csvの中身が「100.5, 50.0」のように記述されていれば、それぞれの値をdouble型として正確に取得できます。


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

  1. データの型に注意
    FileReadNumberは常にdouble型を返します。整数(int)として扱いたい場合は、(int)FileReadNumber(handle)のように明示的にキャストを行う必要があります。
  2. 文字列を読み込もうとした場合
    数値ではない文字列(例:”Gold”)をこの関数で読み込もうとすると、関数は0.0を返します。文字列を読み込みたい場合はFileReadStringを使用してください。
  3. ファイル末尾(EOF)のチェック
    ループで大量のデータを読み込む際は、FileIsEnding(fileHandle)を使用して、ファイルの終端に達していないかを確認しながら処理しないと、無限ループや予期せぬエラーの原因になります。
  4. ディレクトリの制限
    MQL5ではセキュリティ上の理由から、操作できるファイルは「MQL5\Files」フォルダ内に限定されています。これ以外の場所にあるファイルを読み取る場合は、共通フォルダフラグ(FILE_COMMON)を使用するなどの対策が必要です。

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

アルゴリズムトレードにおいて、FileReadNumberなどで高度な戦略を組み込んでも、それを実行する「環境」が貧弱であればすべてが無意味になります。自宅のPCや一般的な光回線でEAを稼働させることは、プロのクオンツから見れば極めてリスクの高い行為です。家庭用回線は、FX業者のサーバーがあるデータセンターとの物理的距離が遠く、ネットワークの経由地点(ホップ数)が増えるため、数十ミリ秒から数百ミリ秒の「レイテンシ(遅延)」が必ず発生します。

このわずかな遅延が、相場急変時のスリッページを引き起こし、本来利益が出るはずのロジックを損失に変えてしまいます。また、自宅PCはOSのアップデートや停電、物理的な故障による停止リスクを常に抱えています。極限まで約定スピードを高め、24時間365日の安定稼働を実現するには、FX業者のサーバーに物理的に近い場所に設置された「自動売買専用のVPS」が必須です。プロ仕様のインフラを整えることこそが、トレードロジックの改善以上に勝率へ直結する重要なファクターであることを忘れないでください。

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

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

コメント

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