Entwicklung des Pivot Mean Oscillators: ein neuartiger Indikator für einen kumulativen gleitenden Durchschnitt

26 November 2019, 08:04
Marco Calabrese
0
294

Inhalt

Einführung: Warum ein anderer Oszillator?

Oszillatoren stellen eine Unterklasse von Indikatoren dar, die über und unter einer zentralen Linie oder innerhalb vordefinierter Richtwerte schwanken. Sie werden in der technischen Analyse häufig zum Erzeugen von Handelsereignissen eingesetzt, z.B. wenn die Mittellinie überschritten wird oder ein bestimmter Schwellenwert überschritten wird. Beliebte Oszillatoren sind MACD, RSI, CCI, jeder mit spezifischen Merkmalen wie dem Versuch, Umkehrungen zu antizipieren, indem man die Änderungsrate des Preises betrachtet (auch bekannt als Momentum) oder nach dem Haupttrend sucht.

Im Allgemeinen zeigen Oszillatoren, deren Formel die Preisabweichung zwischen zwei Zeitpunkten berechnet, ein frühes Preisverhalten (z.B. RSI, CCI), während Oszillatoren, die auf Durchschnittswerten basieren, ein Nachlaufen zeigen. Um ein relevantes Beispiel zu nennen, kann man davon ausgehen, dass MACD sowohl eine frühes als auch ein spätes Verhalten zeigen, da es über die Differenz zwischen zwei Durchschnitten berechnet wird. Die Darstellung dieser Differenz wird als Histogramm dargestellt, so dass die Übergänge und Divergenzen der Mittellinie leicht zu erkennen sind.

Dennoch gibt es Vor- und Nachteile bei der Verwendung jedes Oszillators, da es Marktbedingungen geben kann, die falsche Signale verstärken (insbesondere bei führenden Oszillatoren) oder schnelle Abweichungen, die das Risiko-Ertrags-Verhältnis am stärksten verzerren können (wie es bei nachlaufenden Oszillatoren oft der Fall ist). Als Faustregel kann es für einen Händler klüger sein, mehrere Oszillatoren auf einmal zu betrachten, nur um möglichst unabhängige Bestätigungen eines Handelssignals zu erhalten.

In diesem Artikel wird der Pivot Mean Oscillator als Versuch vorgestellt, das riesige Panorama der Oszillatoren mit einigen neuen Funktionen zu erweitern, die direkt aus der Verwendung des Cumulative Moving Average (CMA) abgeleitet sind.


Aspekte der CMA

In der Statistik ist der einfache gleitende Durchschnitt (MA), auch bekannt als der 'simple' MA, eine Berechnung, die die letzten n Daten einer Zeitreihe mittelt. Wenn ein neuer Wert erscheint, wird der älteste gemäß einer first-in-first-out (FIFO) Richtlinie gelöscht. MA-Level sind in finanziellen Situationen nützlich, da sie als Unterstützung in einem fallenden Markt oder Widerstand in einem steigenden Markt interpretiert werden können.

Der MA arbeitet konzeptionell mit einem in der Größe unveränderlichen Datenpuffer und verwirft Daten (und damit Informationen), die älter sind als das letzte verfügbare Datum. Wenn wir diesen Puffer idealerweise bis unendlich verlängern lassen, so dass alle Daten bis zum aktuellen Bezugspunkt in die Berechnung einbezogen werden, haben wir den CMA.

Glücklicherweise müssen wir in der praktischen Anwendung nicht unendlich viel Speicher für die Speicherung jedes einzelnen Bezugspunktes bereitstellen! Tatsächlich kann CMA mit wenigen Variablen berechnet werden (je nachdem, ob seine rekursive Formulierung verwendet wird, siehe nächste Abbildung für Details). 

Tabelle 1

Tabelle 1: Zwei Formeln des CMAs.


Der zweite interessante Aspekt der CMA-Formel ist das Vorhandensein eines Zählers, der jeweils um eine Einheit erhöht wird. Dies bedeutet, dass der nächste CMA-Wert zum Teil aus einem Element besteht, das völlig vorhersehbar ist und, ergänzt durch andere Informationen, für Prognosezwecke verwendet werden kann. Beispielsweise wird der Preis unter seitwärts gerichteten Marktbedingungen tendenziell hin zum CMA-Wert tendieren.   

