Bibliothèque: MovingAverages

 

MovingAverages:

La bibliothèque MovingAverages contient des fonctions pour le calcul de différents types de moyennes mobiles.

Auteur : MetaQuotes

 

La ligne :

   if(period<=1 || rates_total-begin<period) return(0);

doit être une égalité non stricte :

   if(period<1 || rates_total-begin<period) return(0);
Sinon, si, par exemple, vous compilez le code de livraison MACD.mq5 et que vous réglez InpSignalSMA=1, la ligne Signal sera égale à zéro, alors qu'elle devrait être égale à la ligne MACD.
 
Dans la fonction ExponentiaMA, je ne comprends pas très bien la signification de la saisie du 3ème paramètre prev_value. Il est clair que dans une formule pure de calcul de la moyenne, vous avez besoin de la valeur de la période précédente, mais à mon avis, la fonction serait plus claire pour la personne moyenne si elle comptait cette valeur en interne et si seulement 3 données devaient être entrées dans la fonction comme pour SimpleMA.
 

Pourquoi avez-vous besoin du dernier paramètre weightsum dans

int LinearWeightedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[],int &weightsum)

alors que les 3 autres fonctions n'en disposent pas. Si elle est toujours nécessaire, comment l'utiliser lors de l'initialisation de la variable externe weightsum=0, les autres fonctions fonctionnent de travers et génèrent l'erreur de division par zéro.

 
Roman Sukhorukov:

Pourquoi avez-vous besoin du dernier paramètre weightsum dans

int LinearWeightedMAOnBuffer(const int rates_total,const int prev_calculated,const int begin,const int period,const double& price[],double& buffer[],int &weightsum)

alors que les 3 autres fonctions n'en disposent pas. Si elle est encore nécessaire, comment l'utiliser lors de l'initialisation de la variable externe weightsum=0, les autres fonctions fonctionnent de travers et génèrent l'erreur de division par zéro.

Dans un indicateur similaire Custom Moving Average.mq5, fourni avec le terminal, elle est déclarée à l'intérieur de la fonction :

   static int weightsum;

comme statique, c'est-à-dire qu'elle ne sera pas réinitialisée à chaque nouveau calcul de l'indicateur. Dans les indicateurs static int weightsum - ne se croisent pas, car ce sont des fils différents et ils ont leurs propres variables.

