Einzelnen Beitrag anzeigen
  #1 (permalink)  
Alt 21.05.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard Frage zu OnInit() (insbesondere zu EventSetTimer() und zu return(INIT_SUCCEEDED))

Hallo,

der Zweck der Funktion OnInit() ist mir im Großen und Ganzen soweit klar. OnInit() ist die Funktion die beim Starten eines EA immer zuerst aufgerufen wird, alle weiteren Funktionen müssen somit aus OnInit() heraus aufgerufen werden.

Wenn ich in MT eine neue, leere Datei für einen neuen EA öffne, enthält diese immer bereits die Funktion OnInit() (klar, diese wird ja als "Programmstartpunkt" immer gebraucht) und die Funktion OnInit() enthält immer bereits die Funktion EventSetTimer() sowie return(INIT_SUCEEDED).

Was mir derzeit noch nicht klar ist, ist, wozu ich EventSetTimer() benötige. Der Dokumentation entnehme ich hinsichtlich EventSetTimer() diese Erklärung:

Zitat:
The function indicates to the client terminal, that for this indicator or Expert Advisor, events from the timer must be generated with the specified periodicity.

Quelle:
https://docs.mql4.com/eventfunctions/eventsettimer

Weiterhin findet sich für "Timer" diese Erklärung in der Dokumentation:


Zitat:
The Timer event is periodically generated by the client terminal for the Expert Advisor that has activated the timer by the EventSetTimer function. Usually, this function is called by OnInit. Timer event processing is performed by the OnTimer function. After the operation of the Expert Advisor is completed, it is necessary to destroy the timer using the EventKillTimer function, which is usually called in the OnDeinit function.

Quelle:
https://docs.mql4.com/runtime/event_fire#timer

In den Default-Einstellungen wird bei der Erstellung eines neuen EA dem EventSetTimer() ein Wert von 60 übergeben (ich vermute mal, das sind 60 Sekunden):

Code:
EventSetTimer(60);
Das heißt offenbar, dass nach Ablauf des Timers (in dem Fall also alle 60 Sekunden) "etwas" passiert? Aber was ist es, dass nach Ablauf des Timers (hier 60 Sekunden) passiert? Wird nach Ablauf des Timers, d.h. hier nach 60 Sekunden die Funktion OnInit() erneut gestartet?



---



Was ich nur teilweise verstehe, ist, was der Rückgabewert von OnInit() und somit diese Codezeile am Ende der Funktion OnInit() bewirken soll:

Code:
return(INIT_SUCCEEDED);
Offenbar soll die Methode OnInit() nach Durchlauf der Methode OnInit() am Ende INIT_SUCEEDED zurückgeben. INIT_SUCEEDED ist ofenbar ein Ereignis. In der Dokumentation steht:

Zitat:
Successful initialization, testing of the Expert Advisor can be continued.

Quelle:
https://docs.mql4.com/basis/function/events

Mir ist nicht klar, was die Rückgabe dieses Ereignisses bewirken soll. Überdies ist als Default-Wert für die Methodensignatur von OnInit() bei MT als Typ für den Rückgabewert INT vorgesehen, d.h. die Methodensignatur sieht, in der Standardeinstellung, so aus:


Code:
int OnInit()

Das Ereignis INIT_SUCEEDED dürfte wohl kein Integer-Wert sein (?), insofern passen der in der Methodensignatur angegebene Variablentyp für den Rückgabewert der Methode OnInit() gar nicht zum tatsächlich zurückgegebenen Wert? Seltsamerweise scheint das dieser Widerspruch aber auch nicht zu einer Fehlermeldung zu führen?


---

Die Beschreibung von INIT_SUCEEDED in der Dokumentation (s.o.) hat mich auf die Idee gebracht, dass die Rückgabe des Ereignis INIT_SUCEEDED womöglich nur fürs Debugging gedacht ist, d.h. lediglich den Zweck hat, dem Programmierer anzuzeigen, dass die Methode OnInit() bis zum Ende durchlaufen wurde und somit kein (trivialer) Fehler im Programmablauf aufgetreten ist? Demnach könnte return(INIT_SUCEEDED) nach dem Teten/Debuggen des EA aus dem Programmcode entfernt werden?


Immer noch ungeklärt wäre dann aber:
  1. Wieso führt es nicht zu einer Fehlermeldung, dass eine Methode mit der Signatur int OnInit() keinen integer-Wert, sondern ein Ereignis INIT_SUCEEDED zurückgibt?

  2. Wieso wird es so kompliziert gemacht, bzw. was macht MT bzw. das Terminal dann mit dem Ereignis INIT_SUCEEDED, nachdem es zurückgegeben wurde? Wieso nicht nicht, anstelle ein obskures "Ereignis" zurückzugeben nicht lieber eine entsprechende Textausgabe aus der Konsole ausgegeben, z.B. etwas in der Art:

Zitat:
"OnInit() wurde bis zum Ende durchlaufen, somit ist kein (trivialer) Fehler im Programmablauf eingetreten"



----

Ich freue mich wie immer über jeden konstruktiven Hinweis!

Besten Dank und Grüße,
LQK

Geändert von Master (21.05.20 um 23:17 Uhr)