CMA ist der Hauptbestandteil von PMO, der im Folgenden dargestellt wird.


PM & PMO Definitionen

PMO basiert auf einem Normalisierungsindex, den wir Pivot Mean (PM) nennen, der als Bruchteil zwischen dem letzten Bezugspunkt und dem CMA berechnet wird.

PM bietet ein schnelles numerisches Verständnis des Abstands des Preises vom CMA. Das bedeutet, dass PM als ein Maß für die Spannweite betrachtet werden kann. Ein PM-Wert von 1,0035 bedeutet beispielsweise einfach, dass der aktuelle Wert 0,35% höher ist als CMA, während PM gleich 1 bedeutet, dass der aktuelle Wert perfekt mit CMA übereinstimmt.

Da die PM-Berechnung für jeden Datenpunkt wiederholt werden kann, bedeutet dies, dass jede Zeitreihe in ein PM-Signal umgewandelt werden kann. Schließlich definieren wir PMO als die Differenz zwischen zwei MAs, die auf PM-Signale angewendet werden. Kurz gesagt, PMO bietet ein Maß für die Divergenz zwischen zwei Spannweiten, daher ist es sinnvoll, sich seine Anwendungen für Handelseinstellungen anzusehen.

Die beiden Mittelwerte von PMO können entweder auf dem gleichen PM-Signal oder auf zwei verschiedenen berechnet werden. In diesem Artikel betrachten wir die einfachen MAs, die auf PM-Signale angewendet werden, die aus engen bzw. offenen Preisdaten gewonnen werden.

Tabelle 2

Tabelle 2: PM- und PMO-Formeln.


Obwohl es Ähnlichkeiten gibt, unterscheidet sich die hier vorgestellte PMO-Formeln in einigen Aspekten vom MACD. Der MACD wird im Allgemeinen auf Preissignale angewendet, während die zugrunde liegenden PMO-Signale PM-Signale sind. Darüber hinaus werden im MACD exponentielle MAs betrachtet, während wir uns hier auf einfache MAs konzentrieren und komplexere Varianten von PMO für zukünftige Arbeiten zu diesem Thema überlassen.


Grundlegendes Design & Code

PMO benötigt nur wenige Inputs, die direkt aus seiner Formel stammen: 

  • Startzeit: eine Referenzdatumszeit, ab der der Indikator berechnet wird
  • MA-Länge für PM-Schließsignal: eine ganze Zahl, die die Anzahl der Pufferdaten darstellt, die über das PM-Signal gemittelt werden sollen, das mit den Schlusskursen berechnet wird.
  • MA-Länge für PM-Open-Signal: eine ganze Zahl, die die Anzahl der Pufferdaten darstellt, die über das PM-Signal gemittelt werden sollen, das von Eröffnungspreisen abgeleitet wurde.

//--- Eingabeparameter
input datetime startingTime;
input int      MA_close=3;
input int      MA_open=21;

Insgesamt werden wir drei Puffer verwenden:

  • eine für PMO (der angezeigte Indikatorpuffer)
  • zwei weitere für die zugrunde liegenden PM-Signale

//--- Indikatorpuffer
double   PMOBuffer[];
double   closeBuffer[];
double   openBuffer[];  

Was die globalen Variablen betrifft, so ist es notwendig, einen Zähler und zwei Variablen für die Speicherung der Summen der Schluss- und Eröffnungskurse zu haben, die eine PMO-Berechnung ermöglichen. Wir fügen auch eine Reihe anderer Hilfsvariablen hinzu, um den ersten Index zu verfolgen, der in allen Puffern seit der Startzeit der Eingabe verwendet wird.

//----global vars---
int counter=1;
double sum_close=0;
double sum_open=0;
bool first_val_checked;
int first_valid_index;

Um die Berechnung der beiden Durchschnitte von PMO zu unterstützen, ist es notwendig, eine Funktion zu implementieren, die den MA implementiert. Das einzige Hindernis, das vermieden werden muss, ist der Fall, wenn die Berechnung ganz am Anfang der Puffer in der Nähe der Startzeit durchgeführt wird. In diesem Fall stehen keine ausreichenden Elemente für die Berechnung zur Verfügung. Aufgrund der PM-Definition können wir jedoch davon ausgehen, dass die Werte vor den Startzeiten auf Eins gesetzt werden, was eine verzögerungsfreie MA-Berechnung ermöglicht. Somit wird die Unterstützungsfunktion so, wie sie folgt:

