Auf nächste Kerze warten

 

Moin,


ich bin neu beim Programmieren in MQL5 und wollte mal fragen wie ich folgenden Code wohl so ändern kann, dass das Programm innerhalb der while Schleife

nicht unendlich oft bei Ereignis einen Alert aussendet, sondern nur ein Mal und dann auf die nächste Kerze des Charts auf dem ausgewählten Timeframe wartet.

Ich weiß nicht ganz wie ich das Problem lösen kann, ich hab auch schon im Forum gesucht. Die Schleife ist von Zeile 67 bis 138.


PS. Ach und wo ich schonmal dabei bin. Meint ihr das die Abfrage nach dem Simple Moving Average so funktionieren würde, oder gibt es da irgendwelche offensichtlichen Fehler?

Gruß, Sven.

// Indikator Einstellungen.
#define INDICATOR_NAME "Umkehrstab Alert"
#define INDICATOR_SHORT_NAME "UA"

// Inputs.
input int CandlePeriod = 10; // Zeitperiode die zu kontrollieren ist.
input int MA_Periods = 21; // Anzahl der Perioden die vom Moving Average genutzt werden.
input bool MA_benutzen = true; // Legt fest ob der Moving Average mit genutzt werden soll.
input bool DHDL_benutzen = true; // Legt fest ob der Daily High / Daily Low mit genutzt werden soll.


// Buffers.
bool bPrevIsBullish = false;

// Indikatoren.
int iCustom;

