スルトノフ型差分計 - ページ 41

 
Dmitry Fedoseev:

5分後にコードが表示されます。RSIは指数平滑化と同じで周期が長いワイルダースムージングを使用しているため、ミスマッチが目立つ場合があることに留意してください。


何を準備するのか?RSIからメインバッファを捨て、その代わりに既存の2つのバッファを配置します。

//+------------------------------------------------------------------+
//|                                                          RSI.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "https://www.mql4.com"
#property description "Relative Strength Index"
#property strict

#property indicator_separate_window
#property indicator_buffers    2
#property  indicator_color1     clrBlue
#property  indicator_color2     clrRed

//--- input parameters
input int InpRSIPeriod=14; // RSI Period
//--- buffers
double ExtPosBuffer[];
double ExtNegBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   string short_name;
//--- 2 additional buffers are used for counting.
   SetIndexBuffer(0,ExtPosBuffer);
   SetIndexBuffer(1,ExtNegBuffer);
//--- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
//--- name for DataWindow and indicator subwindow label
   short_name="RSI("+string(InpRSIPeriod)+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
//--- check for input
   if(InpRSIPeriod<2)
     {
      Print("Incorrect value for input variable InpRSIPeriod = ",InpRSIPeriod);
      return(INIT_FAILED);
     }
//---
   SetIndexDrawBegin(0,InpRSIPeriod);
//--- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int    i,pos;
   double diff;
//---
   if(Bars<=InpRSIPeriod || InpRSIPeriod<2)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtPosBuffer,false);
   ArraySetAsSeries(ExtNegBuffer,false);
   ArraySetAsSeries(close,false);
//--- preliminary calculations
   pos=prev_calculated-1;
   if(pos<=InpRSIPeriod)
     {
      //--- first RSIPeriod values of the indicator are not calculated
      ExtPosBuffer[0]=0.0;
      ExtNegBuffer[0]=0.0;
      double sump=0.0;
      double sumn=0.0;
      for(i=1; i<=InpRSIPeriod; i++)
        {
         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;
      //--- prepare the position value for main calculation
      pos=InpRSIPeriod+1;
     }
//--- the main loop of calculations
   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;
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
そこにスムージングはありません。そして、ベアの強 さに童子も含まれているところが計算の違いです。そこが違うところです。DAはこれを考慮に入れています。
 
Dmitry Fedoseev:

5分後にコードが表示されます。RSIは指数関数と同じで周期が長いワイルダースムージングを使用しているため、ミスマッチが目立つ場合があることに留意してください。

もう手を引くんですか?
 

添付はインジケーターです。

パラメータ

period - 小節単位の期間。

Components- コンポーネント計算オプション。

  • c_rsi - RSI の場合.
  • c_adx - ADXの場合
  • c_x - RSIと同様ですが、期間ではなく、実際の増分値で分割します。

スムース- 滑らかな方法。

  • s_wilder - ワイルダー法
  • s_ema - 指数平滑化。
RSIの成分はWilderで平滑化され、ADXの成分は従来の指数法で平滑化されていることに留意してください(つまり、RSIの期間14はADXの期間27に相当します)。

パワー- 最終ラインの計算方法。

  • f_off - コンポーネントを見やすくするために表示しない。
  • f_rsi - RSI の場合.
  • f_adx - ADXとして。

参考:RSIの最終ラインは平滑化されませんが、ADXは平滑化されます。

***

このインジケータは、設定によりRSIやADX、様々なハイブリッドを取得することができます。

RSIを取得するため。

  • コンポーネント - c_rsi
  • スムース - s_wilder
  • パワー - f_rsi;

ADXを取得するために

  • コンポーネント - c_adx
  • スムース - s_ema
  • パワー - f_adx

電源 - コンポーネントを邪魔しないように有効/無効を設定します。

***

この 記事の画像のようにインジケータが2つあるテンプレートも添付しています。

ファイル:
qwerty.mq5  6 kb
2ind.tpl  201 kb
 
Yousufkhodja Sultonov:
今バックアップしていますか?

バックストーリーは?記事を書くのに5分って、多いですか?

 
Ihor Herasko:

...

アンチエイリアスが入ってないんですよね...。

それは何ですか?-

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;
ウィルダースムージングです。基本的には指数関数と同じですが、速度が遅いのが特徴です。
 
Dmitry Fedoseev:

バックストーリーは?記事を書くのに5分というのは多いのでしょうか?

DAにスムージングはありませんし、必要ありません。それに対して、あなたは何と言いますか?
 
Yousufkhodja Sultonov:
DAにはスムージングはありませんし、必要ありません。それについてどう思いますか?

RSIのように平滑化するのではなく、成分そのものを平滑化することが可能であり、単純な平均 値である。上記の汎用インジケータを改良して、スムージングの有効・無効を設定することが可能です。しかし、コンセプト的には何も変わりません。

それに、話す前に見せた方がいい。なんでそんなに厳しく聞くんだよ!!!!!!!!!!!!!!!!!ボコッ

 
Dmitry Fedoseev:

バックストーリーは?記事を書くのに5分というのは多いのでしょうか?

私が言いたかったのは、こういうことです。 "RSIはウィルダースムージングを使用しており、指数と 同じですが周期が大きいので、そこからミスマッチが目立つことがあることを念頭に置いてください。"

期間を長くしたり短くしたり、指数関数的または規則的に平滑化したりと、どんな大会でも......これって何の意味があるんだろう?DAは、雄牛には角を、熊には前足で立ち向かいます。

 
Dmitry Fedoseev:
RSIのように平滑化するのではなく、成分そのものを平滑化することが可能であり、これは単純平均である。上記の汎用インジケータを改良して、スムージングの有効・無効を設定することが可能です。しかし、コンセプト的には何も変わりません。
もちろんできるようになりました。
 
Dmitry Fedoseev:
RSIのように平滑化するのではなく、成分そのものを平滑化することが可能であり、単純な平均値である。私の上記の普遍的なインジケータを改良して、スムージングの有効/無効を設定することができます。しかし、コンセプト的には何も変わりません。

あなたは、詩の言葉を話す人と数式で議論しようとしているのです。