Indicateur différentiel de Sultonov - page 41

 
Dmitry Fedoseev:

Il y aura un code dans 5 minutes. Gardez à l'esprit que le RSI utilise le lissage de Wilder, qui est identique au lissage exponentiel mais avec une période plus longue, de sorte qu'il peut y avoir un décalage notable.


Qu'y a-t-il à préparer ? Nous jetons le tampon principal du RSI et mettons les deux tampons existants à sa place :

//+------------------------------------------------------------------+
//|                                                          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);
  }
//+------------------------------------------------------------------+
Il n'y a pas de lissage. Et le calcul est différent dans la mesure où la force des ours inclut le doji. C'est là toute la différence. Le DA en tient compte.
 
Dmitry Fedoseev:

Il y aura un code dans 5 minutes. Gardez à l'esprit que le RSI utilise le lissage de Wilder, qui est identique à l'exponentiel mais avec une période plus longue, de sorte qu'il peut y avoir un décalage notable.

Tu fais marche arrière maintenant ?
 

Vous trouverez ci-joint un indicateur.

Paramètres :

période - période en bars ;

Composants - option de calcul des composants :

  • c_rsi - comme pour le RSI
  • c_adx - comme pour ADX
  • c_x - comme pour le RSI, mais la division n'est pas par période, mais par le nombre réel d'incréments.

Méthodelisse - lisse :

  • s_wilder - Méthode Wilder
  • s_ema - lissage exponentiel.
Gardez à l'esprit que les composantes RSI sont lissées par Wilder, tandis que les composantes ADX sont lissées par la méthode exponentielle classique (c'est-à-dire que la période 14 pour le RSI correspond à la période 27 pour l'ADX).

Puissance - la façon dont la ligne finale est calculée :

  • f_off - non affiché pour mieux voir les composants
  • f_rsi - comme pour le RSI
  • f_adx - comme ADX.

Pour information : la ligne finale du RSI n'est pas lissée, l'ADX l'est.

***

Vous pouvez obtenir RSI et ADX et divers hybrides par cet indicateur à travers les paramètres.

Pour avoir un RSI :

  • Composants - c_rsi
  • Doux - s_wilder
  • Puissance - f_rsi ;

Pour obtenir l'ADX :

  • Composants - c_adx
  • Doux - s_ema
  • Puissance - f_adx

Alimentation - activer/désactiver pour garder les composants hors du chemin.

***

Le modèle avec deux indicateurs comme dans l'image de ce post est également joint.

Dossiers :
qwerty.mq5  6 kb
2ind.tpl  201 kb
 
Yousufkhodja Sultonov:
Vous faites marche arrière maintenant ?

Où est l'histoire ? Cinq minutes pour écrire un billet, c'est beaucoup ?

 
Ihor Herasko:

...

Il n'y a pas d'anticrénelage sur .....

Qu'est-ce que c'est ? -

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;
C'est plus lissant. C'est essentiellement identique à l'exponentielle, mais plus lent.
 
Dmitry Fedoseev:

Où est l'histoire ? 5 minutes pour écrire un billet, c'est beaucoup ?

Il n'y a pas de lissage dans le DA et ce n'est pas nécessaire. Qu'est-ce que tu réponds à ça ?
 
Yousufkhodja Sultonov:
Il n'y a pas de lissage en DA et il n'est pas nécessaire. Qu'en pensez-vous ?

Il est possible de ne pas lisser comme dans le RSI, mais les composants eux-mêmes, c 'est une moyenne simple. Il est possible d'affiner mon indicateur universel ci-dessus pour activer/désactiver le lissage. Mais conceptuellement, rien ne change.

D'ailleurs, vous feriez mieux de le montrer avant de parler. Pourquoi vous me demandez si sévèrement, et vous bla bla bla

 
Dmitry Fedoseev:

Où est l'histoire ? 5 minutes pour écrire un billet, c'est beaucoup ?

Ce que je voulais dire, c'est ceci : "Gardez à l'esprit que le RSI utilise le lissage de Wilder, c'est la même chose que l'exponentiel mais avec une période plus grande, il peut y avoir un décalage notable de ce fait. "

Toute convention avec des périodes plus ou moins longues, un lissage exponentiel ou régulier - à quoi cela sert-il ? DA prend le taureau par les cornes et l'ours par les pattes et les pieds.

 
Dmitry Fedoseev:
Il est possible de ne pas lisser comme dans le RSI, mais les composants eux-mêmes, il s'agit d'une moyenne simple. Il est possible d'affiner mon indicateur universel ci-dessus pour activer/désactiver le lissage. Mais conceptuellement, rien ne change.
Maintenant, bien sûr, vous pouvez.
 
Dmitry Fedoseev:
Il est possible de ne pas lisser comme dans le RSI, mais les composants eux-mêmes, c'est une moyenne simple. Vous pouvez affiner mon indicateur universel ci-dessus pour activer/désactiver le lissage. Mais conceptuellement, rien ne change.

Vous essayez d'argumenter avec des formules avec quelqu'un qui parle le langage de la poésie.