// OnInit Function.
int OnInit()
{
  
   Print("Initialisierung begonnen");
  
   // Zeitperiode des Charts kontrollieren.
   if(Period() != CandlePeriod)
   {
     Print("Der Indikator muss auf einen Chart mit der Zeitperiode 10 Minuten angewandt werden");
     return(INIT_FAILED);
   }
   
   // Kontrollieren ob der Indikator bereits vorhanden ist.
   if(iCustom == iCustom(NULL, 0, INDICATOR_NAME, CandlePeriod, 0))
   {
     Print("Dieser Indikator existiert bereits.");
     Print("Initialisierung abgeschlossen");
     return(INIT_SUCCEEDED);
   }
   
   // Erstellen des Indikators.
   if(!iCustom)
       iCustom = iCustom(NULL, 0, INDICATOR_NAME, CandlePeriod, 0);
   
   Print("Initialisierung abgeschlossen");
   return(INIT_SUCCEEDED);
   
}

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[])
{
   //Kontrolliert ob der Indikator vorhanden.
   if(iCustom)
      return(rates_total);

   while(true)
   {
   
      int value_iMA = iMA(NULL, 0, MA_Periods, 0, MODE_SMA, PRICE_CLOSE);
      
      if(value_iMA == INVALID_HANDLE)
      {
      
         PrintFormat("Fehler beim erstellen des MA-Wertes des Symbols %s/%s, error code %d",
                     Symbol(),
                     EnumToString(Period()),
                     GetLastError());
      
      }
      
      double Vortageshoch = iHigh(NULL, PERIOD_D1, 0);
      double Vortagestief = iLow(NULL, PERIOD_D1, 0);
      
      bool CandleIsBullish = (close[1] > open[1]);
      bool PrevCandleIsBearish = (close[2] < open[2]);
      bool LowIsLower = (low[1] < low[2]);
      bool CloseIsHigher = (close[1] > close[2]);
      bool HighIsHigher = (high[1] > high[2]);
      bool CloseIsLower = (close[1] < close[2]);
      
      if(!MA_benutzen && !DHDL_benutzen)
      {
         if(CandleIsBullish && PrevCandleIsBearish && LowIsLower && CloseIsHigher)
            Alert("Up Umkehrstab in ", Symbol(), " auf ", CandlePeriod);
         
         if(!CandleIsBullish && !PrevCandleIsBearish && HighIsHigher && CloseIsLower)
            Alert("Down Umkehrstab in ", Symbol(), " auf ", CandlePeriod);
      }
      
      if(MA_benutzen && !DHDL_benutzen)
      {
         bool LowAboveMA = (close[1] > value_iMA);
         bool HighBelowMA = (high[1] < value_iMA);
      
         if(CandleIsBullish && PrevCandleIsBearish && LowIsLower && CloseIsHigher && LowAboveMA)
            Alert("Up Umkehrstab in ", Symbol(), " auf M", CandlePeriod, "über ", MA_Periods, "MA.");
         
         if(!CandleIsBullish && !PrevCandleIsBearish && HighIsHigher && CloseIsLower && HighBelowMA)
            Alert("Down Umkehrstab in ", Symbol(), " auf M", CandlePeriod, "unter ", MA_Periods, "MA.");
      }
      
      if(!MA_benutzen && DHDL_benutzen)
      {
         bool CloseAboveDH = (close[1] > Vortageshoch);
         bool CloseBelowDL = (close[1] < Vortagestief);
      
         if(CandleIsBullish && PrevCandleIsBearish && LowIsLower && CloseIsHigher && CloseAboveDH)
            Alert("Up Umkehrstab in ", Symbol(), " auf M", CandlePeriod, " über Tageshoch.");
         
         if(!CandleIsBullish && !PrevCandleIsBearish && HighIsHigher && CloseIsLower && CloseBelowDL)
            Alert("Down Umkehrstab in ", Symbol(), " auf M", CandlePeriod, " unter Tagestief.");
      }
      
      if(MA_benutzen && DHDL_benutzen)
      {
         bool CloseAboveDH = (close[1] > Vortageshoch);
         bool CloseBelowDL = (close[1] < Vortagestief);
         bool LowAboveMA = (close[1] > value_iMA);
         bool HighBelowMA = (high[1] < value_iMA);
         
         if(CandleIsBullish && PrevCandleIsBearish && LowIsLower && CloseIsHigher && LowAboveMA && CloseAboveDH)
            Alert("Up Umkehrstab in ", Symbol(), " auf M", CandlePeriod, " über ", MA_Periods, "MA und Tageshoch.");
         
         if(!CandleIsBullish && !PrevCandleIsBearish && HighIsHigher && CloseIsLower && HighBelowMA && CloseBelowDL)
            Alert("Down Umkehrstab in ", Symbol(), " auf M", CandlePeriod, " unter ", MA_Periods, "MA und Tagestief.");
      }
   }
   return(rates_total);
}
 
Number_4:

Moin,


ich bin neu beim Programmieren in MQL5 und wollte mal fragen wie ich folgenden Code wohl so ändern kann, dass das Programm innerhalb der while Schleife

nicht unendlich oft bei Ereignis einen Alert aussendet, sondern nur ein Mal und dann auf die nächste Kerze des Charts auf dem ausgewählten Timeframe wartet.

Ich weiß nicht ganz wie ich das Problem lösen kann, ich hab auch schon im Forum gesucht. Die Schleife ist von Zeile 67 bis 138.


PS. Ach und wo ich schonmal dabei bin. Meint ihr das die Abfrage nach dem Simple Moving Average so funktionieren würde, oder gibt es da irgendwelche offensichtlichen Fehler?

Gruß, Sven.

https://www.mql5.com/de/code/768


Gruß 

IsNewBar
IsNewBar
  • www.mql5.com
СIsNewBar Klasse erlaubt es, den Augenblick des Wechsels eines Balkens festzustellen.
 
Christian #:

https://www.mql5.com/de/code/768


Gruß 

Vielen Dank für die schnelle Antwort. Ich denke mal das die While schleife sowieso redundant ist, da sich das ganze ja in der onCalculate Funktion befindet, nicht?