double simpleMA(const int pos, const int avg_positions, const double &data[],int arr_tail_pos){
   double _local_sum = 0;
   for(int i=pos+avg_positions-1; i >= pos;i--){
      if(i > arr_tail_pos){
         _local_sum += 1;  // when requested data exceed buffer limit set trailing 1s
      }else{
         _local_sum += data[i];
      }
           
   }
   return _local_sum/avg_positions; 
}

All das vorausgesetzt, können wir uns endlich den Programmkern ansehen:

//+------------------------------------------------------------------+
//| Funktion des nutzerdefinierten Indikators                        |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArraySetAsSeries(PMOBuffer,true);
   ArraySetAsSeries(closeBuffer,true);
   ArraySetAsSeries(openBuffer,true);
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(time,true);
   
   
   
//--- Rückgabe des Wertes von prev_calculated für den nächsten Aufruf
   int total = rates_total - prev_calculated;
   double _tmp_sum_close,_tmp_sum_open;
    if(total > 0){
     
      for(int i=total-1;i>=0;i--){  
         if(time[i] >= startingTime){
            if(first_val_checked == false){
               first_val_checked = true;
               first_valid_index = i;
            }
            
            sum_close += close[i];
            sum_open += open[i];
            
            closeBuffer[i] = close[i] *counter / sum_close;
            openBuffer[i] = open[i]*counter / sum_open;
            
            PMOBuffer[i] = simpleMA(i,MA_close,closeBuffer,first_valid_index)-simpleMA(i,MA_open,openBuffer,first_valid_index);
 
            counter++;         
         }   
         else{
            PMOBuffer[i] = 0;
         }    
         
       
      }
 
   }else{
      _tmp_sum_close = sum_close +close[0];
      _tmp_sum_open = sum_open + open[0];
      closeBuffer[0] = close[0] *counter / _tmp_sum_close;
     
      openBuffer[0] = open[0] *counter / _tmp_sum_open;
  
      PMOBuffer[0] = simpleMA(0,MA_close,closeBuffer,first_valid_index)-simpleMA(0,MA_open,openBuffer,first_valid_index);
   }
   return(rates_total);
  }
//+------------------------------------------------------------------+


Experimente an EURUSD

Hier finden Sie einige Ergebnisse und Kommentare zu Experimenten, die mit PMO auf dem EURUSD-Chart durchgeführt wurden. Zwei Hauptthemen werden diskutiert:

  1. Handelsaspekte im Zusammenhang mit dem Einsatz von PMO
  2. Analyse des PMO-Wertes

Handelsaspekte

Wie die Abbildung zeigt, besteht eine starke Ähnlichkeit zwischen PMO und RSI: Die beiden Signale stimmen fast überein. Es gibt aber auch einige Unterschiede. In der Nähe der großen Aufschwünge am 12. Sept. 2019 (in Verbindung mit einigen offiziellen Mitteilungen der Europäischen Zentralbank) kann der aufmerksame Leser ein "M" Merril-Muster auf PMO mit linker Schulter höher als rechter Schulter beobachten, genau das Gegenteil von dem, was beim RSI-Signal und beim zugrunde liegenden EURUSD-Kurs passiert. Dies ist darauf zurückzuführen, dass der Preisanstieg am 12. Sept. im Vergleich zum CMA war höher als derjenige, der am nächsten Tag beobachtet wurde. Diese Information könnte nützlich gewesen sein, um nach dem zweiten Peak eine Short-Position einzunehmen.

Die Ähnlichkeit mit dem RSI erlaubt es uns, Umkehrungen um Höchst- und Tiefststände als überkaufte und überverkaufte Bedingungen und damit als Frühsignal für die eigene Handelsstrategie zu erkennen. Obwohl PMO nicht wie der RSI begrenzt ist, kann die gerade Überschreitung der Nullmittellinie als weitere Bestätigung des Trends angesehen werden. Wie in der Einleitung erwähnt, kann die kombinierte Verwendung mehrerer Signale gleichzeitig eine gute Praxis für den Handelserfolg sein.


