Indikatoren: "Center of Gravity" von J. F. Ehlers

 

"Center of Gravity" von J. F. Ehlers:

Der "Center of Gravity" (Gravitätszentrum) ist ein Oszillator, der von John Ehlers entwickelt und im Magazin "Stocks & Commodities" (Mai, 2002) veröffentlicht wurde.

Fig.1 Center Of Gravity indicator

Autor: Nikolay Kositsin

 
Das ist nützlich! ... Ich würde gerne die Kriterien für den Farbwechsel kennen.
 

Hallo,

Dieser Oszillator ist ein toller Oszillator, aber ich habe Probleme damit.

Das Ende der Signallinie, die durch die letzte Kerze berechnet wird, wird nicht angezeigt, also zeigt er immer rot zum jetzigen Zeitpunkt. Wenn ich den Oszillator zurücksetze, zeigt er für einen Moment mit dem Ende der Signallinie gute Werte an, schaltet dann aber wieder auf rot um (auch wenn er eigentlich grün anzeigen müsste).

Was sollte ich tun, um dieses Problem zu beheben?

Ich habe versucht, ihn neu zu debuggen, aber das hat nicht geholfen.

Grüßt,

InfiniteDesign

 
Seiner Meinung nach dieser Indikator , der mit mehor und Symbol und Zeitrahmen funktioniert.
Was die besten Werte für die Parameter dieses Indikators?
 

Vielen herzlichen Dank für diesen großartigen Indikator.

Ich fand die vorherige Version genauso interessant und nützlich wie die neue, oder sogar noch mehr.

Könnten Sie bitte den alten Indikator auch auf mq5 portieren? Ich würde es sehr zu schätzen wissen, wenn das möglich wäre.


Prost und vielen Dank im Voraus!

 
Dieser Indikator ist nicht-deterministisch. Fragt man zweimal nach denselben Datenpunkten zu unterschiedlichen Zeiten, erhält man unterschiedliche Antworten. Die Abweichung ist größer, je näher der aktuelle Zeitpunkt liegt. Die Unstimmigkeit kann bis zu 3,7 x 10^-04 betragen.
 
InfiniteDesign:

Hallo,

Dieser Oszillator ist ein toller Oszillator, aber ich habe Probleme damit.

Das Ende der Signallinie, die durch die letzte Kerze berechnet wird, wird nicht angezeigt, also zeigt er immer rot zum jetzigen Zeitpunkt. Wenn ich den Oszillator zurücksetze, zeigt er für einen Moment mit dem Ende der Signallinie gute Werte an, schaltet dann aber wieder auf rot um (auch wenn er eigentlich grün anzeigen müsste).

Was sollte ich tun, um dieses Problem zu beheben?

Ich habe versucht, ihn neu zu debuggen, aber das hat nicht geholfen.

Grüßt,

InfiniteDesign

Ich habe das gleiche Problem...
 

Ich habe versucht, ein Signal aus diesem Indikator zu erstellen, aber es ist mir nicht gelungen...

Kann mir jemand helfen?


//+------------------------------------------------------------------+
//|COG.mqh |
//|Bruno Pio |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Bruno Pio"
#property link      "http://www.mql5.com"
#property version   "1.00"
#include "..\ExpertSignal.mqh"   // CExpertSignal ist in der Datei ExpertSignal
#property tester_indicator "CenterOfGravity.ex5"
// Assistentenbeschreibung Start
//+------------------------------------------------------------------+
//| Beschreibung der Klasse|
//| Titel=Signale des Schwerpunkts|
//| Typ=SignalAdvanced|
//| Name=Mein_COG|
//| Kurzname=CG|
//| Klasse=COG|
//| Seite=Nicht benötigt|
//| Parameter=Period_,int,10,Indikator Mittelungszeitraum |
//| Parameter=Glättungsperiode,int,3,Glättungsperiode der Signalleitung |
//| Parameter=MA_Methode_,ENUM_MA_METHOD,MODE_EMA,Signalmethode |
//| Parameter=AngewandterPreis,int,1,Preiskonstante |
//+------------------------------------------------------------------+
// Beschreibung des Assistenten Ende
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
class COG : public CExpertSignal
  {
private:
CiCustom             m_COG;               // Der Indikator als Objekt
//--- Konfigurierbare Modulparameter
   int               m_Period_;           // Mittelungszeitraum des Indikators
   int               m_SmoothPeriod;      // Glättungszeitraum der Signalleitung 
   ENUM_MA_METHOD    m_MA_Method_;        // Mittelungsmethode für Signalleitungen
   int               m_AppliedPrice;      // Preiskonstante
public:
                     COG(void);
                    ~COG(void);
//--- Überprüfung der Korrektheit der Eingabedaten
   bool              ValidationSettings();
//--- Erstellen von Indikatoren und Zeitreihen für das Modul der Signale
   bool              InitIndicators(CIndicators *indicators);
//--- Zugang zu Indikatordaten
   double            CG(const int index)                 const { return(m_COG.GetData(0,index)); }
   double            Signal(const int index)             const { return(m_COG.GetData(1,index)); }   
//--- Überprüfung der Kauf- und Verkaufsbedingungen
   virtual int       LongCondition();
   virtual int       ShortCondition();
//--- Methoden zur Einstellung
   void              Period_(int value)               { m_Period_=value;        }
   void              SmoothPeriod(int value)          { m_SmoothPeriod=value;   }
   void              MA_Method_(ENUM_MA_METHOD value) { m_MA_Method_=value;     }
   void              AppliedPrice(int value)          { m_AppliedPrice=value;   }
protected:
   //--- Indikator erstellen
   bool              CreateCOG(CIndicators *indicators);



  };
