Indicador diferencial Sultonov - página 41

 
Dmitry Fedoseev:

Haverá um código em 5 mins. Tenha em mente que a RSI utiliza o alisamento Wilder, que é o mesmo que o alisamento exponencial, mas com um período mais longo, de modo que pode haver um descasamento perceptível.


O que há para se preparar? Lançamos fora o amortecedor principal da RSI e colocamos os dois amortecedores existentes em seu lugar:

//+------------------------------------------------------------------+
//|                                                          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);
  }
//+------------------------------------------------------------------+
Não há ali suavização. E o cálculo é diferente na medida em que a força dos ursos inclui o doji. Essa é a diferença. O DA leva isso em consideração.
 
Dmitry Fedoseev:

Haverá um código em 5 mins. Tenha em mente que a RSI utiliza o alisamento Wilder, que é o mesmo que o exponencial, mas com um período mais longo, portanto pode haver um descasamento perceptível.

Você está desistindo agora?
 

Anexa é um indicador.

Parâmetros:

período - período em barras;

Componentes - opção de cálculo de componentes:

  • c_rsi - como para RSI
  • c_adx - como para ADX
  • c_x - como para RSI, mas divisão não por período, mas por número real de incrementos.

Métodosuave - suave:

  • s_wilder - Método Wilder
  • s_ema - suavização exponencial.
Tenha em mente que os componentes RSI são suavizados pela Wilder, enquanto os componentes ADX são suavizados pelo método exponencial convencional (ou seja, o período 14 para RSI corresponde ao período 27 para ADX).

Potência - a forma como a linha final é calculada:

  • f_off - não exibido para ver melhor os componentes
  • f_rsi - como para RSI
  • f_adx - como ADX.

Para informação: a linha final do RSI não é suavizada, o ADX é suavizado.

***

Você pode obter RSI e ADX e vários híbridos por este indicador através de ajustes.

Para obter o RSI:

  • Componentes - c_rsi
  • Suave - s_wilder
  • Energia - f_rsi;

Para obter o ADX:

  • Componentes - c_adx
  • Suave - s_ema
  • Energia - f_adx

Energia - habilitar/desabilitar para manter os componentes fora do caminho.

***

O modelo com dois indicadores, como na imagem deste posto, também está anexado.

Arquivos anexados:
qwerty.mq5  6 kb
2ind.tpl  201 kb
 
Yousufkhodja Sultonov:
Você está apoiando agora?

Onde está a história de fundo? Cinco minutos para escrever um post é muito?

 
Ihor Herasko:

...

Não há antialiasing lá dentro....

O que é isso? -

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;
É um alisamento mais selvagem. É essencialmente idêntico ao exponencial, mas mais lento.
 
Dmitry Fedoseev:

Onde está a história de fundo? 5 minutos para escrever um post é muito?

Não há suavização no DA e não é necessária. O que você diz a isso?
 
Yousufkhodja Sultonov:
Não há suavização no DA e não é necessária. O que você pensa sobre isso?

Não é possível suavizar como na LER, mas os componentes em si, é uma média simples. É possível refinar meu indicador universal acima para habilitar/desabilitar o alisamento. Mas, conceitualmente, nada muda.

Além disso, é melhor mostrá-lo antes de falar. Por que você me pergunta tão severamente, e você blá blá blá blá

 
Dmitry Fedoseev:

Onde está a história de fundo? 5 minutos para escrever um post é muito?

O que eu quis dizer foi o seguinte: "Tenhaem mente que a RSI usa suavização Wilder, é o mesmo que exponencial, mas com um período maior, pode haver um descompasso perceptível a partir disso. "

Quaisquer convenções com períodos mais longos ou mais curtos, suavização exponencial ou regular - de que adianta tudo isso? DA leva o Touro pelos chifres e o Urso pelas patas e pés.

 
Dmitry Fedoseev:
Não é possível suavizar como na LER, mas os componentes em si, esta é uma média simples. É possível refinar meu indicador universal acima para habilitar/desabilitar o alisamento. Mas, conceitualmente, nada muda.
Agora, é claro que você pode.
 
Dmitry Fedoseev:
Não é possível suavizar como na LER, mas os componentes em si, é uma média simples. Você pode refinar meu indicador universal acima para habilitar/desabilitar a suavização. Mas, conceitualmente, nada muda.

Você está tentando argumentar com fórmulas com alguém que fala a linguagem da poesia.