Bibliotheken: MovingAverages

 

MovingAverages:

Die MovingAverages Library enthält Funktionen für die Berechnung verschiedener Typen von Gleitenden Durchschnitten.

Die MovingAverages Library ist Teil des Standardpakets von MetaTrader 5 Client Terminal.

Die Library enthält Funktionen für die Berechnung verschiedener Typen von Moving Averages. Insgesamt existieren 8 Funktionen. Diese können in zwei Gruppen mit 4 Funktionen eingeteilt werden welche logisch zusammengehören.

Autor: MetaQuotes Software Corp.

 

Zeile:

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

muss eine nicht-strikte Gleichheit sein:

   if(period<1 || rates_total-begin<period) return(0);
Wenn Sie z. B. den Liefercode MACD.mq5 kompilieren und InpSignalSMA=1 setzen, ist die Linie Signal gleich Null, während sie gleich der MACD-Linie sein sollte.
 
In der Funktion ExponentiaMA verstehe ich den Sinn der Eingabe des 3. Parameters prev_value nicht ganz. Es ist klar, dass man in einer reinen Formel zur Berechnung des Durchschnitts den Wert der Vorperiode braucht, aber meiner Meinung nach wäre die Funktion für den Durchschnittsmenschen übersichtlicher, wenn sie diesen Wert intern zählen würde und nur 3 Daten in die Funktion eingegeben werden müssten wie bei SimpleMA.
 

Warum brauchen Sie den letzten Parameter 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)

während die anderen 3 Funktionen dies nicht haben. Wenn es noch benötigt wird, wie kann man es verwenden, wenn man die externe Variable weightsum=0 initialisiert, arbeiten andere Funktionen schief und erzeugen den Fehler der Division durch Null.

 
Roman Sukhorukov:

Warum brauchen Sie den letzten Parameter 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)

während die anderen 3 Funktionen dies nicht haben. Wenn es noch gebraucht wird, wie kann man es verwenden, wenn man die externe Variable weightsum=0 initialisiert, arbeiten andere Funktionen schief und erzeugen den Fehler der Division durch Null.

In einem ähnlichen Indikator Custom Moving Average.mq5, der mit dem Terminal geliefert wird, ist er innerhalb der Funktion deklariert:

   static int weightsum;

als statisch deklariert, d.h. er wird nicht bei jeder Neuberechnung des Indikators zurückgesetzt. In Indikatoren statisch int weightsum - nicht kreuzen, weil sie verschiedene Threads sind und sie ihre eigenen Variablen haben.

Aber ich vermute, dass, wenn wir 2 oder mehr LWMAs (aus dem Expert Advisor) mit verschiedenen Perioden zählen, dann weightsum sollte für jeden unterschiedlich sein, und nicht 1 für alle durch die Deklaration von static innerhalb der Funktion.

Daher müssen wir für jede LWMA eine eigene globale Variable haben, die wir an LinearWeightedMAOnBuffer() übergeben,

Wenn es zum Beispiel 2 LWMAs gibt, sollten die folgenden Variablen global deklariert werden

int weightsum1;
int weightsum2;

und müssen dann an die Funktion übergeben werden.

Wenn ich etwas falsch verstanden habe, korrigieren Sie mich bitte.

 
elibrarius:

Daher benötigen wir für jede LWMA eine globale Variable, die wir an LinearWeightedMAOnBuffer() übergeben,

Wenn es zum Beispiel 2 LWMAs gibt, dann sollte global deklariert werden

int weightsum1;
int weightsum2;

deklariert werden, die dann an die Funktion übergeben werden müssen.

Geprüft durch Deklaration von int weightsum1; int weightsum2; ... auf der globalen Ebene. Die Berechnungen werden korrekt durchgeführt.
 
Maxim Khrolenko #:
In der Funktion ExponentiaMA verstehe ich den Sinn der Eingabe des 3. Parameters prev_value nicht ganz. Es ist klar, dass man in einer reinen Formel zur Berechnung des Durchschnitts den Wert der Vorperiode benötigt, aber meiner Meinung nach wäre die Funktion für den Durchschnittsmenschen übersichtlicher, wenn sie diesen Wert intern zählen würde und nur 3 Daten in die Funktion eingegeben werden müssten wie bei SimpleMA.