//+------------------------------------------------------------------+
//| Konstruktor|
//+------------------------------------------------------------------+
COG::COG(void) :           m_Period_(10),                // Mittelungszeitraum des Indikators
                           m_SmoothPeriod(3),            // Glättungszeitraum der Signalleitung 
                           m_MA_Method_(MODE_EMA),       // Mittelungsmethode für Signalleitungen
                           m_AppliedPrice(1)             // Preiskonstante
  {
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
COG::~COG()
  {
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Prüft die Eingabeparameter und gibt true zurück, wenn alles in Ordnung ist.
//+------------------------------------------------------------------+
bool COG:: ValidationSettings()
  {
   //--- Aufruf der Basisklassenmethode
   if(!CExpertSignal::ValidationSettings())  return(false);
   //--- Perioden prüfen, Anzahl der Balken für die Berechnung des MA >=1
   if(m_Period_<1)
     {
      PrintFormat("Incorrect value set for one of the period! Period_=%d",
                  m_Period_);
      return false;
     }
//--- Perioden prüfen, Anzahl der Balken für die Berechnung des MA >=1
   if(m_SmoothPeriod<1)
     {
      PrintFormat("Incorrect value set for one of the period! m_SmoothPeriod=%d",
                  m_SmoothPeriod);
      return false;
     }
//--- Der Typ der schnellen MA-Glättung muss einer der vier Werte der Aufzählung sein
   if(m_MA_Method_!=MODE_SMA && m_MA_Method_!=MODE_EMA && m_MA_Method_!=MODE_SMMA && m_MA_Method_!=MODE_LWMA)
     {
      PrintFormat("Invalid type of smoothing of the fast MA!");
      return false;
     }
//--- m_AppliedPrice muss gültig sein
   if(m_AppliedPrice<1 || m_AppliedPrice>11) 
     {
      PrintFormat("Invalid type of Price!");
      return false;
     }
//--- Alle Prüfungen sind abgeschlossen, alles ist in Ordnung
   return true;
  }
//+------------------------------------------------------------------+
//| Erstellt Indikatoren|
//| Eingabe: ein Zeiger auf eine Sammlung von Indikatoren
//| Ausgabe: true bei Erfolg, sonst false |
//+------------------------------------------------------------------+
bool COG::InitIndicators(CIndicators *indicators)
  {
//--- Standardprüfung der Sammlung von Indikatoren auf NULL
   if(indicators==NULL) return(false);
//--- Initialisierung von Indikatoren und Zeitreihen in zusätzlichen Filtern
   if(!CExpertSignal::InitIndicators(indicators)) return(false);
//--- Erstellung unserer Indikatoren
   if(!CreateCOG(indicators))                  return(false);   
//--- Erreicht diesen Teil, also war die Funktion erfolgreich, Rückgabe true
   return(true);
  }
//+------------------------------------------------------------------+
//| Erzeugt den Indikator "COG".|
//+------------------------------------------------------------------+
bool COG::CreateCOG(CIndicators *indicators)
  {
//--- Überprüfung des Zeigers
   if(indicators==NULL) return(false);
//--- Hinzufügen eines Objekts zur Sammlung
   if(!indicators.Add(GetPointer(m_COG)))
     {
      printf(__FUNCTION__+": Error adding an object of the COG");
      return(false);
     }
//--- Einstellung der Parameter des COG
   MqlParam parameters[5];
//---
   parameters[0].type=TYPE_STRING;
   parameters[0].string_value="CenterOfGravity.ex5";
   parameters[1].type=TYPE_INT;
   parameters[1].integer_value=m_Period_;                 // Zeitraum
   parameters[2].type=TYPE_INT;
   parameters[2].integer_value=m_SmoothPeriod;            // Glättungszeitraum der Signalleitung
   parameters[3].type=TYPE_INT;
   parameters[3].integer_value=m_MA_Method_;              // Mittelungsmethode für Signalleitungen
   parameters[4].type=TYPE_INT;
   parameters[4].integer_value=m_AppliedPrice;            // Preiskonstante
//--- Objektinitialisierung 
   if(!m_COG.Create(m_symbol.Name(),0,IND_CUSTOM,5,parameters))
     {
      printf(__FUNCTION__+": Error initializing the object of the COG");
      return(false);
     }
//--- Anzahl der Puffer
   if(!m_COG.NumBuffers(2)) return(false);
//--- Erreicht diesen Teil, also war die Funktion erfolgreich, Rückgabe true
   return(true);
  }
//+------------------------------------------------------------------+
//| Gibt die Stärke des Kaufsignals zurück|
//+------------------------------------------------------------------+
int COG::LongCondition()
  {
   int signal=0;
//--- Bei Betrieb mit Ticks idx=0, bei Betrieb mit geformten Balken idx=1
   int idx=StartIndex();
//--- Werte der COGs beim letzten gebildeten Balken
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- Werte der COGs am vorletzten gebildeten Balken
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//---wenn CG > Signal && CG-1 < Signal-1
   if((last_fast_value>last_slow_value) && (prev_fast_value<prev_slow_value))
     {
      signal=100; // Es gibt ein Signal zum Kauf
     }
//--- Rückgabe des Signalwertes
   return(signal);
  }
//+------------------------------------------------------------------+
//| Gibt die Stärke des Verkaufssignals zurück|
//+------------------------------------------------------------------+
int COG::ShortCondition()
  {
   int signal=0;
//--- Bei Betrieb mit Ticks idx=0, bei Betrieb mit geformten Balken idx=1
   int idx=StartIndex();
//--- Werte der COGs beim letzten gebildeten Balken
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- Werte der COGs am vorletzten gebildeten Balken
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//---wenn CG < Signal && CG-1 > Signal-1
   if((last_fast_value<last_slow_value) && (prev_fast_value>prev_slow_value))
     {
      signal=100; // Es gibt ein Signal zum Verkauf
     }
//--- Rückgabe des Signalwertes
   return(signal);
  }
 
interessante Sache... muss den Algorithmus unter Kampfbedingungen bestimmen
 

Der Indikator wird ohne Fehler kompiliert:

und er funktioniert -

------------------

Sie müssen nur die feste Datei smoothalgorithms.mqh verwenden - siehe Beitrag


Indicators: T3Taotra_HTF
Indicators: T3Taotra_HTF
  • 2016.06.30
  • www.mql5.com
T3Taotra_HTF: Author: Nikolay Kositsin...
 
Bruno Pio #:
Ich habe genau dasselbe Problem...
Ich habe so viele wertvolle Dinge von der Community erhalten, dass ich etwas zurückgeben möchte.

Das ist ein brillanter Indikator (wenn man auch die übergeordneten Trends berücksichtigt). Ich schicke dir die verbesserte Version, bei der das Ende nicht mehr nur rot ist und die auf dem Live-Chart korrekt aktualisiert wird.

Verwende beim Einfügen von Code dieCODE-Taste (Alt-S).

Ein Moderator hat diesmal die Formatierung korrigiert. Bitte formatieren Sie den Code in Zukunft korrekt; Beiträge mit falsch formatiertem Code können entfernt werden.

/*
 * Die Datei „SmoothAlgorithms.mqh“ muss unter 
 * in den Ordner „terminal_data_folder\MQL5\Include“
 */
//+------------------------------------------------------------------+
//|                                            Center of Gravity.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright „Copyright © 2007, MetaQuotes Software Corp.“
#property link      "http://www.metaquotes.net"
//---- Indikatorversion
#property version   "1.00"
//---- Zeichnen des Indikators in einem separaten Fenster
#property indicator_separate_window
//---- Für die Berechnung und Darstellung des Indikators werden drei Puffer verwendet
#property indicator_buffers 3
//---- Es werden zwei Diagramme verwendet
#property indicator_plots   2
//+----------------------------------------------+
//|  Parameter für die Darstellung von Indikatoren                |
//+----------------------------------------------+
//---- Anzeige 1 als dreifarbige Linie zeichnen
#property indicator_type1 DRAW_COLOR_LINE
//---- wird als dreifarbige Linienfarbe verwendet
#property indicator_color1 Gray,Lime,Red
//---- Die Linie des Indikators 1 ist eine durchgehende Kurve
#property indicator_style1  STYLE_SOLID
//---- Die Strichstärke des Indikators 1 beträgt 1
#property indicator_width1  1
//---- Anzeige der Indikatorbezeichnung 1
#property indicator_label1  "Center of Gravity"
//+----------------------------------------------+
//|  Parameter für die Darstellung von Indikatoren                |
//+----------------------------------------------+
//---- Anzeige 2 als Linie zeichnen
#property indicator_type2   DRAW_LINE
//---- Die Farbe Blau wird als Farbe der Indikatorlinie verwendet
#property indicator_color2  Blue
//---- Die Linie des Indikators 2 ist eine durchgehende Kurve
#property indicator_style2  STYLE_SOLID
//---- Die Strichstärke des Indikators 2 beträgt 1
#property indicator_width2  1
//---- Anzeige der Beschriftung der Indikatorlinie 2
#property indicator_label2  "Signal Line"
//---- Der Linienstil ist eine Punkt-Strich-Kurve
#property indicator_style2 STYLE_DASHDOTDOT
//+-----------------------------------+
//|  Eingabeparameter für Indikatoren      |
//+-----------------------------------+
enum Applied_price_ //Konstantentyp
  {
   PRICE_CLOSE_ = 1,     //PRICE_CLOSE
   PRICE_OPEN_,          //ERÖFFNUNGSPREIS
   PRICE_HIGH_,          //PRICE_HIGH
   PRICE_LOW_,           //PRICE_LOW
   PRICE_MEDIAN_,        //PREIS-MEDIAN
   PRICE_TYPICAL_,       //TYPISCHER PREIS
   PRICE_WEIGHTED_,      //PREISGEWICHTET
   PRICE_SIMPLE_,//PRICE_SIMPLE_
   PRICE_QUARTER_,       //PRICE_QUARTER_
   PRICE_TRENDFOLLOW0_,  //PRICE_TRENDFOLLOW0_
   PRICE_TRENDFOLLOW1_   //PRICE_TRENDFOLLOW1_
  };
input int Period_=10;                          // Mittelwertbildungszeitraum des Indikators
input int SmoothPeriod=3;                      // Glättungszeitraum der Signalleitung
input ENUM_MA_METHOD MA_Method_=MODE_SMA;      // Verfahren zur Mittelwertbildung von Signalleitungen
input Applied_price_ AppliedPrice=PRICE_CLOSE_;// Preiskonstante
/* , wird zur Berechnung des Indikators verwendet (1-SCHLIEßKURS, 2-ERÖFFNUNGSKURS, 3-HÖCHSTKURS, 4-LOW, 
  5-MEDIAN, 6-TYPICAL, 7-WEIGHTED, 8-SIMPLE, 9-QUARTER, 10-TRENDFOLLOW, 11-0,5 * TRENDFOLLOW.) */
//+-----------------------------------+
//---- Deklaration dynamischer Arrays, die weiter
//---- wird als Indikatorpuffer verwendet
double Ext1Buffer[];
double Ext2Buffer[];
double ColorExt2Buffer[];
//---- Deklaration der Ganzzahlvariablen für den Beginn der Datenberechnung
int StartBar;
//+------------------------------------------------------------------+
//| Funktionsbeschreibung „iPriceSeries“                                |
//| Beschreibung der Klasse „Moving_Average“                                 | 
//+------------------------------------------------------------------+ 
#include <SmoothAlgorithms.mqh> 
//+------------------------------------------------------------------+
//| Initialisierungsfunktion für benutzerdefinierte Indikatoren                         |
//+------------------------------------------------------------------+ 
void OnInit()
  {
//---- Initialisierung von Konstanten
   StartBar=Period_;
//---- Das dynamische Array „MAMABuffer“ als Indikatorpuffer festlegen
   SetIndexBuffer(0,Ext1Buffer,INDICATOR_DATA);
//---- Erstellen einer Beschriftung zur Anzeige im DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"Center of Gravity");
//---- Verschieben des Startpunkts für die Darstellung des Indikators
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartBar);
//---- Umwandlung eines dynamischen Arrays in einen Farbindexpuffer  
   SetIndexBuffer(1,ColorExt2Buffer,INDICATOR_COLOR_INDEX);
//---- Verschieben des Startpunkts für die Darstellung des Indikators
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,StartBar+1);

//---- Das dynamische Array „FAMABuffer“ als Indikator-Array festlegen
   SetIndexBuffer(2,Ext2Buffer,INDICATOR_DATA);
//---- Erstellen einer Beschriftung zur Anzeige im DataWindow
   PlotIndexSetString(2,PLOT_LABEL,"Signal Line");
//---- Verschieben des Startpunkts für die Darstellung des Indikators
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,StartBar+1);

