Librerie: MovingAverages

 

MovingAverages:

La libreria MovingAverages contiene funzioni per il calcolo di diversi tipi di medie mobili.

Autore: MetaQuotes

 

Linea:

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

deve essere un'uguaglianza non rigida:

   if(period<1 || rates_total-begin<period) return(0);
Altrimenti, se ad esempio si compila il codice di consegna MACD.mq5 e si imposta InpSignalSMA=1, la linea Signal sarà uguale a zero, mentre dovrebbe essere uguale alla linea MACD.
 
Nella funzione ExponentiaMA non capisco bene il significato dell'inserimento del terzo parametro prev_value. È chiaro che in una formula pura per il calcolo della media è necessario il valore del periodo precedente, ma a mio parere la funzione sarebbe più chiara per l'utente medio se contasse questo valore internamente e se si dovessero inserire solo 3 dati nella funzione come per SimpleMA.
 

Perché è necessario l'ultimo parametro weightsum in

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

mentre le altre 3 funzioni non ce l'hanno. Se è ancora necessario, come usarlo quando si inizializza la variabile esterna weightsum=0, le altre funzioni lavorano in modo scorretto e generano l'errore di divisione per zero.

 
Roman Sukhorukov:

Perché è necessario l'ultimo parametro weightsum in

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

mentre le altre 3 funzioni non ce l'hanno. Se è ancora necessaria, come utilizzarla quando si inizializza la variabile esterna weightsum=0, le altre funzioni lavorano in modo scorretto e generano l'errore di divisione per zero.

In un indicatore simile Custom Moving Average.mq5, fornito con il terminale, è dichiarato all'interno della funzione:

   static int weightsum;

come statico, cioè non verrà reimpostato a ogni nuovo ricalcolo dell'indicatore. Negli indicatori statici int weightsum - non si incrociano, perché sono thread diversi e hanno le loro variabili.

Ma suppongo che se contiamo 2 o più LWMA (eseguiti dall'Expert Advisor) con periodi diversi, allora weightsum dovrebbe essere diverso per ciascuno, e non 1 per tutti dichiarando static all'interno della funzione.

Pertanto, per ogni LWMA, dobbiamo avere una nostra variabile globale, che passeremo a LinearWeightedMAOnBuffer(),

Ad esempio, se ci sono 2 LWMA, le seguenti variabili devono essere dichiarate a livello globale

int weightsum1;
int weightsum2;

e poi è necessario passarle alla funzione.

Se ho capito male, vi prego di correggermi.

 
elibrarius:

Pertanto, per ogni LWMA è necessario disporre di una variabile globale, che verrà passata a LinearWeightedMAOnBuffer(),

Ad esempio, se ci sono 2 LWMA, si dovrà dichiarare a livello globale

int weightsum1;
int weightsum2;

e poi è necessario passarli alla funzione.

Controllato dichiarando int weightsum1; int weightsum2; ... a livello globale. I calcoli vengono eseguiti correttamente.
 
Maxim Khrolenko #:
Nella funzione ExponentiaMA non capisco bene il significato dell'inserimento del terzo parametro prev_value. È chiaro che in una formula pura per il calcolo della media è necessario il valore del periodo precedente, ma a mio parere la funzione sarebbe più chiara per la persona media se contasse questo valore internamente e se si dovessero inserire solo 3 dati nella funzione come per SimpleMA.

Assolutamente d'accordo! Non è chiaro come utilizzarla. Alla fine ho scelto ExponentialMAOnBuffer perché non capivo dove prendere prev_value. Queste funzioni sono necessarie non per chiamare un indicatore esterno dall'Expert Advisor, ma per leggere tutto quello che c'è dentro. Lo sviluppatore ha suggerito cosa?

Mi ricorda una citazione dal cartone animato "Prostokvashino": "Per vendere qualcosa che non ti serve, devi prima comprare qualcosa che non ti serve, e noi non abbiamo soldi".

 
Konstantin Efremov #:

Sono assolutamente d'accordo! Non è chiaro come usarlo. Alla fine ho scelto ExponentialMAOnBuffer, perché non capivo dove prendere prev_value. Queste funzioni sono necessarie non per chiamare un indicatore esterno dall'Expert Advisor, ma per leggere tutto quello che c'è dentro. Lo sviluppatore ha suggerito cosa?

Mi ricorda una citazione dal cartone animato "Prostokvashino": "Per vendere qualcosa che non ti serve, devi prima comprare qualcosa che non ti serve, e noi non abbiamo soldi".

Sì, sono d'accordo. Lo stesso vale per:

//+------------------------------------------------------------------+
//| Media mobile smussata|
//+------------------------------------------------------------------+
double SmoothedMA(const int position,const int period,const double prev_value,const double &price[])
  {
   double result=0.0;
//--- controllare il 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);
  }

Non importa come viene calcolato il codice in giallo. Il risultato sarà comunque una stringa verde. E questo è nelle librerie standard di MT5! Sì!

Migliorate la funzione, altrimenti è inutile. In MQL5, è molto utile quando è necessario calcolare i valori MA su diversi strumenti. E non si sa in anticipo quali. Non è possibile formare le maniglie MA di tutti gli strumenti dalla panoramica del mercato!

 
Konstantin Efremov #:

Sono assolutamente d'accordo! Non è chiaro come usarlo. Alla fine ho scelto ExponentialMAOnBuffer, perché non capivo dove prendere prev_value. Queste funzioni sono necessarie non per chiamare un indicatore esterno dall'Expert Advisor, ma per leggere tutto quello che c'è dentro. Lo sviluppatore ha suggerito cosa?

Mi ricorda una citazione dal cartone animato "Prostokvashino": "Per vendere qualcosa che non ti serve, devi prima comprare qualcosa che non ti serve, e noi non abbiamo soldi".

Andrey Kaunov #:

Sì, mi associo. Lo stesso vale per:

Non importa come viene calcolato il codice evidenziato in giallo. Il risultato sarà comunque una stringa verde. E questo è nelle librerie standard di MT5! Sì!

Migliorate la funzione, altrimenti è inutile. In MQL5, è molto utile quando è necessario calcolare i valori MA su diversi strumenti. E non si sa in anticipo quali. Non è possibile formare le maniglie MA di tutti gli strumenti dalla panoramica del mercato!

Si può cercare nel CodeBase e guardare lì. Non sono l'unico ad aver utilizzato questa libreria...

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

Medie mobili:

Autore: MetaQuotes Software Corp.

Mi scusi, cos'è la variabile "posizione"?

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

      result/=period;
     }

   return (result);
  }

Buongiorno

È più chiaro così?