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

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

MQL5のPeriod()関数は、現在そのプログラム(EAやインジケーター)が動作しているチャートの時間足(期間)を取得するための組み込み関数です。

実務レベルの開発において、この関数は単に「今の時間足を知る」以上の重要な役割を担います。例えば、スキャルピングEAを開発する際、1分足での動作を想定しているロジックが誤って日足チャートに適用されると、計算ロジックが破綻し致命的な誤発注を招く恐れがあります。

また、マルチタイムフレーム(MTF)分析を行う際にも、「現在の足」と「上位足」を区別するための基準値として頻繁に使用されます。初心者の方がよくつまずくポイントとして、Period()で取得できるのはあくまで「実行中のチャート」の期間であり、他の通貨ペアや指定した時間足の情報を取得するには別の関数(iTimeなど)が必要になるという点に注意が必要です。

2. 構文と戻り値

Period()関数の構造は非常にシンプルです。

構文

ENUM_TIMEFRAMES  Period();

パラメーター

引数(パラメーター)はありません。

戻り値

ENUM_TIMEFRAMESという列挙型の値を返します。これは内部的には整数(int型)ですが、プログラム内ではPERIOD_M1(1分足)やPERIOD_H1(1時間足)といった定義済みの定数として扱います。

代表的な戻り値の例:
PERIOD_M1: 1分足
PERIOD_M5: 5分足
PERIOD_H1: 1時間足
PERIOD_D1: 日足

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

以下のサンプルコードは、EAが初期化される際(OnInit)に現在の時間足をチェックし、特定の時間足以外では動作しないように制限をかける実用的な例です。

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   // Period()関数を使用して現在のチャートの時間足を取得
   ENUM_TIMEFRAMES currentTimeframe = Period();

   // 1時間足(PERIOD_H1)以外でチャートにセットされた場合に警告を出す
   if(currentTimeframe != PERIOD_H1)
   {
      Print("エラー: このEAは1時間足専用です。現在の設定: ", EnumToString(currentTimeframe));

      // INIT_PARAMETERS_INCORRECTを返すとEAの起動を停止できる
      return(INIT_PARAMETERS_INCORRECT);
   }

   Print("EAが正常に1時間足で起動しました。");
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // 実行中のティックごとに現在の期間をログ出力(デバッグ用)
   // 実際の実務では、時間足に応じた計算の切り替えなどに利用します
   Comment("現在のチャート期間: ", EnumToString(Period()));
}

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

Period() と _Period の違い

MQL5には、Period()という関数とは別に、_Periodという事前定義された変数が存在します。どちらも同じ「現在のチャートの期間」を返しますが、Period()は関数呼び出しであり、_Periodは変数へのアクセスです。基本的にはどちらを使っても結果は同じですが、コードの可読性を高めるためにプロジェクト内で統一することが推奨されます。

型の不一致に注意

Period()が返すのはENUM_TIMEFRAMES型です。これを単純なint型として比較することも可能ですが、MT5にはMT4よりも多くの時間足(M2, M3, H2など)が存在するため、マジックナンバー(数値)を直接書き込むのではなく、必ずPERIOD_M15のような定数名を使用してください。

切り替え時の挙動

ユーザーがチャートの時間足を途中で変更した場合、EAは一度終了(OnDeinit)し、新しい時間足で再度初期化(OnInit)されます。この際、Period()の値も新しい時間足に更新されるため、状態保持が必要なEAではグローバル変数などの管理に注意が必要です。

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

アルゴリズムトレードにおいて、Period()関数を使いこなして正確なロジックを組むことは大前提ですが、それだけでは勝てないのがFXの世界です。エンジニアが陥りがちな最大の盲点は「ネットワーク遅延(レイテンシ)」です。自宅のPCから一般的なインターネット回線を通じて注文を出す場合、どれだけコードを最適化しても、物理的な距離と経路による数ミリ秒から数百ミリ秒の遅延が必ず発生します。

この遅延は、一瞬の価格変動を捉えるEAにとって命取りとなります。スリッページが拡大し、バックテストでは利益が出ていたロジックが、実運用では約定価格の滑りによって損失に転じるケースは珍しくありません。極限まで約定スピードを高め、安定した24時間稼働を実現するためには、取引サーバーの物理的距離に近いデータセンター内に設置された「専用VPS」の導入が不可欠です。プロのクオンツエンジニアを目指すのであれば、コードの品質向上と同時に、実行環境の最適化というハード面への投資を怠ってはなりません。

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

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

コメント

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