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

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

MQL5の FileWriteFloat 関数は、バイナリ形式のファイルに「float型(単精度浮動小数点数)」の値を書き込むための関数です。

FXの自動売買(EA)開発において、多くの開発者は最初に FileWrite を使ったCSV形式でのデータ保存を学びます。しかし、実務レベルのクオンツ分析や機械学習用のデータセット作成、あるいは膨大なティックデータの保存などでは、CSV(テキスト形式)はファイルサイズが大きくなり、読み書きの速度が低下するという弱点があります。

FileWriteFloat を活用する最大のメリットは、「データの軽量化」と「高速なI/O(入出力)」です。
通常、MQL5の価格データ(double型)は8バイト消費しますが、これをfloat型(4バイト)に変換してバイナリ保存することで、データ量を半分に節約できます。

ただし、初心者がつまずきやすいポイントとして、「保存したファイルをメモ帳で開いても文字化けして読めない」という点があります。これは故障ではなく、コンピューターが直接理解できるバイナリ形式で書き込まれているためです。データの可読性よりも、プログラム処理の効率を優先する場合に真価を発揮する関数です。

2. 構文と戻り値

FileWriteFloat 関数の仕様は以下の通りです。

uint FileWriteFloat(
   int    file_handle,     // ファイルハンドル
   float  value            // 書き込む値
   );

パラメーター

  • file_handle: FileOpen() 関数によって返されたファイルハンドルを指定します。
  • value: ファイルに書き込みたい float 型の数値を指定します。

戻り値

  • 正常に書き込まれた場合は、書き込まれたバイト数(float型なので通常は 4 )が返されます。
  • 書き込みに失敗した場合は 0 が返されます。エラーの詳細を確認するには GetLastError() を呼び出します。

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

以下のサンプルコードは、現在のチャートの「Ask価格」をバイナリファイルに保存するスクリプトです。MQL5の価格は通常 double 型ですが、FileWriteFloat を使うためにキャスト(型変換)を行っている点に注目してください。

//+------------------------------------------------------------------+
//|                                           SampleFileWriteFloat.mq5|
//+------------------------------------------------------------------+
void OnStart()
{
   // 保存するファイル名
   string fileName = "TickData_Float.bin";

   // 1. ファイルをバイナリ書き込みモードで開く
   // FILE_BIN を指定するのが必須条件です
   int fileHandle = FileOpen(fileName, FILE_BIN | FILE_WRITE);

   if(fileHandle != INVALID_HANDLE)
   {
      // 現在のAsk価格を取得(double型)
      double currentAsk = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

      // 2. double型からfloat型にキャストして書き込み
      // floatにすることで1データあたり4バイトに抑えられる
      float floatAsk = (float)currentAsk;

      uint bytesWritten = FileWriteFloat(fileHandle, floatAsk);

      if(bytesWritten > 0)
      {
         PrintFormat("書き込み成功: %s, 価格: %f, バイト数: %d", fileName, floatAsk, bytesWritten);
      }
      else
      {
         Print("書き込み失敗。エラーコード: ", GetLastError());
      }

      // 3. 必ずハンドルを閉じる
      FileClose(fileHandle);
   }
   else
   {
      Print("ファイルオープン失敗。エラーコード: ", GetLastError());
   }
}

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

① FILE_BIN フラグの指定漏れ

FileOpen 関数でファイルを開く際、必ず FILE_BIN フラグを含めてください。FILE_CSV などを指定した状態で FileWriteFloat を使おうとすると、予期せぬ動作やエラーの原因になります。

② 精度の低下(double vs float)

MQL5の価格データは通常 double(8バイト/精度が高い)です。これを float(4バイト/精度が低い)で保存すると、小数点以下の細かい桁が丸められる可能性があります。
価格の記録(1.09543など): 通常は float でも実用上の問題はありません。
複雑な計算の途中結果: 精度が重要なら FileWriteDouble を使うべきです。

③ ファイルを閉じる(FileClose)

書き込みが終わった後に FileClose を忘れると、他のプログラムからファイルにアクセスできなくなったり、データが正しく保存されなかったりします。「開いたら必ず閉じる」を徹底しましょう。

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

プログラム側でどれだけ効率的なデータ書き込み(FileWriteFloat 等)を行い、計算処理を高速化したとしても、運用環境が「自宅のPC」であれば、その努力は水の泡になる危険性があります。

FXの自動売買において、最も致命的な損失要因の一つは「ネットワーク遅延(レイテンシ)」です。自宅のインターネット回線では、証券会社のサーバーとの通信に数十〜数百ミリ秒の遅延が発生します。急激な価格変動時にこの遅延が起こると、プログラムが意図した価格から大きく外れた「不利な価格」で約定(スリッページ)してしまい、バックテストでは勝てていても実運用では資金を溶かすという結果を招きます。

プロのクオンツエンジニアが例外なく専用のVPS(仮想専用サーバー)を利用するのは、物理的に証券会社のサーバーに近い場所に環境を置くことで、この通信ラグを極限までゼロに近づけるためです。コンマ数秒を争う自動売買の世界で利益を残し続けたいのであれば、24時間安定稼働し、超低遅延なネットワークが保証されたVPS環境の構築は、手法の開発以上に優先すべき「必須のインフラ投資」と言えます。

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

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

コメント

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