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
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!
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 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); }
Ich habe genau dasselbe Problem...
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.
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); } //+------------------------------------------------------------------+
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.


"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.
Autor: Nikolay Kositsin