Absolut einverstanden! Es ist nicht klar, wie die Funktion zu verwenden ist. Am Ende habe ich mich für ExponentialMAOnBuffer entschieden, weil ich nicht verstanden habe, wo prev_value hingehen soll. Diese Funktionen sind nicht notwendig, um einen externen Indikator aus dem Expert Advisor aufzurufen, sondern um alles zu lesen. Was hat der Entwickler vorgeschlagen?

Das erinnert mich an ein Zitat aus dem Cartoon "Prostokvashino" - "Um etwas zu verkaufen, das man nicht braucht, muss man zuerst etwas kaufen, das man nicht braucht, und wir haben kein Geld".

 
Konstantin Efremov #:

Dem stimme ich voll und ganz zu! Es ist nicht klar, wie es zu verwenden. Am Ende habe ich ExponentialMAOnBuffer gewählt, weil ich nicht verstanden habe, wo prev_value zu nehmen. Diese Funktionen sind nicht notwendig, um einen externen Indikator aus dem Expert Advisor aufzurufen, sondern um alles innerhalb zu lesen. Was hat der Entwickler vorgeschlagen?

Das erinnert mich an ein Zitat aus dem Cartoon "Prostokvashino" - "Um etwas zu verkaufen, das man nicht braucht, muss man zuerst etwas kaufen, das man nicht braucht, und wir haben kein Geld".

Ja, ich stimme zu. Das Gleiche gilt für:

//+------------------------------------------------------------------+
//| Geglätteter gleitender Durchschnitt|
//+------------------------------------------------------------------+
double SmoothedMA(const int position,const int period,const double prev_value,const double &price[])
  {
   double result=0.0;
//--- Zeitraum prüfen
   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);
  }

Es spielt keine Rolle, wie der Code in Gelb berechnet wird. Das Ergebnis wird immer ein grüner String sein. Und das ist in den Standard-MT5-Bibliotheken! Jawohl!

Verbessern Sie die Funktion, sonst ist sie nutzlos. In MQL5 ist es sehr nützlich, wenn Sie MA-Werte für mehrere Instrumente berechnen müssen. Und es ist nicht im Voraus bekannt, welche das sind. Sie können nicht die MA-Handles aller Instrumente aus der Marktübersicht bilden!

 
Konstantin Efremov #:

Dem stimme ich voll und ganz zu! Es ist nicht klar, wie es zu verwenden. Am Ende habe ich ExponentialMAOnBuffer gewählt, weil ich nicht verstanden habe, wo prev_value zu nehmen. Diese Funktionen sind nicht notwendig, um einen externen Indikator aus dem Expert Advisor aufzurufen, sondern um alles innerhalb zu lesen. Was hat der Entwickler vorgeschlagen?

Das erinnert mich an ein Zitat aus dem Cartoon "Prostokvashino" - "Um etwas zu verkaufen, das man nicht braucht, muss man zuerst etwas kaufen, das man nicht braucht, und wir haben kein Geld".

Andrey Kaunov #:

Ja, ich schließe mich Ihnen an. Das Gleiche gilt für:

Es spielt keine Rolle, wie der gelb markierte Code berechnet wird. Das Ergebnis wird immer noch ein grüner String sein. Und das ist in den Standard-MT5-Bibliotheken! Ja!

Verbessern Sie die Funktion, sonst ist sie nutzlos. In MQL5 ist es sehr nützlich, wenn Sie MA-Werte für mehrere Instrumente berechnen müssen. Und es ist nicht im Voraus bekannt, welche das sind. Sie können nicht die MA-Handles aller Instrumente aus der Marktübersicht bilden!

Nun, Sie könnten in der CodeBase suchen und dort nachsehen. Ich bin nicht der einzige, der diese Bibliothek verwendet hat...

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

Entschuldigen Sie, was ist die 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 ;
 //--- Zeitraum prüfen 
   if (period> 0 && period<=(position+ 1 ))
     {
       for ( int i= 0 ; i<period; i++)
         result+=price[position-i];

      result/=period;
     }

   return (result);
  }

Guten Morgen

Ist es so deutlicher?