Abb. 1

Abb. 1: Ähnlichkeiten zwischen PMO(3,21) und RSI(14).


Wir können nun einen sehr grundlegenden und vereinfachten Satz von WENN-DANN-Regeln für den Handel mit PMO skizzieren, der ausgefeiltere Strategien für die zukünftige Entwicklung von PMO-basierten Experten hinterlässt.

  • WENN positive Umkehr unter Nulllinie DANN Frühwarnung KAUFEN
  • WENN negative Umkehr über der Nulllinie DANN Frühwarnung VERKAUFEN
  • Wenn die Nulllinie nach oben gekreuzt wird, DANN KAUFEMPFEHLUNG
  • Wenn die Nulllinie nach unten gekreuzt wird, DANN VERKAUFSEMPFEHLUNG.

Eine schnelle Reaktion auf sich ändernde Marktbedingungen ist ein Schlüsselfaktor für den Handelserfolg: Wenn ein MA verwendet wird, gilt: Je glatter das Signal, desto größer die Verzögerung. Bei der Verwendung von PMO(m,n) berücksichtigt m die Verzögerung des Oszillators, während n mit der Verzögerung beim Überqueren der Mittellinie zusammenhängt. Natürlich ist die schnellste Form eines PMO ein PMO(1,1), was bedeutet, dass wir die Differenz zwischen den beiden PMs ohne jeglichen Durchschnitt berechnen. Ein guter Kompromiss wäre die Verwendung von PMO(1, n), mit n klein (z.B. 5), was zur schnellsten Reaktion und zu keinem verzögerten Kreuzen der Null führt.


Analyse der PMO-Werte

Es ist nun sinnvoll, einen Blick auf die Verteilung der PMO-Werte um die Nulllinie zu werfen. PMO, wie in diesem Artikel definiert, ist nicht wie RSI begrenzt, so dass es interessant sein könnte, die Wahrscheinlichkeit zu analysieren, dass ein PM-Wert über oder unter bestimmten Schwellenwerten liegt.

Die folgende Abbildung zeigt die Ergebnisse der Ausführung von PMO(3,21) auf dem EURUSD-Chart mit dem H1-Zeitrahmen über die ersten 8 Monate des Jahres 2019. Die PMO-Werte werden gemäß einer glockenförmigen Verteilung um Null zentriert. Die leichte Linksneigung ist wahrscheinlich auf den Überschuss an Short-Positionen zurückzuführen, die EURUSD in den letzten Monaten angesammelt hat. Dennoch lässt die Dominanz der Symmetrien um Null darauf schließen, dass es ein allgemeines Gleichgewicht zwischen Auf- und Abwärtsbewegungen gibt.


Abb. 2

Abb. 2: Verteilung der PMO(3,21)-Werte, die einer glockenförmigen Kurve ähneln. Dies lässt uns ein quasi-gausssches, statistisches Modell annehmen, das für Vorhersagezwecke nützlich sein kann.


Ein weiterer Aspekt, der zu berücksichtigen ist, ist das Verhältnis zwischen PMO und den gleitenden Durchschnitten, die direkt auf Basis der engen und offenen Preissignale und nicht auf Basis ihrer PM-Pendants berechnet werden. Wie in der folgenden Abbildung dargestellt, wurde eine starke Korrelation mit dem R-Quadrat nahe der Einheit gefunden. Das bedeutet, dass die Bearbeitung von PM-Signalen die zugrunde liegenden Signale nicht verzerrt. Gleichzeitig hat die Arbeit an PM-Signalen den Vorteil, dass aufgrund der Normalisierung durch die PM-Berechnung Ergebnisse aus verschiedenen Quellen (z.B. andere Währungspaare) verglichen werden können.

Abb. 3

Abb. 3: Korrelation zwischen PMO(3,21) und seiner nicht normierten Version beobachtet. Die nahezu lineare Form deutet darauf hin, dass die Normalisierung, die in PMO verwendet wird, keine größeren Verzerrungen bei der Interpretation der zugrunde liegenden offenen und geschlossenen Preissignale verursacht. 


Fazit & weitere Arbeit