//---- Initialisierung der Variablen für die Kurzbezeichnung des Indikators
   string shortname;
   StringConcatenate(shortname,"Center of Gravity(",Period_,")");
//---- Erstellen eines Namens zur Anzeige in einem separaten Unterfenster und in einem Tooltip
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//---- Genauigkeit der Anzeige der Indikatorwerte festlegen
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//----
  }
//+------------------------------------------------------------------+
//| Iterationsfunktion für benutzerdefinierte Indikatoren                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    // Anzahl der Balken im Verlauf zum aktuellen Tick
                const int prev_calculated,// Anzahl der Takte, die beim letzten Aufruf berechnet wurde
                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[])
  {
//---- Überprüfung, ob die Anzahl der Balken für die Berechnung ausreicht
   if(rates_total<StartBar) return(0);

//---- Deklaration von Variablen mit Gleitkommazahlen 
   double price_,sma,lwma;
//---- Deklaration von Integer-Variablen
   int first1,first2,first3,bar;

//---- Initialisierung des Indikators im OnCalculate()-Block
   if(prev_calculated>rates_total || prev_calculated<=0)// Überprüfung, ob die Berechnung eines Indikators zum ersten Mal gestartet wurde
     {
      first1=0; // Startzahl für die Berechnung aller Takte der ersten Schleife
      first2=Period_+1; // Startnummer für die Berechnung aller Balken der Signalleitungen
      first3=Period_+SmoothPeriod+3; // Startwert für die Berechnung aller farbigen Schleifenbalken
     }
   else // Startwert für die Berechnung neuer Balken
     {
      first1=prev_calculated-1;
      first3=first1;
     }

//---- KORREKTUR (ergänzend): Bei einem Aufruf der MASeries-Funktion „jelvonal“ (Signalleitung) muss der Parameter „begin“ immer
//---- Es muss derselbe FESTE Zuverlässigkeitsschwellenwert (Period_+1) gelten – ursprünglich aktiv
//---- Es wurde fälschlicherweise auf das sich ständig ändernde „first1“ (d. h. auf den aktuellen Zündkerzenindex) verwiesen.
//---- Es wurde festgestellt, dass bei jedem lebenden Tick die verarbeitete Kerze übereinstimmte, was zu Verwirrung führte bei der
//---- Die Logik der „Belső-Simító-Klasse“ („Wie lange sind die Daten vertrauenswürdig?“) – deshalb war sie instabil/fehlerhaft
//---- Der aktuelle Wert der Jelvonal-Linie; aus diesem Grund „verbessert“ er sich erst nach einem TF-Wechsel (vollständiger Neuberechnung).
   first2=Period_+1;

//---- Deklaration der Variablen der Klasse „Moving_Average“
   static CMoving_Average MA,LWMA,SIGN;

//---- Hauptzyklus zur Berechnung der Kanalmittellinie
   for(bar=first1; bar<rates_total; bar++)
     {
      //---- Aufruf der Funktion „PriceSeries“, um die Eingabepreis-„Serie“ abzurufen
      price_=PriceSeries(AppliedPrice,bar,open,low,high,close);

      sma=MA.MASeries(0,prev_calculated,rates_total,Period_,MODE_SMA,price_,bar,false);
      lwma=LWMA.MASeries(0,prev_calculated,rates_total,Period_,MODE_LWMA,price_,bar,false);

      Ext1Buffer[bar]=sma*lwma/_Point;
      Ext2Buffer[bar]=SIGN.MASeries(first2,prev_calculated,rates_total,SmoothPeriod,MA_Method_,Ext1Buffer[bar],bar,false);
     }

//---- Hauptschleife für die Einfärbung der Signalleitung
   for(bar=first3; bar<rates_total; bar++)
     {
      ColorExt2Buffer[bar]=0;
      if(Ext1Buffer[bar]<Ext2Buffer[bar])
         ColorExt2Buffer[bar]=2;
      else ColorExt2Buffer[bar]=1;
     }
//----   
   return(rates_total);
  }
//+------------------------------------------------------------------+