Habe ich das richtig verstanden das ich Diese Abfrage einfach als Ersatz zu der while Schleife verwenden kann? Hier der angepasste Code:

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[])
{
   //Kontrolliert ob der Indikator vorhanden.
   if(iCustom)
      return(rates_total);
      
   static CIsNewBar NB1,NB2;

   if(NB1.IsNewBar(NULL, PERIOD_CURRENT))
   {
      int value_iMA = iMA(NULL, 0, MA_Periods, 0, MODE_SMA, PRICE_CLOSE);
      
      if(value_iMA == INVALID_HANDLE)
      {
      
         PrintFormat("Fehler beim erstellen des MA-Wertes des Symbols %s/%s, error code %d",
                     Symbol(),
                     EnumToString(Period()),
                     GetLastError());
      
      }
      
      double Vortageshoch = iHigh(NULL, PERIOD_D1, 0);
      double Vortagestief = iLow(NULL, PERIOD_D1, 0);
      
      bool CandleIsBullish = (close[1] > open[1]);
      bool PrevCandleIsBearish = (close[2] < open[2]);
      bool LowIsLower = (low[1] < low[2]);
      bool CloseIsHigher = (close[1] > close[2]);
      bool HighIsHigher = (high[1] > high[2]);
      bool CloseIsLower = (close[1] < close[2]);
      
      if(!MA_benutzen && !DHDL_benutzen)
      {
         if(CandleIsBullish && PrevCandleIsBearish && LowIsLower && CloseIsHigher)
            Alert("Up Umkehrstab in ", Symbol(), " auf ", CandlePeriod);
         
         if(!CandleIsBullish && !PrevCandleIsBearish && HighIsHigher && CloseIsLower)
            Alert("Down Umkehrstab in ", Symbol(), " auf ", CandlePeriod);
      }
      
      if(MA_benutzen && !DHDL_benutzen)
      {
         bool LowAboveMA = (close[1] > value_iMA);
         bool HighBelowMA = (high[1] < value_iMA);
      
         if(CandleIsBullish && PrevCandleIsBearish && LowIsLower && CloseIsHigher && LowAboveMA)
            Alert("Up Umkehrstab in ", Symbol(), " auf M", CandlePeriod, "über ", MA_Periods, "MA.");
         
         if(!CandleIsBullish && !PrevCandleIsBearish && HighIsHigher && CloseIsLower && HighBelowMA)
            Alert("Down Umkehrstab in ", Symbol(), " auf M", CandlePeriod, "unter ", MA_Periods, "MA.");
      }
      
      if(!MA_benutzen && DHDL_benutzen)
      {
         bool CloseAboveDH = (close[1] > Vortageshoch);
         bool CloseBelowDL = (close[1] < Vortagestief);
      
         if(CandleIsBullish && PrevCandleIsBearish && LowIsLower && CloseIsHigher && CloseAboveDH)
            Alert("Up Umkehrstab in ", Symbol(), " auf M", CandlePeriod, " über Tageshoch.");
         
         if(!CandleIsBullish && !PrevCandleIsBearish && HighIsHigher && CloseIsLower && CloseBelowDL)
            Alert("Down Umkehrstab in ", Symbol(), " auf M", CandlePeriod, " unter Tagestief.");
      }
      
      if(MA_benutzen && DHDL_benutzen)
      {
         bool CloseAboveDH = (close[1] > Vortageshoch);
         bool CloseBelowDL = (close[1] < Vortagestief);
         bool LowAboveMA = (close[1] > value_iMA);
         bool HighBelowMA = (high[1] < value_iMA);
         
         if(CandleIsBullish && PrevCandleIsBearish && LowIsLower && CloseIsHigher && LowAboveMA && CloseAboveDH)
            Alert("Up Umkehrstab in ", Symbol(), " auf M", CandlePeriod, " über ", MA_Periods, "MA und Tageshoch.");
         
         if(!CandleIsBullish && !PrevCandleIsBearish && HighIsHigher && CloseIsLower && HighBelowMA && CloseBelowDL)
            Alert("Down Umkehrstab in ", Symbol(), " auf M", CandlePeriod, " unter ", MA_Periods, "MA und Tagestief.");
      }
   }
   return(rates_total);
}
 
