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

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

MQL5の ChartPeriod 関数は、指定したチャートの時間軸(タイムフレーム)を取得するための関数です。戻り値として ENUM_TIMEFRAMES 型の値を返し、現在どの時間足のチャート上でプログラムが動作しているか、あるいは特定したチャートがどの時間足かを出力します。

実務での活用法

実務開発において、この関数は「ロジックの動的な切り替え」に頻繁に使用されます。例えば、同じEA(エキスパートアドバイザー)を5分足と1時間足の両方で動かす際、5分足なら損切り幅を20pips、1時間足なら100pipsといったように、時間軸に応じて内部パラメータを自動調整するロジックを組む場合に必須となります。

また、マルチチャート・システム(複数の通貨ペアや時間足を監視するツール)を作成する際、どのチャートで何が起きているかを識別するためにも利用されます。

初心者がつまずきやすいポイント

多くの初心者は、チャートの時間軸を単なる「数値(分)」として扱おうとします。しかし、MQL5の ChartPeriod が返すのは数値ではなく、列挙型(ENUM_TIMEFRAMES)です。例えば、1時間足を「60」という整数で期待して比較演算を行うと、型不一致や意図しない動作を招くことがあります。この戻り値の型に対する理解が、正確なシストレ開発の第一歩となります。


2. 構文と戻り値

ChartPeriod 関数の基本的な構文は以下の通りです。

ENUM_TIMEFRAMES  ChartPeriod(
   long  chart_id=0      // チャートID(デフォルトは0:現在のチャート)
   );

パラメーター

  • chart_id: 操作対象のチャートIDを指定します。省略した場合や「0」を指定した場合は、現在のプログラムが稼働しているチャートが対象となります。

戻り値

  • ENUM_TIMEFRAMES: 指定されたチャートの時間軸を返します。
  • 例:PERIOD_M1 (1分足), PERIOD_H1 (1時間足), PERIOD_D1 (日足) など。

なお、単に現在のチャートの時間軸を知りたいだけであれば、グローバル変数である _Period を参照する方が処理速度がわずかに速く、コードも簡潔になります。ChartPeriod は、自分以外のチャート情報を取得したい場合に特に有効な関数です。


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

以下のコードは、EAがセットされたチャートの時間軸を判定し、それに基づいて損切り幅(Stop Loss)を動的に変更する実用的なサンプルです。

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

// OnInit関数:EA開始時に一度だけ実行される
int OnInit()
{
   // ChartPeriodを使用して現在のチャートの時間軸を取得
   ENUM_TIMEFRAMES currentTimeframe = ChartPeriod(0);

   double stopLossPips;
   string timeframeName = EnumToString(currentTimeframe);

   // 時間軸に応じてロジック(損切り幅)を分岐
   switch(currentTimeframe)
   {
      case PERIOD_M1:
      case PERIOD_M5:
         stopLossPips = 15.0; // 短期足はタイトに
         break;

      case PERIOD_M15:
      case PERIOD_M30:
         stopLossPips = 30.0;
         break;

      case PERIOD_H1:
         stopLossPips = 50.0;
         break;

      default:
         stopLossPips = 100.0; // それ以上の長期足
         break;
   }

   PrintFormat("現在のチャート: %s | 設定されたSL: %.1f pips", timeframeName, stopLossPips);

   return(INIT_SUCCEEDED);
}

// OnTick関数:価格が動くたびに実行される
void OnTick()
{
   // 実際のトレードロジックをここに記述
}

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

1. 戻り値を整数として比較しない

PERIOD_M1 は数値としての「1」ではありません(MQL5の内部的な定義値は異なります)。
誤り: if(ChartPeriod() == 1)
正解: if(ChartPeriod() == PERIOD_M1)
このように、必ず定数名を使用して比較を行ってください。

2. 分単位の数値を取得したい場合

「現在足は何分か?」という数値を計算に用いたい場合は、PeriodSeconds() 関数を組み合わせて以下のように算出するのが一般的です。

int minutes = PeriodSeconds(PERIOD_CURRENT) / 60;

3. 他のチャートID指定時のエラー

chart_id に存在しないIDを指定した場合、関数は 0 を返しますが、これは PERIOD_CURRENT と同じ値として解釈されるリスクがあります。他のチャートを指定する場合は、そのチャートが実際に開いているかを確認するエラーハンドリングが実務上は重要です。


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

プロのクオンツエンジニアの視点から断言しますが、アルゴリズムの優位性と同じくらい重要なのが「実行環境」です。どれほど ChartPeriod を駆使して精緻なロジックを組んだとしても、自宅のPCと一般的な光回線で運用している限り、機関投資家やプロのトレーダーには勝てません。その最大の理由はネットワーク遅延(レイテンシ)にあります。

FXの価格はミリ秒単位で変動しており、自宅PCから発注された注文が証券会社のサーバーに届くまでのわずかな遅延が、滑り(スリッページ)を引き起こし、期待期待値を大幅に削り取ります。特にボラティリティが高い局面では、数ミリ秒の差が致命的な損失に直結します。24時間安定して稼働し、証券会社サーバーと物理的に距離が近い専用のVPS(仮想専用サーバー)を利用することは、初心者から脱却し、シストレで利益を残すための「最低限のインフラ投資」です。

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

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

コメント

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