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

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

PeriodSecondsは、指定した時間軸(タイムフレーム)が「何秒間か」を整数値で取得するための関数です。例えば、1分足(PERIOD_M1)なら60、1時間足(PERIOD_H1)なら3600という数値を返します。

実務レベルの開発において、この関数は「時間のハードコーディング(直書き)」を防ぐために極めて重要です。初心者のうちは「1分足だから60秒」と直接プログラムに書き込みがちですが、これではEAを他の時間軸で運用する際にコードを書き直さなければならず、バグの温床となります。

実務での主な活用シーン:
新足の確定判定: 現在の足が閉じるまでの残り時間を計算する。
テクニカル指標の正規化: 異なる時間軸でも同じ時間幅(例:過去1時間分のボラティリティ)を計算する。
動的な待機処理: インジケーターの計算負荷を減らすため、次の足が出る直前まで処理をスキップさせる。

「現在のチャートが何分足であっても、動的に秒数を取得できる」という柔軟性が、堅牢なシステム構築の第一歩となります。

2. 構文と戻り値

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

int  PeriodSeconds(
   ENUM_TIMEFRAMES  period=PERIOD_CURRENT      // 期間(タイムフレーム)
   );
  • パラメーター(period):
    秒数を知りたい時間軸を指定します。ENUM_TIMEFRAMES型の定数(PERIOD_M1, PERIOD_H4, PERIOD_D1など)を渡します。引数を省略した場合は、現在のチャートの時間軸(PERIOD_CURRENT)が適用されます。
  • 戻り値:
    指定した時間軸の1本のローソク足に含まれる秒数をint型で返します。

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

以下は、PeriodSecondsを活用して「現在のローソク足が確定するまであと何秒か」をチャート上にリアルタイムで表示するEAのサンプルコードです。

//+------------------------------------------------------------------+
//|                                     Sample_PeriodSeconds.mq5     |
//|                                  Copyright 2024, Quant Engineer  |
//+------------------------------------------------------------------+
#property strict

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // 1. 現在のチャートの時間軸の総秒数を取得
   int totalSecondsInBar = PeriodSeconds(PERIOD_CURRENT);

   // 2. 現在の足の開始時刻を取得
   datetime barStartTime = iTime(_Symbol, PERIOD_CURRENT, 0);

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

   // 4. 足が確定するまでの残り時間を計算
   // (足の開始時刻 + 足の総秒数) - 現在時刻
   int secondsRemaining = (int)(barStartTime + totalSecondsInBar - currentTime);

   // 5. チャート上に情報を表示
   string message = StringFormat("現在の時間軸: %d 秒\n足の確定まであと: %d 秒", 
                                 totalSecondsInBar, 
                                 secondsRemaining);

   Comment(message);

   // 応用例:残り5秒以内ならログに出力
   if(secondsRemaining <= 5 && secondsRemaining > 0)
   {
      Print("まもなく足が確定します。シグナルチェックを開始します。");
   }
}

このコードでは、PeriodSecondsを使うことで、M1(1分足)でもH1(1時間足)でも、コードを変更することなく自動的に残り秒数を算出できます。

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

開発時に注意すべき点は以下の通りです。

  1. 戻り値の型に注意:
    PeriodSecondsint型を返します。通常は問題ありませんが、MQL5で時間を扱うdatetime型と計算を行う際は、型キャスト(型変換)を意識するとコンパイル警告を避けることができ、よりプロフェッショナルなコードになります。

  2. ティックの空白時間に注意:
    上記のサンプルコードで「残り秒数」を計算していますが、FX市場では常にティックが動いているわけではありません。特に流動性が低い時間帯は、数秒間ティックが飛ばないことがあります。その間OnTickは動かないため、計算結果が更新されない(画面上の数字が止まる)ことがある点に留意してください。

  3. 不正な引数:
    ENUM_TIMEFRAMESに定義されていない数値を無理やり渡すと、予期しない動作をする可能性があります。必ず組み込みの列挙型定数を使用しましょう。

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

アルゴリズムの論理構成が完璧であっても、それを実行する「物理環境」が脆弱であれば、利益は一瞬でスリッページへと消えていきます。日本の自宅PCから海外の証券サーバーへ注文を出す場合、ネットワークの物理的な距離により数百ミリ秒の「レイテンシ(遅延)」が発生します。相場急変時にはこのわずかな遅延が命取りとなり、意図しない価格での約定や、最悪の場合リジェクト(注文拒否)を招きます。

プロのクオンツエンジニアが共通して行う対策は、証券会社のサーバーに物理的に近い場所にある「専用のVPS(仮想専用サーバー)」の利用です。VPSを利用することでネットワーク経路を最短化し、約定スピードを極限まで高めることが可能です。自宅PCでの運用は停電やOSのアップデート、回線トラブルといったリスクも抱えています。安定した利益を積み上げるシストレ開発者を目指すのであれば、信頼性の高いVPS環境の構築は、手法の開発以上に優先すべき投資と言えます。

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

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

コメント

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