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

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

FileWriteDoubleは、MQL5で数値をバイナリ形式でファイルに書き出すための関数です。
通常、ログ出力や簡単なレポート作成にはFileWrite(テキスト形式/CSV形式)が使われますが、クオンツ・エンジニアが機械学習の学習データ作成や、数百万行に及ぶティックデータの保存を行う場合、この「バイナリ形式」での保存が必須となります。

実務での活用シーン:
* 機械学習用の特徴量保存: 指標の値を高精度かつ高速に保存し、Python等の外部ツールで解析する。
* バックテストの高速化: 巨大なデータをテキスト形式で扱うと読み込みに時間がかかりますが、バイナリ形式なら圧倒的に高速です。
* 独自データベースの構築: 独自のインジケーター値や約定履歴をバイナリで保持し、ストレージ容量を節約する。

初心者が特につまずきやすい点は、この関数で保存したファイルを「メモ帳(テキストエディタ)で開いても文字化けして読めない」という点です。これはエラーではなく、データが「文字」ではなく「数値の生データ」として保存されている証拠です。


2. 構文と戻り値

FileWriteDouble関数の構文は非常にシンプルです。

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

パラメーター

  1. file_handle: FileOpen() 関数によって返されたファイルハンドルを指定します。この際、FileOpen のフラグに必ず FILE_BIN を含める必要があります。
  2. value: 保存したい double 型(倍精度浮動小数点数)の値です。

戻り値

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

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

以下は、現在のチャートの終値(Close価格)をバイナリファイルに記録するシンプルなスクリプトの例です。

//+------------------------------------------------------------------+
//|                                              SampleWriteDouble.mq5|
//+------------------------------------------------------------------+
void OnStart()
{
    string fileName = "ClosePrices.bin";

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

    if(fileHandle != INVALID_HANDLE)
    {
        Print("書き込み開始: ", fileName);

        // 直近100本の終値をバイナリで保存
        for(int i = 0; i < 100; i++)
        {
            double closePrice = iClose(_Symbol, _Period, i);

            // double型の値を書き込む
            uint bytesWritten = FileWriteDouble(fileHandle, closePrice);

            if(bytesWritten == 0)
            {
                Print("書き込みエラー。Error Code: ", GetLastError());
                break;
            }
        }

        // 2. ファイルを必ず閉じる
        FileClose(fileHandle);
        Print("書き込み完了。");
    }
    else
    {
        Print("ファイルが開けませんでした。Error Code: ", GetLastError());
    }
}

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

① FILE_BIN フラグの忘れ

FileOpen を行う際、FILE_CSVFILE_TXT を指定した状態で FileWriteDouble を使うと、意図しないデータ破壊やエラーの原因となります。バイナリ操作には必ず FILE_BIN を使用してください。

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

FileWriteDouble を呼び出すたびに、ファイル内の「書き込み位置(ポインタ)」は8バイトずつ後ろに移動します。既存のファイルの末尾に追記したい場合は、FileSeek 関数でポインタを末尾へ移動させる必要があります。

③ 読み込み時も「Double」で

バイナリファイルは「どの型で書き込んだか」という情報を持っていません。FileWriteDouble で書き込んだデータは、必ず FileReadDouble で読み込む必要があります。型を混ぜて(例:intで書き込んでdoubleで読む)保存すると、全く無意味な数値として読み出されてしまいます。


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

アルゴリズムトレードにおいて、ロジックと同じ、あるいはそれ以上に重要なのが「実行環境」です。多くの開発者が自宅のPCでMT5を稼働させようとしますが、これはプロの視点から見ると非常にリスクが高い選択です。家庭用インターネット回線は、ブローカーのサーバーがあるデータセンターとの物理的距離が遠く、ネットワーク遅延(レイテンシ)が数ミリ秒〜数十ミリ秒単位で発生します。この遅延は、スリッページを増大させ、バックテストの結果と実際の運用成績を乖離させる最大の要因となります。

特に、一瞬の価格変動で利益を確定させるスキャルピングや高頻度取引(HFT)に近いロジックでは、自宅PCでの運用は致命的な損失を生む「環境の罠」と言えます。極限まで約定スピードを高め、優位性を確保するためには、ブローカーのサーバーに物理的に近い場所に設置された専用のVPS(仮想専用サーバー)の利用が必須です。24時間安定した稼働と超低遅延なネットワーク環境を整えることこそが、クオンツとして市場で生き残るための最低条件です。

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

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

コメント

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