【MQL5】 MT5のEA作成の勉強 その20 ENUM_TIMEFRAMESでマルチタイムフレーム分析 (MTF分析)

【MQL5】 MT5のEA作成の勉強 その20 ENUM_TIMEFRAMESでマルチタイムフレーム分析 (MTF分析)

まえがき

  ENUM_TIMEFRAMESを使って、マルチタイムフレーム分析 (MTF分析) を行います。MTF分析とは、上位足(現在みているチャートより長い時間軸のチャート)を見ることで、現在のチャートのトレンドが、長期的なトレンドに従っているかどうかを判断する手法です。
 この手法をEAに導入するためには、任意の時間軸の価格やインジケーターを取得する必要がありますが、ちょっと癖があるようなのでメモしておきます。

1時間足の移動平均線を取得

 まずは手始めに一時間足の移動平均線を取得します。移動平均線の取得はiMA関数で行います。この時、第2引数の「period」に、「PERIOD_H1」と入力します。この「PERIOD_H1」は ENUM_TIMEFRAMESに含まれており、ここに含まれるIDを入力することで、任意の時間軸の移動平均線を取得できます。ちなみに、「PERIOD_CURRENT」または「0」を入力すると、現在のチャートの時間軸となります。

m_handle_ma=iMA(NULL,0,PERIOD_H1,MAShift,MODE_SMA,PRICE_OPEN)

 後は、以下の投稿で紹介した方法で、移動平均線を基にEAを作ってデバッグモードで起動すると、テスターの下部に、テスターで指定している15分足とは別に、先ほど移動平均線に指定した1時間足タブが存在し、タブを選択するとチャートが表示されます。(しれっと4時間足もありますが、これも同じ方法で加えたものです。)

【MQL5】 MT5のEA作成の勉強 その16 EA / インジケータにテクニカル指標導入

マルチタイムフレーム分析 (MTF分析)チャート
マルチタイムフレーム分析 (MTF分析) チャート

ENUM_TIMEFRAMESの要素番号で動的に任意の時間軸の移動平均線を取得(失敗)

 次に、 ENUM_TIMEFRAMESの要素番号で動的に任意の時間軸の移動平均線を取得することを考えました。当初、ENUM_TIMEFRAMESは列挙型なので、[0]が「PERIOD_CURRENT」なら、公式リファレンスの表の順番に従って、[1]=「PERIOD_M1」、[9]=「PERIOD_M15」 、[12]=「PERIOD_H1」・・・となってゆくと考えました。
 しかし、一時間軸を指定するため、[12]を選択してみたところ、「PERIOD_M12」が割り当てられてしまいました。

ENUM_TIMEFRAMESの中身を確認

 そこで、試しにENUM_TIMEFRAMESの中身を確認したところ、以下のようになっていました。なお、値の確認のために、以下の投稿で学んだように、一度変数に格納する必要があるため、 ENUM_TIMEFRAMESの型変数timeFramesを作成し、その値を確認しています。

MQL5】 MT5のEA作成の勉強 その18 デバッグモードで変数の値を確認する方法

ENUM_TIMEFRAMESの中身
ENUM_TIMEFRAMESの中身

公式リファレンスの表に含まれる時間軸は○○分 = [○○]の対応関係で含まれている

ようです。 ただし、表に無いものはエラーになるようなので注意が必要です。では、一時間軸の指定は60分ということで、要素番号[60]を指定すればよいかと思ったのですが、結果は以下のようにうまく行きませんでした。

ENUM_TIMEFRAMESの中身 ([60]周辺)
ENUM_TIMEFRAMESの中身 ([60]周辺)

 ○○分 = [○○]の対応関係が成立するのは30分の時間軸以下までのようで、それ以上の要素番号は少なくとも[300]までは全て 「unknown value」になっていました。

ENUM_TIMEFRAMESを使って動的に任意の時間軸の移動平均線を取得するには?

 結局、これまでのところ、 ENUM_TIMEFRAMESを使って動的に任意の時間軸の移動平均線を取得するには、ユーザーの入力に応じて、 ENUM_TIMEFRAMESに含まれる値を割り当てるしかないようです。即ち、以下のようなコードです。 「LongMATIMEFRAME」に0~6の値を入力すると、それに対応した時間軸を割り当てるのですが、ユーザーからすると数値と時間軸の対応を覚える必要があり、大変めんどくさいですが、一応、動的に任意の時間軸の移動平均線を取得することができるようになりました。

   ENUM_TIMEFRAMES longtimeFrame;
   switch(LongMATIMEFRAME)
        {
         case 0:  
            longtimeFrame = PERIOD_M5;
         case 1:
            longtimeFrame = PERIOD_M15;
         case 2:
            longtimeFrame = PERIOD_H1;
         case 3:
            longtimeFrame = PERIOD_H4;
         case 4:
            longtimeFrame = PERIOD_H12;
         case 5:
            longtimeFrame = PERIOD_D1;
         case 6:
            longtimeFrame = PERIOD_W1;
         default:
            return(false);
        }
   if(m_handle_ma2==INVALID_HANDLE)
   {
      if((m_handle_ma2=iMA(NULL,longtimeFrame,MAPeriod,MAShift,ENUM_MA_METHOD(MAType),PRICE_OPEN))==INVALID_HANDLE)
      {
         printf("Error creating Long MA indicator");
         return(false);
      } 
   }

まとめ

 マルチタイムフレーム分析(MTF分析)を行うために、任意の時間軸の移動平均線を取得する方法を学びました。同じ方法で、別の時間軸の価格や、他のインジケータも取得できます。