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

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

MQL5のStringToTime関数は、指定した「日付や時刻の文字列」をMQL5が計算で扱える「datetime型(1970年1月1日からの経過秒数)」に変換する関数です。

実務においては、主に以下のようなシーンで重宝されます。

  • 外部設定(Input)からの時間指定: ユーザーがパラメーター入力欄に「2023.12.01 15:00」と入力した内容を、EA内部で判定に使う。
  • 特定のイベント時間の管理: 経済指標の発表時刻や、東京市場のオープン時刻など、特定の時間をハードコーディング(直接記述)せずに文字列から生成する。
  • ファイル・API連携: CSVファイルや外部ソースから取得した日時テキストを、バックテストや分析用の時刻データに変換する。

初心者が特につまずきやすいのは、「文字列のフォーマットが少しでも違うと、意図しない数値(0や現在の日付が付加された値)が返ってくる」という点です。これを正しく理解することが、堅牢なEA開発の第一歩となります。

2. 構文と戻り値

StringToTime関数の基本的な仕様は以下の通りです。

構文

datetime  StringToTime(
   string  value      // 日時を模した文字列
   );

パラメーター

  • value: yyyy.mm.dd [hh:mi:ss]yyyy/mm/dd [hh:mi:ss]、または hh:mi:ss といった形式の文字列を指定します。

戻り値

  • datetime型: 変換に成功すると、1970年1月1日00:00からの経過秒数が返ります。
  • 変換に失敗した場合や、不正な文字列(例: “abc”など)の場合は、0 を返します。

補足: 日付を省略して時刻(例: “15:30″)だけを渡すと、プログラム実行当日の日付が自動的に補完されたdatetime値が生成されます。

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

以下は、ユーザーが入力した「取引停止時間」を判定する実用的なコード例です。文字列を正しくdatetime型に変換し、現在のサーバー時刻と比較するロジックを実装しています。

//--- 入力パラメーター
input string TargetTimeStr = "2023.10.27 21:00"; // 停止させたい日時を入力

void OnTick()
{
    // 1. 文字列をdatetime型に変換
    datetime targetTime = StringToTime(TargetTimeStr);

    // 2. 変換チェック(エラーハンドリング)
    if(targetTime == 0)
    {
        Print("エラー:日時の指定形式が正しくありません。");
        return;
    }

    // 3. 現在のサーバー時刻を取得
    datetime currentTime = TimeCurrent();

    // 4. 時刻の比較ロジック
    if(currentTime >= targetTime)
    {
        Print("設定時刻に到達しました。トレードを制限します。");
        // ここに新規エントリー禁止やポジション決済のロジックを記述
    }
    else
    {
        // ログに出力して確認(デバッグ用)
        Comment("目標時刻まであと: ", (targetTime - currentTime), " 秒");
    }
}

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

開発時にハマりやすいポイントを整理しました。

  1. 区切り文字の厳格さ:
    基本は YYYY.MM.DD です。ドット(.)以外にもスラッシュ(/)やハイフン(-)が使える場合もありますが、プラットフォームの仕様変更や環境依存を避けるため、公式が推奨するドット形式に統一するのが最も安全です。

  2. 「時刻のみ」指定した時の挙動:
    StringToTime("10:00") と記述した場合、「コードが実行された日の10:00」として扱われます。日を跨ぐEAの場合、翌日になるとこの値は前日のまま(古いデータのまま)になる可能性があるため、動的に本日の日付を組み合わせるなどの工夫が必要です。

  3. 秒数の欠落:
    秒を省略して 2023.10.27 21:00 とした場合は、自動的に 21:00:00(00秒)として扱われます。

  4. 存在しない日付:
    2023.02.30(2月30日)のような存在しない日付を渡すと、予期せぬ挙動(あるいは0)を返すため、入力値のバリデーション(妥当性確認)は必須です。

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

アルゴリズムトレードにおいて、StringToTimeで正確なロジックを組むこと以上に重要なのが「実行環境」です。多くの個人開発者が自宅のPCでEAを稼働させがちですが、これには致命的なリスクが潜んでいます。家庭用インターネット回線は、プロバイダー経由の複雑なルートを通るため、数ミリ秒から数百ミリ秒のレイテンシ(遅延)が常時発生します。FX市場の価格は1ミリ秒以下の単位で変動しており、自宅PCからの注文が証券会社のサーバーに届く頃には、すでに不利な価格へ滑っている(スリッページが発生している)ことが多々あります。

このコンマ秒の遅延は、年間を通すと利益を大きく削り、本来なら利益が出るはずのロジックを損失へと変えてしまいます。プロのクオンツ環境に近づけるには、証券会社のサーバーと同じデータセンター内、あるいは至近距離に設置された自動売買専用のVPS(仮想専用サーバー)を利用することが不可欠です。24時間安定した電源と、超低遅延な光回線を備えたVPS環境を構築して初めて、あなたの書いた高度なアルゴリズムはその真価を発揮します。

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

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

コメント

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