Number_4 #:

Vielen Dank für die schnelle Antwort. Ich denke mal das die While schleife sowieso redundant ist, da sich das ganze ja in der onCalculate Funktion befindet, nicht?

Habe ich das richtig verstanden das ich Diese Abfrage einfach als Ersatz zu der while Schleife verwenden kann? Hier der angepasste Code:

Soll das ein EA werden oder ein Indikator?


Ließ hier mal, was es so an Ereignissen gibt.

https://www.mql5.com/de/docs/event_handlers

Dokumentation zu MQL5: Ereignisbehandlung
Dokumentation zu MQL5: Ereignisbehandlung
  • www.mql5.com
Ereignisbehandlung - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Christian #:

Soll das ein EA werden oder ein Indikator?


Ließ hier mal, was es so an Ereignissen gibt.

https://www.mql5.com/de/docs/event_handlers

Da habe ich mir auch schon Gedanken zu gemacht, bin aber leider zu keinem klaren Ergebnis gekommen. Anfangs wollte ich einen EA machen, aber eigentlich soll das Programm nur bei Umkehrstäben einen Alert machen.

Von daher dachte ich ist ein Indikator bestimmt besser da ich so noch einen anderen EA den ich sonst immer nutze auf dem Chart lassen kann und keinen zweiten Chart brauche.

 
Number_4 #:

Da habe ich mir auch schon Gedanken zu gemacht, bin aber leider zu keinem klaren Ergebnis gekommen. Anfangs wollte ich einen EA machen, aber eigentlich soll das Programm nur bei Umkehrstäben einen Alert machen.

Von daher dachte ich ist ein Indikator bestimmt besser da ich so noch einen anderen EA den ich sonst immer nutze auf dem Chart lassen kann und keinen zweiten Chart brauche.

Wenn es ein Indikator wird, brauchst du kein IsNewBar.   Der wird ohnehin nur einmal bei einer neuen Kerze durchlaufen "OnCalculate)


While ist da ganz verkehrt.

 
Christian #:

Wenn es ein Indikator wird, brauchst du kein IsNewBar.   Der wird ohnehin nur einmal bei einer neuen Kerze durchlaufen "OnCalculate)


While ist da ganz verkehrt.

Ich war gerade am schreiben und am schreiben was hier bei meinem Code alles nicht funktioniert bis ich direkt am anfang der OnCalculate Funktion ein return befehl entdeckt habe... Dann kann es ja auch nicht funktionieren. Naja, Anfängerfehler.

Aber jetzt aktualisiert er bei jedem tick wie ich bereits erwartet hatte und nicht bei jedem neuen Bar. Also bin ich quasi wieder beim ursprünglichem Problem.

 
   //Kontrolliert ob der Indikator vorhanden.
   if(iCustom)
      return(rates_total);

Du hast keine Ahnung, wie man in MQL5 programmiert - richtig?

Stell mal,den Cursor auf iCustom und drück auf F1, da kannst Du dann sehen, wofür das gedacht ist, was es liefert ...
Außerdem ist hier eine Liste alle Funktionen mit kurzer Erklärung, sodass man mit Ctrl+F suchen kann: https://www.mql5.com/de/docs/function_indices

Lies vielleicht einmal "Einführung in MQL5: Schreiben eines einfachen Expert Advisor und benutzerdefinierten Indikators":  https://www.mql5.com/de/articles/35

Dazu vielleicht:

    https://www.metatrader5.com/de/metaeditor/help/development/debug
    https://www.mql5.com/de/articles/654
    Die Fehlerverarbeitung und Protokollierung in MQL5: https://www.mql5.com/de/articles/2041
    https://www.mql5.com/de/articles/272
    Fehler finden und Protokollierung  https://www.mql5.com/de/articles/150
    Can i get any Free Tutorial for Forex Trading?  https://www.mql5.com/en/forum/381853#comment_25845157

