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

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

FileReadDatetimeは、MQL5で開いたファイルから「日付と時刻(datetime型)」のデータを取り出すための関数です。

実務開発において、この関数は「EAを再起動しても過去の特定の時間を記憶させておきたい」という場面で非常に重宝します。例えば、以下のようなケースです。

  • 最後にトレードした時間を記録: 1日に1回しかエントリーしないロジックで、前回の約定時間を保存しておく。
  • ニュースイベントの回避: 経済指標発表後のボラティリティが高い時間を特定し、その時間をまたいでEAが停止していた場合でも正しく判定を継続させる。
  • バックテストデータの読み込み: 外部で作成したシグナル発生時間のリストを読み込み、MT5上で再現する。

初心者が特につまずきやすいのは、「ファイルポインタ」の概念です。ファイルを読み進めると「今どこまで読んだか」という指針(ポインタ)が移動します。この挙動を理解せずにループ処理を行うと、予期せぬ場所から時刻を読み取ってしまい、1970年1月1日(datetimeのゼロ点)が返ってくるといったバグに直面します。

2. 構文と戻り値

FileReadDatetimeの構文は非常にシンプルです。

datetime FileReadDatetime(
   int  file_handle    // ファイルハンドル
);

パラメーター

  • file_handle: FileOpen関数によって返されたファイル識別用のハンドル番号です。

戻り値

  • 読み込みに成功した場合、ファイルから読み取ったdatetime型(1970年1月1日からの経過秒数)の値を返します。
  • ファイルポインタが終端に達している場合や、読み込みに失敗した場合は0を返します。

※バイナリファイル(FILE_BIN)から読み込む場合、8バイトのデータがdatetimeとして読み取られます。CSVファイル(FILE_CSV)の場合は、文字列として書かれた日付が自動的に変換されます。

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

以下のサンプルは、EAが最後に起動した時間をファイルに記録し、次回起動時にその時間をログに出力する「簡易的な起動ログ機能」を実装したものです。

//+------------------------------------------------------------------+
//|                                           SampleFileReadTime.mq5 |
//+------------------------------------------------------------------+
#property strict

// ファイル名
const string FileName = "LastRunTime.dat";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // 1. 読み取りモードでファイルを開く
    int file_handle = FileOpen(FileName, FILE_READ|FILE_BIN);

    if(file_handle != INVALID_HANDLE)
    {
        // 2. 前回の起動時間を読み込む
        datetime last_time = FileReadDatetime(file_handle);

        if(last_time > 0)
        {
            Print("前回のEA起動時刻: ", TimeToString(last_time, TIME_DATE|TIME_SECONDS));
        }
        else
        {
            Print("前回の記録はありません。");
        }

        // ハンドルを閉じる
        FileClose(file_handle);
    }
    else
    {
        Print("ファイルが見つかりません(初回起動など)");
    }

    // --- 今回の起動時間を保存する処理 ---

    // 3. 書き込みモードでファイルを開き直す
    file_handle = FileOpen(FileName, FILE_WRITE|FILE_BIN);

    if(file_handle != INVALID_HANDLE)
    {
        datetime current_time = TimeCurrent();
        // 現在時刻を書き込む
        FileWriteDatetime(file_handle, current_time);
        FileClose(file_handle);
        Print("今回の起動時刻を保存しました: ", TimeToString(current_time));
    }

    return(INIT_SUCCEEDED);
}

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

  1. ファイルオープンモードの不一致
    FileReadDatetimeを使用するには、FileOpen時に必ずFILE_READフラグを含める必要があります。また、バイナリ形式で保存したものをテキストモードで読もうとすると、全く異なる数値が返ってくるため、保存時と読み込み時のフラグ(FILE_BINFILE_CSV)は必ず統一してください。

  2. ファイルポインタの確認
    大きなファイルをループで読み込む際は、FileIsEnding(file_handle)関数を併用し、ファイルの終端に達していないかを確認しながら読み取ることが重要です。

  3. 時刻フォーマットの罠(CSVの場合)
    CSVファイルから読み込む場合、日付の形式が「YYYY.MM.DD HH:MM:SS」といった標準的なMQL5の形式になっていないと、正しく変換されず0を返すことがあります。

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

どれほど完璧なアルゴリズムを書き、FileReadDatetimeで正確に時間を管理できたとしても、プログラムを実行する「環境」が劣悪であれば、FXの世界では勝負になりません。多くの開発者が陥る罠が、自宅のデスクトップPCやノートPCでEAを稼働させてしまうことです。

自宅PCでの運用は、プロバイダー経由のネットワーク遅延(レイテンシ)が発生し、MT5上のシグナル発生から証券会社サーバーへの注文到達までに致命的なタイムラグを生みます。特に指標発表時などの激しい値動きの中では、この数ミリ秒の遅れが「スリッページ」を増大させ、本来得られるはずだった利益を消失させるだけでなく、損切りが遅れて多大な損失を招く原因となります。

極限まで約定スピードを高め、プロと同じ土俵で戦うためには、証券会社のサーバーに物理的に近いデータセンターに設置された「専用VPS」の導入が不可欠です。24時間365日、安定した電源と超高速・低遅延のネットワーク環境下でEAを稼働させることこそが、技術者が最初に整えるべき「勝つためのインフラ」です。

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

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

コメント

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