Einzelnen Beitrag anzeigen
  #5 (permalink)  
Alt 30.05.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Indikator-Trading Beitrag anzeigen
Hallo,

viele viele Fragen... hier ein paar Antworten dazu:
Ja, als Lernender hat man viele Fragen . Danke, dass Du Dir die Mühe gemacht hast, einige, wie ich meine, sehr gute Antworten zu geben.



Zitat:
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.
Danke für den Hinweis mit den Checkboxen und für die Info, dass ich den Timer nicht zwingend brauche. Denke mal, wenn ich irgendwann mal einen Timer brauche, werde ich das während des Programmierens vermutlich "merken". Da ich bislang nie den Eindruck hatte, einen Timer zu benötigen, werde ich wohl erstmal auf einen Timer verzichten können.

Werde also beim nächsten Mal daran denken, die Checkboxen durchzugehen und rauszuwerfen, was ich nicht brauche (werde wohl nur das Wenigste brauchen).



Zitat:
In der OnInit() Funktion kannst du Initialisierungen durchführen.
Du meinst mit "Initialisierung", die Initialisierung von (globalen) Variablen des EA, d.h. das erstmalige "Füllen" dieser Variablen mit einem Wert?

Definition von "globale" Variable:
https://en.wikipedia.org/wiki/Global_variable

Dann ist mir aber nicht klar, warum extra eine Funktion braucht, um globale Variablen zu initialisieren. Reicht ist nicht aus, diese "außerhalb" einer Funktion, z.B. am "Kopf" des EA mit Werten zu initialisieren? D.h. die Variablen dort nicht nur zu deklarieren, sondern auch gleich mit Werten zu initialisieren?

Was lokale Variable anbelangt, gehe ich davon aus, dass diese nicht in OnInit(), sondern in der Funkion in der sie jeweils verwendet werden initialisiert werden.



Zitat:
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.
Ich verstehe, besten Dank für den Hinweis. Bin mir derzeit nicht sicher, ob ich mir so eine Plausibilitätsprüfung für einen einfachen EA zwingend benötige. Die Eingabewerte trage ich ja m.E. am "Kopf" des EA ein. Dort kann ich diese nachlesen und "händisch" prüfen, ob diese sinnvoll sind.

Klar, man kann dann auch noch automatisiert entsprechende Plausibilitätsprüfungen der Werte vornehmen, z.B. in der Funktion OnInit(). Frage mich nur, ob der Code dadurch nicht unnötig kompliziert, aufgebläht und somit schlechter lesbar/wartbar wird?



Zitat:
Der normale 0815 EA benötigt hier wenn überhaupt eine Abfrage, ob die Eingabedaten deines EAs auch sinnvoll sind.
"Wenn überhaupt" liest sich so, als könnte es auch passieren, dass ich für einen sehr einfachen EA OnInit() gar nicht benötige?

Ich denke aber mal, ich brauche auf jeden Fall bei jedem EA, und sei er noch so schlicht, einen Programmeinstiegspunkt an dem das Programm zu laufen beginnt? Also eine Funktion ähnlich wie die Main-Funktion bei Java:

https://de.wikipedia.org/wiki/Einsprungpunkt

Müsste ich demnach demnach nicht OnInit() nicht für jeden EA brauchen? Oder welche Funktion ist sonst der Programmeinstieg?


Müsste es nicht so sein, dass bei jedem Tick die Funktion OnInit() gestartet und somit der EA durchlaufen wird?



Zitat:
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.
Okay. Ich verstehe, dass diese Ereignisse (SUCCEEDED usw) offenbar nur "intern" von MT gebraucht und verarbeitet werden. Demnach kann ich mich in dem Fall als Programmierer/Anwender darauf verlassen, dass MT das richtig macht, und ich demnach da nicht mitdenken muss.

Unklar ist mir nur noch, warum die Funktion OnInit() als Int OnInit() als eine Funktion mit dem dem Variablentyp "integer" für den Rückgabewert deklariert ist (siehe auch mein EP). Ich nehme das dann erstmal so hin, gewissermaßen als "Gottgegeben". Jedenfalls hast Du mir schon sehr viel weitergeholfen.



Zitat:
Im OnDeinit kannst du zusätzlich abhängig vom Grund der Deinitialisierung definieren was passieren soll.
Deinitialisierung hört sich für mich erstmal neuartig an, von Java und anderen Programmiersprachen kenne ich das bisher nicht.

Habe bisher im Zusammenhang mit MQL erst einen Beispiel-EA gefunden, in dem etwas deinitialisiert wird. Und zwar werden in diesem EA zu Dokumentationszwecken diverse Werte die während des Programmablaufs vom EA berechnet und in einem array "dokumentiert" wurden, dann vor Schließen des EA in eine (externe) Textdatei geschrieben werden. Genauer: "Tupel" von Werteausprägungen verschiedener Variablen, bei denen der EA einen Trade eröffnen kann ("Setups") wurden während dem Programmablauf in einem array gehalten. Mit Schließen des EA würden diese verloren gehen, um das zu verhindern werden Sie beim deinitialisieren in eine "externe" Textdatei geschrieben.

Der Ersteller dieses EA mag seine Gründe gehabt haben, historische Tradeeinstiegs-Settings zu dokumentieren. Ich persönlich benötige diese (derzeit) nicht unbedenkt. Habe mir daher die Frage gestellt: Welche (anderen) möglichen sinnvollen Anwendungsmöglichkeiten von deinit() gibt es noch?


Definition von Tupel (gemeint sind damit letztlich Setups zum Öffnen oder Schließen eines Trades):
https://de.wikipedia.org/wiki/Tupel


Zitat:
Ich hoffe ich konnte dir weiterhelfen.
Ja, Du hast mir einige für mich sehr wichtige Impulse und Denkanstöße gegeben. Besten Dank dafür und für Deine Bemühungen!



Freue mich natürlich auch, wenn Du mir noch Mal antworten willst.

Besten Dank und Grüße,
LQK