Indicatore differenziale di Sultonov - pagina 41

 
Dmitry Fedoseev:

Ci sarà un codice tra 5 minuti. Tenete a mente che l'RSI usa lo smoothing di Wilder, che è lo stesso dello smoothing esponenziale ma con un periodo più lungo, quindi potrebbe esserci una notevole discrepanza.


Cosa c'è da preparare? Buttiamo via il buffer principale della RSI e mettiamo i due buffer esistenti al suo posto:

//+------------------------------------------------------------------+
//|                                                          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);
  }
//+------------------------------------------------------------------+
Non c'è nessuna lisciatura lì. E il calcolo è diverso in quanto la forza degli orsi include la doji. Questa è la differenza. Il DA ne tiene conto.
 
Dmitry Fedoseev:

Ci sarà un codice tra 5 minuti. Tenete a mente che l'RSI usa lo smoothing di Wilder, che è lo stesso dell'esponenziale ma con un periodo più lungo, quindi ci può essere una notevole discrepanza.

Ti stai tirando indietro ora?
 

In allegato c'è un indicatore.

Parametri:

periodo - periodo in barre;

Componenti - opzione di calcolo dei componenti:

  • c_rsi - come per RSI
  • c_adx - come per ADX
  • c_x - come per RSI, ma divisione non per periodo, ma per numero effettivo di incrementi.

Smooth - metodo liscio:

  • s_wilder - Metodo Wilder
  • s_ema - smoothing esponenziale.
Tenete a mente che le componenti RSI sono lisciate da Wilder, mentre le componenti ADX sono lisciate dal metodo esponenziale convenzionale (cioè il periodo 14 per RSI corrisponde al periodo 27 per ADX).

Potenza - il modo in cui viene calcolata la linea finale:

  • f_off - non visualizzato per vedere meglio i componenti
  • f_rsi - come per RSI
  • f_adx - come ADX.

Per informazione: la linea finale dell'RSI non è lisciata, l'ADX lo è.

***

È possibile ottenere RSI e ADX e vari ibridi da questo indicatore attraverso le impostazioni.

Per ottenere la RSI:

  • Componenti - c_rsi
  • Liscio - s_wilder
  • Potenza - f_rsi;

Per ottenere ADX:

  • Componenti - c_adx
  • Liscio - s_ema
  • Potenza - f_adx

Alimentazione - abilita/disabilita per tenere i componenti fuori dai piedi.

***

Si allega anche il modello con due indicatori come nell'immagine di questo post.

File:
qwerty.mq5  6 kb
2ind.tpl  201 kb
 
Yousufkhodja Sultonov:
Stai facendo il backup ora?

Dov'è la storia di fondo? Cinque minuti per scrivere un post sono tanti?

 
Ihor Herasko:

...

Non c'è antialiasing in ....

Che cos'è? -

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;
È un lisciante più selvaggio. È essenzialmente identico all'esponenziale, ma più lento.
 
Dmitry Fedoseev:

Dov'è la storia di fondo? 5 minuti per scrivere un post sono tanti?

Non c'è lisciatura nel DA e non è richiesta. Cosa risponde a questo?
 
Yousufkhodja Sultonov:
Non c'è smussamento in DA e non è richiesto. Cosa ne pensate?

È possibile non lisciare come in RSI, ma i componenti stessi, è una media semplice. È possibile perfezionare il mio indicatore universale di cui sopra per attivare/disattivare lo smoothing. Ma concettualmente non cambia nulla.

Inoltre, è meglio mostrarlo prima di parlare. Perché me lo chiedi così severamente, e tu blah blah blah

 
Dmitry Fedoseev:

Dov'è la storia di fondo? Cinque minuti per scrivere un post sono tanti?

Quello che volevo dire è questo: "Tenete a mente che l'RSI usa lo smoothing Wilder, è lo stesso dell'esponenziale ma con un periodo più grande, ci può essere un notevole disallineamento da questo. "

Qualsiasi convenzione con periodi più o meno lunghi, smoothing esponenziale o regolare - che senso ha tutto questo? DA prende il toro per le corna e l'orso per le zampe e i piedi.

 
Dmitry Fedoseev:
È possibile non lisciare come in RSI, ma le componenti stesse, questa è una media semplice. È possibile perfezionare il mio indicatore universale di cui sopra per attivare/disattivare lo smoothing. Ma concettualmente non cambia nulla.
Ora, naturalmente, è possibile.
 
Dmitry Fedoseev:
È possibile non lisciare come in RSI, ma i componenti stessi, è una media semplice. Potete perfezionare il mio indicatore universale di cui sopra per attivare/disattivare lo smoothing. Ma concettualmente non cambia nulla.

Lei sta cercando di discutere con formule con qualcuno che parla la lingua della poesia.