Einzelnen Beitrag anzeigen
  #2 (permalink)  
Alt 21.05.20
Benutzerbild von Indikator-Trading
Indikator-Trading Indikator-Trading ist offline
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

viele viele Fragen... hier ein paar Antworten dazu:

Zitat:
Was mir derzeit noch nicht klar ist, ist, wozu ich EventSetTimer() benötige.
Benötigst du auch nur, wenn du einen Timer verwenden willst. Beim Erstellen eines EAs kannst du über Checkboxen aussuchen, welche vordefinierten Funktionen du im EA haben willst. Da scheint der Timer noch bei dir ausgewählt zu sein. Lösch den Code einfach, wenn du ihn nicht benötigst.

Zitat:
Was ich nur teilweise verstehe, ist, was der Rückgabewert von OnInit() und somit diese Codezeile am Ende der Funktion OnInit() bewirken soll:
In der OnInit() Funktion kannst du Initialisierungen durchführen. Der normale 0815 EA benötigt hier wenn überhaupt eine Abfrage, ob die Eingabedaten deines EAs auch sinnvoll sind. Also ob die Input-Variablen, welche du z. B. beim Starten des EAs setzt auch sinn ergeben. Z.B. hast du eine Input-Variable für einen MovingAverage Wert. Willst du hier nur Werte >10 zulässig haben, dann kannst du das hier abfragen.


Zitat:
Mir ist nicht klar, was die Rückgabe dieses Ereignisses bewirken soll.[/
Die Enum ENUM_INIT_RETCODE definiert 3 Werte:
INIT_SUCCEEDED |INIT_FAILED | INIT_PARAMETERS_INCORRECT

Nur bei SUCCEEDED läuft der EA an. Ansonsten wird das OnDeinit() durchgeführt, welches auch bei den meisten EAs von vielen "Programmierern" leer sein wird.

Im OnDeinit kannst du zusätzlich abhängig vom Grund der Deinitialisierung definieren was passieren soll.

Ich hoffe ich konnte dir weiterhelfen.


Zitat:
Zitat von LQK Beitrag anzeigen
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:




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





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:




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:






----

Ich freue mich wie immer über jeden konstruktiven Hinweis!

Besten Dank und Grüße,
LQK