【MQL5】 MT5のEA作成の勉強 その24 他の時間軸の移動平均線インジケータの作り方(3 / 3)※結論

【MQL5】 MT5のEA作成の勉強 その24 他の時間軸の移動平均線インジケータの作り方(3 / 3)※結論

まえがき

 前回と前々回で検討してきた他の時間軸の移動平均線インジケータの作り方をまとめます。前回、課題として残っていた部分を片付けた後、応用として他のインジケータ(パラボリックSAR)をマルチタイムフレーム化してみます。過去の投稿は以下を参照してください。
前回:
【MQL5】 MT5のEA作成の勉強 その23 他の時間軸の移動平均線インジケータの作り方(2 / 3)※原因
前々回:
【MQL5】 MT5のEA作成の勉強 その22 他の時間軸の移動平均線インジケータの作り方(1 / 3)※失敗例

前回の投稿の残件 (表示が点滅する、15分と1時間の決め打ちになっている)

 前回の投稿で後日検討するとした、表示が点滅する件については、OnCalculate()関数の最初に以下のコードを入れることで解決できました。使用しているArrayInitializeは配列を初期化する関数で、prev_calculated=0、即ち、初回ループのみ、描画用のバッファを初期化しています。

   if(prev_calculated==0)
   {
      start=MA_Period;
      ArrayInitialize(CurrentBuffer,0);
      ArrayInitialize(LongBuffer,0);
   }
   else
      start=prev_calculated;

 次の、15分と1時間の軸にしか対応していなかった問題については、前回の投稿で4としていた部分(15分x4=1時間のため)を、倍数nに置き換えて、現在の時間軸と、長期時間軸の倍数を入力するようにしました。この時、倍数は以下の方法で取得します。ここで使っているPeriodSecondsは時間軸(TimeFrame)の秒数を返します。

int n = (int)(PeriodSeconds(LongTimeFrame) / PeriodSeconds(PERIOD_CURRENT));  

実行結果

 上記の修正と、おまけとして、前回省略していた超長期移動平均線も合わせて、計3本の移動平均線を表示できるようにしました。以下が実行結果です。黄色、オレンジ、赤の線はそれぞれ、現在の時間軸(15min)と1時間の時間軸、4時間の時間軸です。滑らかな線は比較用に現在の時間軸の平均化期間を4倍、16倍にして、疑似的に長い時間軸に合わせた線です。

移動平均線インジケータ設定画面
移動平均線インジケータ設定画面
移動平均線インジケータを適用した画面(滑らかな線の平均化期間は、黄色7、オレンジ28、赤112)
移動平均線インジケータを適用した画面(滑らかな線の平均化期間は、黄色7、オレンジ28、赤112)

 ちょっと、平均化期間を伸ばした線との時間のずれが大きすぎるような・・・?しかし、後述するパラボリックSARを同じ方法でマルチタイムフレーム化したときは、パラボリックSARの特性に従って動いていたので、きちんと合っているとおもわれます。表示が見にくくなるので避けていますが、画像範囲の左側には強い上昇トレンドがあります。長期時間軸を使って引いた移動平均線は、特にトレンド相場において、短期時間軸で平均化期間を伸ばした場合の平均線に比べて価格に近い挙動をするようです。

別のインジケータに適用(パラボリックSARをマルチタイムフレーム化)

 次に パラボリックSARをマルチタイムフレーム化 してみます。過去二回でややこしい設定を乗り越えたおかげで、書き換えはとても楽でした。移動平均線用の入力変数をパラボリックSAR用のそれに変更し、移動平均線の値を取得するiMA関数を、パラボリックSARの値を取得するiSARに変更して、引数を入力変数に書き換えたら出来上がりです。具体的には、前々回の投稿で紹介したOninit()関数の、移動平均線インジケータ取得部分を以下のように変更します。

//--- 現在の時間軸に対するSAR
   if((CurrentHandle=iSAR(NULL,0,SAR_step,SAR_max))==INVALID_HANDLE)
   {
   Print("Error initialize iMA handle (Current)");
   return(INIT_FAILED);
   }
//--- 長期の時間軸に対するSAR
   if((LongHandle=iSAR(NULL,LongTimeFrame,SAR_step,SAR_max))==INVALID_HANDLE)
   {
   Print("Error initialize iMA handle (Long)");
   return(INIT_FAILED);
   }
//--- 超長期の時間軸に対するSAR
   if((VeryLongHandle=iSAR(NULL,VeryLongTimeFrame,SAR_step,SAR_max))==INVALID_HANDLE)
   {
   Print("Error initialize iMA handle (VeryLong)");
   return(INIT_FAILED);
   }
   

実行結果は以下のようになりました。

マルチタイムフレーム化したパラボリックSARの設定画面
マルチタイムフレーム化したパラボリックSARの設定画面
 マルチタイムフレーム化したパラボリックSARの表示結果
マルチタイムフレーム化したパラボリックSARの表示結果

 普通、パラボリックSARは点で表現されますが、今回は線で表現しています。パラボリックSARは、値が価格と交差したタイミングで、価格をまたいで値が変動する特性があります。それを踏まえて表示結果を見ると、赤やオレンジの線の横軸と平行になっている部分と価格が交わった直後の値の変化は価格をまたぐようになっており、表示時刻などにずれはないとみて良いでしょう。

まとめ

 これで、インジケータのマルチタイムフレーム化についての学習は一旦終了したいと思います。配列の仕様が本当に紛らわしく、かなりハマってしまいましたが、無事に成功してよかったです。せっかくなので、作ったインジケータはいずれゴゴジャンで後悔したいと思っています。ご興味ある方は使って頂けると嬉しいです。
・・・最近本業が火を吹いているので、ちょっと遅れるかもですが(;・∀・)。