In diesem Artikel präsentierte ich Pivot Mean Oscillator (PMO), eine Implementierung des kumulativen Moving Average (CMA) als Handelsindikator für die MetaTrader-Plattformen, basierend auf dem neuartigen Konzept von Pivot Mean (PM). Der vorgeschlagene Oszillator erwies sich als ähnlich zu anderen bekannten Oszillatoren wie RSI oder MACD, aber mit einigen Besonderheiten, die sich aus der Verwendung von CMA ergeben. Bei der Weiterentwicklung bleibt noch viel zu tun, wie z.B.: Varianten, die auf anderen Durchschnittswerten basieren oder z.B. Experten, die Informationen aus dem PMO verwenden, bewerten die statistische Verteilung um die Nullmittellinie.

Der Leser wird ermutigt, seine eigenen Experimente mit den angehängten Dateien durchzuführen.


Angehängte Dateien

Datei Beschreibung
 PMO.mq4  MQL4 Quellcode von PMO, wie er in diesem Artikel verwendet wird.
 PMO_logger.mq4  MQL4 Quellcode von PMO mit Protokollfunktion zur Datenanalyse. Zwei zusätzliche Eingabeparameter sind implementiert: data_logging (Flag true/false) und filename (Zeichenkette).
 PMO.mq5  MQL5 Quellcode von PMO.
 PMO_logger.mq5  MQL5 Quellcode von PMO mit Protokollfunktion zur Datenanalyse. Zwei zusätzliche Eingabeparameter sind implementiert: data_logging (Flag true/false) und filename (Zeichenkette).




Übersetzt aus dem Englischen von MetaQuotes Software Corp.
Originalartikel: https://www.mql5.com/en/articles/7265

Beigefügte Dateien |
PMO.mq4 (4.32 KB)
PMO_logger.mq4 (4.93 KB)
PMO.mq5 (4.5 KB)
PMO_logger.mq5 (5.06 KB)
Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XVIII): Interaktivität des Kontos und aller anderen Bibliotheksobjekte Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XVIII): Interaktivität des Kontos und aller anderen Bibliotheksobjekte

Der Artikel reiht die Arbeit eines Kontoobjekts in ein neues Basisobjekt aller Bibliotheksobjekte ein, verbessert das Basisobjekt CBaseObj und testet die Einstellung von verfolgten Parametern sowie das Empfangen von Ereignissen für alle Bibliotheksobjekte.

Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XVII): Interaktivität von Bibliotheksobjekten Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XVII): Interaktivität von Bibliotheksobjekten

In diesem Artikel werden wir die Entwicklung des Basisobjekts aller Bibliotheksobjekte abschließen, so dass jedes darauf basierende Bibliotheksobjekt mit einem Nutzer interagieren kann. So kann der Nutzer beispielsweise die maximal akzeptable Größe eines Spreads zum Eröffnen einer Position und eines Preisniveaus einstellen, bei dessen Erreichen ein Ereignis aus einem Symbolobjekt mit dem spread- oder preisniveauabhängigen Signal an das Programm gesendet wird.

Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XIX): Klassenbibliothek für Nachrichten Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XIX): Klassenbibliothek für Nachrichten

In diesem Artikel werden wir die Klasse für die Darstellung von Textnachrichten besprechen. Derzeit haben wir eine ausreichende Anzahl verschiedener Textnachrichten. Es ist an der Zeit, die Methoden für die Speicherung, Anzeige und Übersetzung von russischen oder englischen Nachrichten in andere Sprachen neu zu organisieren. Außerdem wäre es gut, praktische Möglichkeiten einzuführen, um der Bibliothek neue Sprachen hinzuzufügen und schnell zwischen ihnen zu wechseln.

Erstellen eines Expert Advisors mit separaten Modulen Erstellen eines Expert Advisors mit separaten Modulen

Bei der Entwicklung von Indikatoren, Expert Advisors und Skripten müssen Entwickler oft verschiedene Codeteile erstellen, die nicht direkt mit der Handelsstrategie zusammenhängen. In diesem Artikel betrachten wir eine Möglichkeit, Expert Advisor zu erstellen, die zuvor erstellte Blöcke verwenden, wie z.B. Trailing, Filter und Ablauf-Code. Wir werden die Vorteile dieses Planungsansatzes erläutern.