Bibliotecas: MovingAverages - Medias Móviles

 

MovingAverages - Medias Móviles:

La biblioteca MovingAverages (Medias Móviles) contiene funciones para el cálculo de diferentes tipos de medias móviles.

Autor: MetaQuotes Software Corp.

 

Línea:

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

debe ser una igualdad no estricta:

   if(period<1 || rates_total-begin<period) return(0);
De lo contrario, si, por ejemplo, compila el código de entrega MACD.mq5 y establece InpSignalSMA=1, la línea Señal será igual a cero, mientras que debería ser igual a la línea MACD.
 
En la función ExponentiaMA no entiendo muy bien el sentido de introducir el 3er parámetro prev_value. Está claro que en una fórmula pura para calcular la media se necesita el valor del periodo anterior, pero en mi opinión la función sería más clara para el ciudadano de a pie si contara este valor internamente y sólo hubiera que introducir 3 datos en la función como en SimpleMA.
 

¿Por qué necesitas el último parámetro weightsum en

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

mientras que las otras 3 funciones no lo tienen. Si aún es necesario, cómo utilizarlo cuando al inicializar la variable externa pesosum=0, las otras funciones funcionan torcidamente y generan el error de división por cero.

 
Roman Sukhorukov:

¿Por qué necesitas el último parámetro weightsum en

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

mientras que las otras 3 funciones no lo tienen. Si aún es necesario, cómo utilizarlo al inicializar la variable externa weightsum=0, las otras funciones funcionan torcidamente y generan el error de división por cero.

En un indicador similar Custom Moving Average.mq5, suministrado con el terminal, se declara dentro de la función

   static int weightsum;

como estática, es decir, no se restablecerá en cada nuevo recálculo del indicador. En los indicadores static int weightsum - no se cruzan, porque son hilos diferentes y tienen sus propias variables.

Pero supongo que si contamos 2 o más LWMAs (que se ejecutan desde el Asesor Experto) con diferentes períodos, entonces weightsum debe ser diferente para cada uno, y no 1 para todos declarando estática dentro de la función.

Por lo tanto, para cada LWMA, necesitamos tener nuestra propia variable global, que pasaremos a LinearWeightedMAOnBuffer(),

Por ejemplo, si hay 2 LWMAs, las siguientes variables deben ser declaradas globalmente

int pesosum1;
int pesosum2;

y luego hay que pasarlas a la función.

Si no lo he entendido bien, por favor, corrígeme.

 
Maxim Khrolenko #:
En la función ExponentiaMA no entiendo muy bien el significado de introducir el 3er parámetro prev_value. Está claro que en una fórmula pura para calcular la media se necesita el valor del periodo anterior, pero en mi opinión la función sería más clara para el ciudadano de a pie si contara este valor internamente y sólo se introdujeran 3 datos en la función como en SimpleMA.

Totalmente de acuerdo. No está claro cómo utilizarlo. Al final opté por ExponentialMAOnBuffer porque no entendía donde coger prev_value. Estas funciones son necesarias no para llamar a un indicador externo desde el Asesor Experto, sino para leer todo lo que hay dentro. ¿Qué sugirió el desarrollador?

Me recuerda una cita del dibujo animado "Prostokvashino" - "Para vender algo que no necesitas, primero debes comprar algo que no necesitas, y no tenemos dinero".

 
Konstantin Efremov #:

Totalmente de acuerdo. No está claro cómo utilizarlo. Al final, elegí ExponentialMAOnBuffer, porque no entendía dónde tomar prev_value. Estas funciones son necesarias no para llamar a un indicador externo desde el Asesor Experto, sino para leer todo lo que hay dentro. ¿Qué sugirió el desarrollador?

Me recuerda una cita del dibujo animado "Prostokvashino" - "Para vender algo que no necesitas, primero debes comprar algo que no necesitas, y no tenemos dinero".

Sí, estoy de acuerdo. Lo mismo se aplica a:

//+------------------------------------------------------------------+
//| Media móvil suavizada|
//+------------------------------------------------------------------+
double SmoothedMA(const int position,const int period,const double prev_value,const double &price[])
  {
   double result=0.0;
//--- comprobar periodo
   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);
  }

No importa cómo se calcula el código en amarillo. El resultado seguirá siendo una cadena verde. ¡Y esto está en las librerías estándar de MT5! ¡Sip!

Mejorar la función, de lo contrario es inútil. En MQL5, es muy útil cuando se necesita calcular valores MA en varios instrumentos. Y no se sabe de antemano cuáles. ¡No se puede formar MA maneja de todos los instrumentos de la visión general del mercado!

 
Konstantin Efremov #:

Totalmente de acuerdo. No está claro cómo utilizarlo. Al final, elegí ExponentialMAOnBuffer, porque no entendía dónde tomar prev_value. Estas funciones son necesarias no para llamar a un indicador externo desde el Asesor Experto, sino para leer todo lo que hay dentro. ¿Qué sugirió el desarrollador?

Me recuerda una cita del dibujo animado "Prostokvashino" - "Para vender algo que no necesitas, primero debes comprar algo que no necesitas, y no tenemos dinero".

Andrey Kaunov #:

Sí, me uno a ti. Lo mismo digo:

No importa cómo se calcule el código resaltado en amarillo. El resultado seguirá siendo una cadena verde. ¡Y esto está en las librerías estándar de MT5! ¡Sip!

Mejorar la función, de lo contrario es inútil. En MQL5, es muy útil cuando se necesita calcular valores MA en varios instrumentos. Y no se sabe de antemano cuáles. ¡No se puede formar MA maneja de todos los instrumentos de la visión general del mercado!

Bueno, podrías buscar en CodeBase y mirar allí. No soy el único que ha utilizado esta biblioteca...

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

Medias móviles:

Autor: MetaQuotes Software Corp.

Disculpe, ¿qué es la variable "posición"?

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 ;
 //--- comprobar periodo 
   if (period> 0 && period<=(position+ 1 ))
     {
       for ( int i= 0 ; i<period; i++)
         result+=price[position-i];

      result/=period;
     }

   return (result);
  }

Buenos días

¿Está más claro así?

 
Gerard Willia G J B M Dinh Sy #:

Buenos días

¿Está más claro así?

No, ya lo vi pensando que position era la primera barra a calcular como ejemplo 20 si quiero 20 periodo pero no estoy seguro.

¿el precio tiene [position - 1] (y no +1) porque mql5 no lo pone como serie por defecto?