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: 4443
Beiträge: 40527
Benutzer: 6.833
Aktive Benutzer: 267
Links: 80
Wir begrüßen unseren neuesten Benutzer: viewer
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 4 Stunden
- viewer
vor einem Tag
- burkijan
vor 2 Tagen
- Chidiroglo...
vor 4 Tagen
- JapanTrade...
vor 6 Tagen
- chroma

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 98
Gesamt: 99
Team: 0
Team:  
Benutzer:  Indikator-Trading
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor 5 Tagen
LQK LQK ist offline
Neues Mitglied
 
Registriert seit: Nov 2019
Beiträge: 19
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 (vor 4 Tagen um 23:17 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt vor 5 Tagen
Neues Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 20
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 vor 5 Tagen
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.336
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 vor 5 Tagen
AVT AVT ist offline
Premium Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 340
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
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 23:09 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.
-----------------------------------------------------------------------------------------------------------------------------