Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4536
Beiträge: 41177
Benutzer: 6.932
Aktive Benutzer: 232
Links: 80
Wir begrüßen unseren neuesten Benutzer: traderotor
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- traderotor
vor 2 Tagen
- Brummi
vor 4 Tagen
- Fussellien...
vor 4 Tagen
- ZHannes82
vor 4 Tagen
- LigthofGod

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 111
Gesamt: 111
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #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)
Mit Zitat antworten
  #2 (permalink)  
Alt 21.05.20
Benutzerbild von Indikator-Trading
Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 109
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
Mit Zitat antworten
  #3 (permalink)  
Alt 21.05.20
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.415
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

@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.
Mit Zitat antworten
  #4 (permalink)  
Alt 21.05.20
AVT AVT ist offline
Premium Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 434
AVT befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #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
Mit Zitat antworten
  #6 (permalink)  
Alt 31.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 traderdoc Beitrag anzeigen
@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!).
Ich verstehe. Habe mir jetzt im Metaeditor mit dem Wizard noch mal eine neue Vorlage für einen EA geöffnet. Habe dabei, wie weiter oben schon jemand geschrieben hat, erstmal alle Häkchen entfernt.

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:
  • OnInit()
  • OnDeInit()
  • OnTick()

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:
"... 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.
Okay. Besten Dank für die Info.



Zitat:
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

Okay. Das erklärt es. Besten Dank für die Aufklärung!


Grüße,
LQK
Mit Zitat antworten
  #7 (permalink)  
Alt 31.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 AVT Beitrag anzeigen
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.
Besten Dank für diesen sehr guten Tipp. Habe sonst die Dokumentation immer nur mit Google durchsucht. Wenn ich die Dokumentation so aufrufe wie von Dir empfhohlen, sind die Angaben der Dokumentation offenbar genauer (über Google habe ich manchmal nur schlecht ins Deutsche Teile der Dokumentation gefunden, manchmal habe ich das gesuchte auch gar nicht gefunden).


Zitat:
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).

Okay, besten Dank für die detaillierten Erklärungen. Derzeit habe ich keine Rückfrage.


Zitat:
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.
Ja, interessant. Hast Du zufällig gerade ein Beispiel parat, für etwas, dass immer wieder gemacht werden muss, aber nicht bei jedem Tick?


Zitat:
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.
Okay. Besten Dank für die Ausführungen. Derzeit habe ich dazu keine Rückfrage.


Grüße,
LQK
Mit Zitat antworten
  #8 (permalink)  
Alt 31.05.20
AVT AVT ist offline
Premium Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 434
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von LQK Beitrag anzeigen
Ja, interessant. Hast Du zufällig gerade ein Beispiel parat, für etwas, dass immer wieder gemacht werden muss, aber nicht bei jedem Tick?
Im Trading-Panel wird alles jede Sekunde gemacht (und eben nicht, wenn grade mal wieder ne Preisänderung war): alles, was graphische Elemente angeht wie Gewinn/Verlust-Anzeige an der Trade-Eröffnungskerze, Überwachung von Benutzereingaben, Restzeitangabe für die laufende Kerze, Überwachung von TP und SL Schließungen und daraus resultierende Aktionen (Ton und Löschen von Gewinn/Verlust an der Kerze).
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
Mit Zitat antworten
  #9 (permalink)  
Alt 01.06.20
LQK LQK ist offline
Mitglied
 
Registriert seit: Nov 2019
Beiträge: 76
LQK befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AVT Beitrag anzeigen
Im Trading-Panel wird alles jede Sekunde gemacht (und eben nicht, wenn grade mal wieder ne Preisänderung war): alles, was graphische Elemente angeht wie Gewinn/Verlust-Anzeige an der Trade-Eröffnungskerze, Überwachung von Benutzereingaben, Restzeitangabe für die laufende Kerze, Überwachung von TP und SL Schließungen und daraus resultierende Aktionen (Ton und Löschen von Gewinn/Verlust an der Kerze).
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
Besten Dank für das Beispiel. Das ist hilfreich für mich.
Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 03:16 Uhr.





Die Suchmaschine - Der Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2020 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2020 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------