OnTimer und OnTick

 

Ich bemerke hin und wieder das ein EA die Fehlermeldung macht das OnTimer gestoppt wurde und soweit ich weis muss man dann den EA neu auf den Chart legen oder die Chartperiode aendern damit die OnTimer Funktion wieder startet, bei der OnTick Funktion ist es aber anders die wird bei jeden neuen Tick wieder von neu gestartet.

Wenn man also die OnTimer Funktion benutzt kann das ein Problem sein das der EA einige Stunden nicht am laufen ist weil es so eine Fehlermeldung gab und man es nicht gemerkt hat.

Meine Frage hier an euch ob ihr das Problem kennt und eine gute Loesung, kann man die OnTimer Funktion vielleicht auch von selbst wieder starten lassen oder mit der OnTick Funktion pruefen ob die OnTimer noch laeuft und dann nachstarten bei Problemen?

Man koennte natuerlich auch die ganze Zeit nur OnTick benutzen werden jetzt manche sagen, aber ihr wist ja hin und wieder zum Beispiel abends ist der Markt sehr langsam und dan kann auch mal einige Sekunden kein Tick kommen usw ich will schon gerne mit OnTimer arbeiten aber das ist natuerlich schon ein Problem wenn OnTimer nicht von selbst wieder neu startet.

Oder kennt jemand gute Tricks was man anderes machen kann, vielleicht in der OnTick eine Endlosschleife welche auch jede Sekunden neu durchlaeuft?

 

Könnte das an den generischen Einschränkungen liegen, die in der Dok. zu ihm stehen (Kursor auf OnTimer() und F1 drücken):

Im Allgemeinen wird bei einer Verkürzung der Zeitspanne des Timers die Testzeit erhöht, da der Handler von Timer-Ereignissen häufiger aufgerufen wird. Im Echtzeitbetrieb werden Timer-Ereignisse aufgrund von Hardware-Beschränkungen nicht mehr als 1 mal in 10-16 Millisekunden generiert.

Für jedes Programm kann nur ein Timer gestartet werden. Jede mql5-Anwendung und jedes Chart haben ihre eigene Warteschlange von Ereignissen, in der alle neu eingetroffenen Ereignisse eingetragen werden. Wenn die Warteschlange (queue) bereits das Ereignis des Timers enthält oder sich dieses Ereignis in der Verarbeitungsphase befindet, wird das neue Timer-Ereignis nicht zur Warteschlange der mql5-Anwendung hinzugefügt.

 
Carl Schreiber #:

Könnte das an den generischen Einschränkungen liegen, die in der Dok. zu ihm stehen (Kursor auf OnTimer() und F1 drücken):

woran das liegt weis ich nicht, aber wenn ich das richtig beobachtet habe startet der OnTimer nicht wieder von selbst und das ist natuerlich ein Problem wenn so eine wichtige Funktion gelegentlich stops ohne das man es merkt und wenn man gleichzeittig noch auf mehreren chart ein EA hat mit OnTimer, dann kommst du auch nicht mehr hinter her.

Wie wuerdest du das den loesen staendig nachkucken und neu starten oder was fuer ein Tipp hast du fuer ein workaround?

 
Email Account #:

woran das liegt weis ich nicht, aber wenn ich das richtig beobachtet habe startet der OnTimer nicht wieder von selbst und das ist natuerlich ein Problem wenn so eine wichtige Funktion gelegentlich stops ohne das man es merkt und wenn man gleichzeittig noch auf mehreren chart ein EA hat mit OnTimer, dann kommst du auch nicht mehr hinter her.

Wie wuerdest du das den loesen staendig nachkucken und neu starten oder was fuer ein Tipp hast du fuer ein workaround?

Da OnTimer auf dem Timer von Windows aufbaut, nur eine begrenzte Anzahl, am besten nur einer(!) verwendet und nicht fortlaufend an- und ausgeschaltet werden soll, im Strategietester auch nicht funktioniert und für eigentlich alles und jedes andere Ereignisfunktionen zur Verfügung stehen, würde ich ihn einfach vermeiden.
 
Email Account:

Ich bemerke hin und wieder das ein EA die Fehlermeldung macht das OnTimer gestoppt wurde und soweit ich weis muss man dann den EA neu auf den Chart legen oder die Chartperiode aendern damit die OnTimer Funktion wieder startet, bei der OnTick Funktion ist es aber anders die wird bei jeden neuen Tick wieder von neu gestartet.

Wenn man also die OnTimer Funktion benutzt kann das ein Problem sein das der EA einige Stunden nicht am laufen ist weil es so eine Fehlermeldung gab und man es nicht gemerkt hat.

Meine Frage hier an euch ob ihr das Problem kennt und eine gute Loesung, kann man die OnTimer Funktion vielleicht auch von selbst wieder starten lassen oder mit der OnTick Funktion pruefen ob die OnTimer noch laeuft und dann nachstarten bei Problemen?

