Дифференциальный индикатор Султонова - страница 41

 
Dmitry Fedoseev:

Через 5 мин будет код. Имейте ввиду, что у РСИ используется сглаживание Вайлдера, это тоже самое что экспоненциальное, но с более большим периодом, от этого может быть заметное несоответствие.


Да чего там его готовить то? Из RSI выбрасываем главный буфер, а на его место ставим имеющиеся два:

//+------------------------------------------------------------------+
//|                                                          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 мин будет код. Имейте ввиду, что у РСИ используется сглаживание Вайлдера, это тоже самое что экспоненциальное, но с более большим периодом, от этого может быть заметное несоответствие.

Теперь даете задний ход?
 

В приложении индикатор. 

Параметры:

period - период в барах;

Components - вариант расчета компонентов:  

  • c_rsi - как у РСИ
  • c_adx - как у ADX
  • c_x - как у РСИ, но деление не период, а на фактическое количество приращений.

Smooth - метод сглаживания:

  • s_wilder - метод Вайлдера
  • s_ema - экспоненциальное сглаживание.
Имейте ввиду у РСИ компоненты сглаживаются Вайлдером, у АДХ - обычным экспоненциальным методом (то есть период 14 у РСИ соответствует периоду 27 у АДХ).  

Power - способ расчета финальной линии:

  • f_off - не отображается, чтобы лучше видеть компоненты
  • f_rsi - как у RSI
  • f_adx - как у АДХ.

Для информации: у РСИ финальная линия не сглаживается, у АДХ сглаживается.

***

Данным индикатором через настройки можно получить РСИ и АДХ, и различные гибриды.

Для получения РСИ:

  • Components - c_rsi
  • Smooth - s_wilder
  • Power - f_rsi;

Для получения АДХ:

  • Components - c_adx
  • Smooth - s_ema
  • Power - f_adx

Power  - включайте/выключайте, чтобы компоненты не мешали.

***

Шаблон с двумя индикаторами как на изображении с этого поста тоже приложен.

Файлы:
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 нет никаких сглаживаний и они и не требуются. Что, на это скажете?

Можно и не сглаживать как в РСИ, но сами компоненты, это уже простое среднее. Можно доработать мой вышеприведенный универсальный индикатор, что бы включать/выключать сглаживание. Но концептуально ничего не меняется. 

К тому же, чем говрить, надо бы показать. А то что-то с меня то так строго спрашиваете, а сами бла бла бла

 
Dmitry Fedoseev:

Где задний ход? 5 минут на написание поста это много?

Я имел ввиду вот это: "Имейте ввиду, что у РСИ используется сглаживание Вайлдера, это тоже самое что экспоненциальное, но с более большим периодом, от этого может быть заметное несоответствие."

Какие-то условности с большим или меньшим периодом, экспоненциальное или обычное сглаживание - к чему все это? DA берет Быка за рога, а Медведя - за лапы и ноги.

 
Dmitry Fedoseev:
Можно и не сглаживать как в РСИ, но сами компоненты, это уже простое среднее. Можно доработать мой вышеприведенный универсальный индикатор, что бы включать/выключать сглаживание. Но концептуально ничего не меняется. 
Теперь, конечно, можно.
 
Dmitry Fedoseev:
Можно и не сглаживать как в РСИ, но сами компоненты, это уже простое среднее. Можно доработать мой вышеприведенный универсальный индикатор, что бы включать/выключать сглаживание. Но концептуально ничего не меняется. 

Ты пытаешься спорить с помощью формул с человеком, который говорит на языке поэзии.