Mais je suppose que si nous comptons 2 ou plusieurs LWMA (exécutées par l'Expert Advisor) avec des périodes différentes, alors weightsum devrait être différent pour chacun, et non 1 pour tous en déclarant static à l'intérieur de la fonction.

Ainsi, pour chaque LWMA, nous devons avoir notre propre variable globale, que nous passerons à LinearWeightedMAOnBuffer(),

Par exemple, s'il y a 2 LWMA, les variables suivantes doivent être déclarées globalement

int weightsum1 ;
int weightsum2 ;

et vous devez ensuite les transmettre à la fonction.

Si j'ai mal compris, veuillez me corriger.

 
elibrarius:

Ainsi, pour chaque LWMA, nous devons disposer d'une variable globale que nous transmettrons à LinearWeightedMAOnBuffer(),

Par exemple, s'il y a 2 LWMA, il faut déclarer globalement

int weightsum1 ;
int weightsum2 ;

et vous devez ensuite les transmettre à la fonction.

Vérifié en déclarant int weightsum1 ; int weightsum2 ; ... au niveau global. Les calculs sont effectués correctement.
 
Maxim Khrolenko #:
Dans la fonction ExponentiaMA, je ne comprends pas très bien la signification de la saisie du 3ème paramètre prev_value. Il est clair que dans une formule pure de calcul de la moyenne, vous avez besoin de la valeur de la période précédente, mais à mon avis, la fonction serait plus claire pour le commun des mortels si elle comptait cette valeur en interne et si seulement 3 données étaient entrées dans la fonction comme pour SimpleMA.

Tout à fait d'accord ! La façon de l'utiliser n'est pas claire. Finalement, j'ai choisi ExponentialMAOnBuffer parce que je ne comprenais pas où prendre prev_value. Ces fonctions sont nécessaires non pas pour appeler un indicateur externe à partir du conseiller expert, mais pour lire tout ce qui se trouve à l'intérieur. Le développeur a suggéré quoi ?

Cela me rappelle une citation du dessin animé "Prostokvashino" - "Pour vendre quelque chose dont vous n'avez pas besoin, vous devez d'abord acheter quelque chose dont vous n'avez pas besoin, et nous n'avons pas d'argent".

 
Konstantin Efremov #:

Je suis tout à fait d'accord ! La façon de l'utiliser n'est pas claire. Finalement, j'ai choisi ExponentialMAOnBuffer, parce que je ne comprenais pas où prendre prev_value. Ces fonctions sont nécessaires non pas pour appeler un indicateur externe à partir du conseiller expert, mais pour lire tout ce qui se trouve à l'intérieur. Qu'a suggéré le développeur ?

Cela me rappelle une citation du dessin animé "Prostokvashino" - "Pour vendre quelque chose dont vous n'avez pas besoin, vous devez d'abord acheter quelque chose dont vous n'avez pas besoin, et nous n'avons pas d'argent".

Oui, je suis d'accord. Il en va de même :

//+------------------------------------------------------------------+
//| Moyenne mobile lissée|
//+------------------------------------------------------------------+
double SmoothedMA(const int position,const int period,const double prev_value,const double &price[])
  {
   double result=0.0;
//--- période de contrôle
   if(period>0 && period<=(position+1))
     {
      if(position==period-1)
        {
         for(int i=0; i<period; i++)
            result+=price[position-i];

         result/=period;
        }

      result=(prev_value*(period-1)+price[position])/period;
     }

   return(result);
  }

La façon dont le code en jaune est calculé n'a pas d'importance. Le résultat sera toujours une chaîne verte. Et cela se trouve dans les bibliothèques standard de MT5 !

Améliorez la fonction, sinon elle est inutile. Dans MQL5, c'est très utile lorsque vous avez besoin de calculer les valeurs MA sur plusieurs instruments. Et on ne sait pas à l'avance lesquels. Vous ne pouvez pas former les poignées MA de tous les instruments à partir de la vue d'ensemble du marché !

 
Konstantin Efremov #:

Je suis tout à fait d'accord ! La façon de l'utiliser n'est pas claire. Finalement, j'ai choisi ExponentialMAOnBuffer, parce que je ne comprenais pas où prendre prev_value. Ces fonctions sont nécessaires non pas pour appeler un indicateur externe à partir du conseiller expert, mais pour lire tout ce qui se trouve à l'intérieur. Qu'a suggéré le développeur ?

Cela me rappelle une citation du dessin animé "Prostokvashino" - "Pour vendre quelque chose dont vous n'avez pas besoin, vous devez d'abord acheter quelque chose dont vous n'avez pas besoin, et nous n'avons pas d'argent".

Andrey Kaunov #:

Oui, je vous rejoins. Il en va de même pour :

La façon dont le code surligné en jaune est calculé n'a pas d'importance. Le résultat sera toujours une chaîne verte. Et ceci dans les bibliothèques standard de MT5 ! Yep !

Améliorez la fonction, sinon elle est inutile. Dans MQL5, c'est très utile lorsque vous avez besoin de calculer les valeurs MA sur plusieurs instruments. Et on ne sait pas à l'avance lesquels. Vous ne pouvez pas former les poignées MA de tous les instruments à partir de la vue d'ensemble du marché !

Vous pouvez faire une recherche dans CodeBase et y regarder. Je ne suis pas le seul à avoir utilisé cette bibliothèque...

MA on ATR
MA on ATR
  • www.mql5.com
Индикатор Moving Average по значениям индикатора Average True Range
 
Automated-Trading:

Moyennes mobiles:

Auteur : MetaQuotes Software Corp.

Excusez-moi, qu'est-ce que la variable "position" ?

double SimpleMA(const int position,const int period,const double &price[])
 
double SimpleMA( const int position, const int period, const double &price[])
  {
   double result= 0.0 ;
 //--- période de contrôle 
   if (period> 0 && period<=(position+ 1 ))
     {
       for ( int i= 0 ; i<period; i++)
         result+=price[position-i];

      result/=period;
     }

   return (result);
  }

Bonjour

Est-ce que c'est plus clair comme ça ?