Man koennte natuerlich auch die ganze Zeit nur OnTick benutzen werden jetzt manche sagen, aber ihr wist ja hin und wieder zum Beispiel abends ist der Markt sehr langsam und dan kann auch mal einige Sekunden kein Tick kommen usw ich will schon gerne mit OnTimer arbeiten aber das ist natuerlich schon ein Problem wenn OnTimer nicht von selbst wieder neu startet.

Oder kennt jemand gute Tricks was man anderes machen kann, vielleicht in der OnTick eine Endlosschleife welche auch jede Sekunden neu durchlaeuft?

Das bringt so nichts, wenn Du eine Antwort auf so ein Problem willst, musst Du auch Deinen Code zeigen. Wie soll man Dir helfen, wenn man gar nichts weiß?

int count = 0;
string message = "";
string error = "";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(count!=0)count=0;
   if(!EventSetTimer(1)) Print("Failure setting Event Timer");
   else PrintFormat("Event Timer set successfully, count = %d",count);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
void OnTimer(void)
  {if(GetLastError()!=0) {ResetLastError(); Alert(message,"\n",error);}
  
   message = StringFormat("%s %s %d", EnumToString((ENUM_PROGRAM_TYPE)MQLInfoInteger(MQL_PROGRAM_TYPE)), MQLInfoString(MQL_PROGRAM_NAME), count);
   
   error = StringFormat("Last Error #%d", GetLastError());
   
   Print(message,"\n",error);
   Comment(message,"\n",error);
      
   count++;
  }
Lass den mal auf einem Fenster mitlaufen. Wenn es einen Fehlercode gibt, kann man diesen vielleicht verwenden, um den Timer im Problemfall mit einem if Statement wieder zu starten.
 
Carl Schreiber #:
Da OnTimer auf dem Timer von Windows aufbaut, nur eine begrenzte Anzahl, am besten nur einer(!) verwendet und nicht fortlaufend an- und ausgeschaltet werden soll, im Strategietester auch nicht funktioniert und für eigentlich alles und jedes andere Ereignisfunktionen zur Verfügung stehen, würde ich ihn einfach vermeiden.

Siehst du geht doch das sind doch wichtige Informationen und ein Grund kein OnTimer zu benutzen, genau solche Infos brauch man und nicht Verweise zum Handbuch von Metaquotes

 
Tobias Johannes Zimmer #:

Das bringt so nichts, wenn Du eine Antwort auf so ein Problem willst, musst Du auch Deinen Code zeigen. Wie soll man Dir helfen, wenn man gar nichts weiß?

Lass den mal auf einem Fenster mitlaufen. Wenn es einen Fehlercode gibt, kann man diesen vielleicht verwenden, um den Timer im Problemfall mit einem if Statement wieder zu starten.

Das Problem mit OnTimer ist wieder so eins das nur hin und wieder vorkommt und ohne richtigen Hinweise woran es liegt, auch wenn ich dein Beispielcode probiere hat schon dein Vorredner einfach davon abgeraten OnTimer zu benutzen, ich wrde mal kucken ob ich ein workaround bauen kann und poste das dann hier. Dein Beispielcode koennte ich eigentlich auch mal testen, vielleicht zeigt der irgendwelche zusaetzlichen Fehlermeldungen, aber ich denke man wird trotzdem OnTimer nicht wieder neu starten koennen vom EA heraus

 

ohne code wird's schwierig warum die OnTimer einen Crash erzeugt.

 
amando #:

ohne code wird's schwierig warum die OnTimer einen Crash erzeugt.

es kommt halt immer wieder mal vor und das bloede ist wenn man paar charts offen hat und jeden tag passiert das irgendwann zufaellig dann kannst du damit nicht arbeiten, eine richtige Fehlermeldung gibt es auch nicht, nur der Hinweis das OnTimer gestoppt hat

 

Wie findet ihr dieses Workaround, eine while schleife wird gestartet in der OnTick Funktion und eine globale Variable ueberprueft ob die while Schleife schon einmal gestartet wurde, damit nicht bei jedem Tick von neu die while Schleife gestartet wird, habe mir gedacht das es so besser ist als ohne Extra Pruefung.

Aber vielleicht weis irgendjemand ein Grund warum diese Loesung auch nicht nuetzlich ist?

//+------------------------------------------------------------------+
//|                                           OnTimer Workaround.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
int starten;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
//---   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
if(starten==0)
{
   while(!IsStopped())
   {
      Alert("EA");
      Sleep(1000);
   }
}
starten=1;
//---   
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
 
Email Account #:

Wie findet ihr dieses Workaround, eine while schleife wird gestartet in der OnTick Funktion und eine globale Variable ueberprueft ob die while Schleife schon einmal gestartet wurde, damit nicht bei jedem Tick von neu die while Schleife gestartet wird, habe mir gedacht das es so besser ist als ohne Extra Pruefung.

Aber vielleicht weis irgendjemand ein Grund warum diese Loesung auch nicht nuetzlich ist?

"nur der Hinweis das OnTimer gestoppt hat "


Zeig das doch mal.


Kenne kein Fehler, der sich so wie es sagst, darstellt.

Zeig das Log zum Problem