Außerdem, es gibt fast nichts(!), was nicht schon für MT4/5 programmiert wurde und in der CodeBase oder als Artikel vorliegt, d.h. ERST suchen dann es selbst versuchen. Spart viel Zeit!

Bei der Suche ist manchmal Google mit "site:mql5.com " besser als die Suche hier. Z.B. "NewBar newBar site:mql5.com" in der Suchzeile

Einführung in MQL5: Schreiben eines einfachen Expert Advisor und benutzerdefinierten Indikators
Einführung in MQL5: Schreiben eines einfachen Expert Advisor und benutzerdefinierten Indikators
  • www.mql5.com
Die im MetaTrader 5 Client Terminal enthaltene MetaQuotes Programming Language 5 (MQL5) bietet im Vergleich zu MQL4 zahlreiche neue Möglichkeiten und bessere Performance. Dieser Beitrag hilft Ihnen dabei, sich mit dieser neuen Programmiersprache vertraut zu machen. In diesem Beitrag werden einfache Beispiele zum Schreiben eines Expert Advisors und eines benutzerdefinierten Indikators vorgestellt. Wir werden auch auf einige Details der MQL5-Sprache eingehen, die notwendig sind, um diese Beispiele zu verstehen.
 
Carl Schreiber #:

Du hast keine Ahnung, wie man in MQL5 programmiert - richtig?

Stell mal,den Cursor auf iCustom und drück auf F1, da kannst Du dann sehen, wofür das gedacht ist, was es liefert ...
Außerdem ist hier eine Liste alle Funktionen mit kurzer Erklärung, sodass man mit Ctrl+F suchen kann: https://www.mql5.com/de/docs/function_indices

Lies vielleicht einmal "Einführung in MQL5: Schreiben eines einfachen Expert Advisor und benutzerdefinierten Indikators":  https://www.mql5.com/de/articles/35

Dazu vielleicht:

    https://www.metatrader5.com/de/metaeditor/help/development/debug
    https://www.mql5.com/de/articles/654
    Die Fehlerverarbeitung und Protokollierung in MQL5: https://www.mql5.com/de/articles/2041
    https://www.mql5.com/de/articles/272
    Fehler finden und Protokollierung  https://www.mql5.com/de/articles/150
    Can i get any Free Tutorial for Forex Trading?  https://www.mql5.com/en/forum/381853#comment_25845157

Ja die zwei Zeilen hatte ich zum einen aus einem anderen Code abgeschrieben, und dann ja eben in meinem letzten Kommentar korrigiert. Mein Problem liegt wie gesagt jetzt immernoch daran das ich nur beim nächsten Bar Abfragen will und nicht dauerhaft.
 
Number_4 #:
Ja die zwei Zeilen hatte ich zum einen aus einem anderen Code abgeschrieben, und dann ja eben in meinem letzten Kommentar korrigiert. Mein Problem liegt wie gesagt jetzt immernoch daran das ich nur beim nächsten Bar Abfragen will und nicht dauerhaft.

if (!newBar) return;

Aber auch hier zeigen alle Indikatoren wie das richtigerweise gemacht wird.

 
Carl Schreiber #:

if (!newBar) return;

Aber auch hier zeigen alle Indikatoren wie das richtigerweise gemacht wird.

Nach etlichem suchen habe ich jetzt eine Bibliothek gefunden die so eine Abfrage wie newBar kann: https://www.mql5.com/en/code/39899

Aber danke das du mich darauf gebracht hast, ich dachte das währe deutlich komplizierter.

Und danke auf für die Liste mit den Funktionen und dem Tipp mit F1, das wusste ich noch nicht.


Euch noch ein Schönes Wochenende und danke für die Hilfe.

New Bar Event
New Bar Event
  • www.mql5.com
Allows you to determine the occurrence of a new bar event in a multicurrency Expert Advisor