|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
||||
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:
Weiterhin findet sich für "Timer" diese Erklärung in der Dokumentation: Zitat:
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); --- 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); Zitat:
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:
Zitat:
---- 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) |
|
|||
@LQK:
"OnInit() ist die Funktion die beim Starten eines EA immer zuerst aufgerufen wird, alle weiteren Funktionen müssen somit aus OnInit() heraus aufgerufen werden." Nein alle weiteren Funktionen werden nicht aus OnInit() heraus aufgerufen, sondern aus OnTick() (bei einem EA!). "... und die Funktion OnInit() enthält immer bereits die Funktion EventSetTimer() sowie return(INIT_SUCEEDED)." Nein, enthält sie normalerweise nicht, nur, wenn während des EA-Ablaufes nach einer bestimmten Zeit Funktionen aufgerufen werden sollen, um nicht auf den nächsten Tick warten zu müssen. return(INIT_SUCEEDED), dabei entspricht das INIT_SCCEEDED dem Integerwert 0, neben INIT_FAILED (1) und INIT_PARAMETERS_INCORRECT (2). Wird 0 zurückgegeben, dann wurde da s Programm erfolgreich initialisiert. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Wenn Du im Editor den Cursor auf OnInit setzt und dann auf F1 drückst, öffnet sich die Hilfe zu OnInit, alle Blau geschriebenen sind Links auf die Du klicken kannst, um weiter zu sehen, was es noch alles zu sagen gibt - so kommst Du von 100 auf 1000.
1. OnInit: wird IMMER und nur beim ersten Start ausgeführt -. steht im Code ne Prüfung, z.B. ob genug Bars für Berechnungen da sind, kann man das Programm gleich beenden, wenn die Bars nicht reichen (wie willst Du einen Durchnschnitt von 100 ausrechnen, wenn Du nur 30 hast??) - also return(INIT_FAILED). Init kann aus unterschiedlichen Gründen scheitern - auf dem Weg durch die ganzen Codezeilen. Gibt ein Benutzer z.B. negative Zahlen ein, ist das ne falsche Angabe (und eben nicht einfach nur "Tschüß, das wars"). -. Und wenn Init scheitert, dann wird dieser Code an DeInit weitergereicht, damit die reason von DeInit auch angeben kann "Benutzer hat Sch... eingegeben". DeInit kann auch aus anderen Gründen erfolgen, aber wenn's schon am Programmstart scheitert, dann muß das natürlich festgehalten werden. -. Gibt es Fehler hier und wir müssen abbrechen, dann kann man z.B. in DeInit ausschließen, daß bestimmte Teile gemacht werden, bevor wir uns ganz verabschieden. Ich habe z.B. mein TradingPanel, das auf Wunsch die Einstellungen speichert (sind die aber so falsch, daß Init scheitern würde, dann macht es keinen Sinn, die Fehler auch noch zu speichern - denn beim nächsten Start holt sich das Panel die gespeicherten Werte wenn es welche gibt; und nur wenn nix gespeichert wurde, nimmt es die Benutzerangaben). 2. OnTimer: führt den dadrin stehenden Code nach der im Interval festgelegten Zeit aus. Es gibt ja Sachen, die müssen nicht bei jedem TickTack gemacht werden, es reicht ja vielleicht aus, wenn so was nur alle 10 Minuten gemacht wird. Und das schreibt man dann halt in die OnTimer Funktion rein. 3. OnEvent: wartet auf ein bestimmtes Ereignis, z.B. Mausklick oder ne Taste wurde gedrückt. Je nachdem was passiert ist (wenn es denn passierte) wird dann ein bestimmter Code ausgeführt. Das alles sind Funktionen, in denen genau das passiert, was Du an Code reinschreibst. Steht nix in OnTimer drin, wird auch nix ausgeführt, steht da drin Print("Es ist jetzt ",TimeToStr(TimeCurrent(),TIME_MINUTES)); dann kriegst Du im ExpertenTab des Terminals ne Zeitansage für Deine Serverzeit. AVT |
|
|||||||
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:
Werde also beim nächsten Mal daran denken, die Checkboxen durchzugehen und rauszuwerfen, was ich nicht brauche (werde wohl nur das Wenigste brauchen). Zitat:
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:
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:
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:
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:
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:
Freue mich natürlich auch, wenn Du mir noch Mal antworten willst. Besten Dank und Grüße, LQK |
|
|||
Zitat:
Demnach enthält die so geöffnete Vorlage für den EA nur solche Funktionen, die offenbar jeder EA enthalten sein müssen. Das sind:
KORREKTUR: Die Methode OnTick() muss der EA offenbar nicht zwingend enthalten, zumindest sagt das die Dokumentation. Offenbar können stattdessen auch andere Funktionen (z.B. Timer() o.ä.) tätig werden. Quelle: https://www.mql5.com/de/docs/event_handlers/ontick -- Jetzt gerade versuche ich zu verstehen, was die Methode OnTick() macht. Offenbar läuft die Methode OnTick() jedes Mal dann ab, wenn "im" EA bzw. "in" MT das Ereignis "ES GIBT EINEN NEUEN TICK" aufgetreten ist. Zitat:
Zitat:
Okay. Das erklärt es. Besten Dank für die Aufklärung! Grüße, LQK |
|
||||
Zitat:
Zitat:
Okay, besten Dank für die detaillierten Erklärungen. Derzeit habe ich keine Rückfrage. Zitat:
Zitat:
Grüße, LQK |
|
|||
Zitat:
In einem meiner Indikatoren wird dort jede Stunde nachgerechnet, ob sich ein Trend verändert hat (weil die Einstellung für den Trend eben H1 ist, also macht es keinen Sinn, bei jeden Tick nachzusehen, ob sich der Stundentrend geändert hat). AVT |
|
|||
Zitat:
|
Lesezeichen |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|