【インジケーター】MTF_RSIを作る

今回は、MTF_RSIについてお話ししたいと思います。

MTF_RSIとは、上位足のRSIを表示するMTFインジケーターのことです。

例えば、1分足チャートに5分足のRSIや15分足のRSIを表示するといったものです。

目次

ネットでよく見かけるもの

ネットで検索すると、同じようなものが簡単に見つかりますが、正直おかしいなと思うものばかりなので、自分のものとの違いについてもお話ししたいと思います。

まずはこちらの画面で比較してみましょう。

こちらのインジケーターは、青いラインが1分足のRSI(14)で、黄色が15分足のRSI(14)を、1分足チャートに表示しているものです。

この違い分かりますか?

そうです、下のインジケーターは黄色いラインが階段状に表示されているんです。

エイツ
説明のためにわざわざ作りました…

階段状に表示される理由

この理由は簡単で、上位足のRSI値を求める際に

iRSI関数を使っているから

です。

関数を使った求め方は以下の通りです。

iRSI(NULL,PERIOD_M15,14,PRICE_CLOSE,M15_Shift);

上位足のRSI値は、このような関数で取得できますが、最後の引数にある「M15_Shift」が原因です。

ただ、これが間違っているというわけではなく、この関数を使ったら当然階段状になってしまうよねって話です。

この関数で取得できるRSI値は

15分足が確定した際の終値を使って計算されている

ってことです。

15分足は1分足で言うと、0分から14分のロウソク足で構成されています。

15分足は、14分59秒でロウソク足が確定することになるので、iRSI関数を使ってしまうと確定した14分足の部分で値が計算されてしまうことになるんです。

エイツ
説明が難しい。分かります…?

ほとんどの人が、この関数を使ってコードを書いてるんだなぁと感じました。

本来のMTF_RSIはどんなもの?

1分足チャートは当然1分単位で新しい足が追加されていきます。

また、15分足もロウソク足が確定されるまでの間、チャートが上下に動くのでロウソク足の形もその都度変化しています。

なので、本来ならば

上位足のRSIを現在足単位で表示するインジケーター

を作らなければいけないのです。

今回のでいうと、15分足のRSIを1分単位で表示するインジケーターになります。

どうやって作るの?

トレードエンジニアを目指すのであれば、ぜひチャレンジしていただきたいです。

まずは、MT4に標準搭載されているRSIインジケーターをMeta Editor で開いて、実際にコードを確認してみると良いです。

RSIの計算式は、1本目の計算式と2本目以降の計算式が異なります。

1本目の部分は以下の部分です。

      //--- first RSIPeriod values of the indicator are not calculated
      ExtRSIBuffer[0]=0.0;
      ExtPosBuffer[0]=0.0;
      ExtNegBuffer[0]=0.0;
      double sump=0.0;
      double sumn=0.0;
      for(i=1; i<=InpRSIPeriod; i++)
        {
         ExtRSIBuffer[i]=0.0;
         ExtPosBuffer[i]=0.0;
         ExtNegBuffer[i]=0.0;
         diff=close[i]-close[i-1];
         if(diff>0)
            sump+=diff;
         else
            sumn-=diff;
        }
      //--- calculate first visible value
      ExtPosBuffer[InpRSIPeriod]=sump/InpRSIPeriod;
      ExtNegBuffer[InpRSIPeriod]=sumn/InpRSIPeriod;
      if(ExtNegBuffer[InpRSIPeriod]!=0.0)
         ExtRSIBuffer[InpRSIPeriod]=100.0-(100.0/(1.0+ExtPosBuffer[InpRSIPeriod]/ExtNegBuffer[InpRSIPeriod]));
      else
        {
         if(ExtPosBuffer[InpRSIPeriod]!=0.0)
            ExtRSIBuffer[InpRSIPeriod]=100.0;
         else
            ExtRSIBuffer[InpRSIPeriod]=50.0;
        }

2本目以降に該当する部分は以下の通りです。

   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      diff=close[i]-close[i-1];
      ExtPosBuffer[i]=(ExtPosBuffer[i-1]*(InpRSIPeriod-1)+(diff>0.0?diff:0.0))/InpRSIPeriod;
      ExtNegBuffer[i]=(ExtNegBuffer[i-1]*(InpRSIPeriod-1)+(diff<0.0?-diff:0.0))/InpRSIPeriod;
      if(ExtNegBuffer[i]!=0.0)
         ExtRSIBuffer[i]=100.0-100.0/(1+ExtPosBuffer[i]/ExtNegBuffer[i]);
      else
        {
         if(ExtPosBuffer[i]!=0.0)
            ExtRSIBuffer[i]=100.0;
         else
            ExtRSIBuffer[i]=50.0;
        }
     }

この計算式を同じように上位足に適用させればいいって感じです。

【YouTube動画公開】現在足チャートに上位足のRSI値を表示するMTF RSI

【2023/08/09追記】

作り方の説明がとても難しいので、上記のように雑な説明になってしまいました。多くの方から作り方の問い合わせを頂きましたが個別対応が難しいので、いっそのこと動画にしました。是非ご覧ください。

このインジケーターはどう役立つの?

このインジケーターの使い方は人それぞれかと思いますが、RSIを使ってトレードしている人も多いかと思います。

現在足のRSI値だけでトレードしている人は、上位足のRSI値を組み合わせてバックテストを取ると良い結果が見つかるかもしれません!

例えば、簡単に思いつくところで言うと以下のようなことですかね。

  • 現在足のRSI値より上位足のRSI値が高い / 低い
  • 上位足のRSI値が〇本前から閾値を超えている
  • 上位足のRSI値が50未満なのに、現在足のRSI値が70以上 とか

バックテストの場合は、iRSIを使っても問題ないんですけどね。笑

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次