|
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 |
|
|||
Funktion nur beim ersten Tick einer neuen Kerze ausführen
Hi,
wie der Titel schon sagt, habe ich mich gefragt, ob es die Möglchkeit gibt eine Funktion nur beim ersten Tick einer neuen Kerze durchzuführen. Ich habe daran gedacht mit Zeitangaben zu arbeiten, aber wenn ich eine Funktion nur in der Nullten Minute und Nullten Sekunde einer 1h-Stundenkerze erlaube, kann es ja sein, dass genau in diesem Zeitpunkt kein Tick zustande kommt, der die "Main"-Funktion des Indikators in Gang setzt. Und wenn ich das Zeitfenster auf mehrere Sekunden erhöhe, kann es wiederum vorkommen, dass mehrere Ticks in dieser Zeit vorkommen und die Main-Funktion leider mehrmals durchläuft. Ich freue mich auf konstruktive Beiträge^^ |
|
|||
Code:
if (Time[0] != TimeOld) { . . . . } TimeOld = Time[0]; |
|
|||
Kannst du mir bitte noch sagen, welchen Datentypen TimeOld hat?
Mit double funktioniert das wohl nicht. |
|
|||
Zitat:
static datetime TimeOld; //Definition als statische datetime Variable, weil sonst bei jedem Funktionsaufruf TimeOld mit 0 initialisiert wird. //Methode liefert true, wenn neue Kerze den ersten Tick liefert // ansonsten false bool NewBar() { if (Time[0] != TimeOld) { TimeOld = Time[0]; return(true); } return(false); } int start() { if( NewBar() == true ) { .... } } Carpe Diem, Hoschie |
|
|||
@Hoschie
Quatsch alles! Ein bißchen Wissen und mitdenken, setze ich natürlich voraus. So, nun mal für alle!, wie das aussehen würde: . . extern ......; int TimeOld; int init() { . . } int deinit() { . . } int start() { . . if (Time[0] != TimeOld) { . . TimeOld = Time[0]; } //oder hier: TimeOld = Time[0]; } Wo TimeOld = Time[0]; steht ist im Prinzip völlig Wurscht! traderdoc |
|
|||
Zitat:
Warum soll das Quatsch sein? Das ist völlig korrekt mit der Methode und sauber. Ob das ausserhalb oder innerhalb der Methode ist, ist nicht Kern der Diskussion. Für sauberes Programmieren würde ich eher eine eigene Methode definieren für so etwas als die start Methode mit solchen Statements zu überfrachten. Nur allein aufgrund der Lesbarkeit des Codes. Als Tipp empfehle ich das Buch: Clean Code - Refactoring, Patterns, Testen und Techniken für sauberen Code: Deutsche Ausgabe: Amazon.de: Robert C. Martin: Bücher Carpe Diem, Hoschie |
|
|||
"Warum soll das Quatsch sein?"
Na, weil es eine überflüssige, ressourcenfressende und codeverlängernde Funktion ist und weil eine unnötige, ebenfalls speicherplatzintensivere datetime-Variable benötigt wird. Meine Version hat in der Start()-Funktion eine Zeile mehr, dafür insgesamt 8 Zeilen weniger! Da Deine NewBar()-Funktion zwangsweise auch in der start-Funktion steht, ebenso wie meine Time-Abfrage, wird hier gar nichts überfrachtet. Und in der Regel wird nach unser beiden if-Abfragen eh in irgendwelche Funktionen zur weiteren Verarbeitung gesprungen. Oben gesagtes bleibt aber deshalb weiterhin bestehen. Und die Lesbarkeit wird nicht immer unbedingt einfacher, indem ich ständig in irgendwelche Funktionen springe, zumal, wenn es Ein- oder Zweizeiler sind, die auch nur an einer! Stelle benutzt werden. Ok, vor 20 Jahren hätte ich das Buch evtl. gut gebrauchen können. traderdoc |
|
|||
Also ich mache das immer sehr simpel mit dem "Bar" value (ich nutze das fast in 90% meiner Ea´s weil der dann nicht so backtest anfällig ist)
Du willst die Funktion ja nur ein mal pro bar aufrufen...also warum diese Werte nicht einfach nutzen. int init() { BarCount = Bars; // damit die variable auch gleich mit den richtigen Wert versetzt wird. return(0); } int start() { nur traden wenn eine neue Bar geöffnet wurden (also am ersten tick der neuen bar) if (Bars != BarCount) { //---- //---- } nicht vergessen den Barcount zum schluss der start Funktion auf den aktuellen Wert zu setzen damit er beim nächsten tick nicht die Funktion noch mal aufruft :-) //---- BarCount = Bars; //---- return(0); } |
|
|||
Zitat:
Es kommt mit den Methoden immer darauf an. Wenn es häufig wiederverwendet wird, was im Falle meiner Methode NewBar vielleicht nicht der Fall ist, ist das ein sauberer Ansatz. Die Methode ist gut benamst, und sagt genau aus was es macht. Ansonsten sind beide Ansätze möglich, und bei der Diskussion sollte es auch nicht darum gehen, wer hier recht hat, sondern nur eine Art Hilfestellung auf Fragen der Leute. Carpe Diem, Hoschie |
Lesezeichen |
Stichworte |
funktion erster tick, funktion tick kerze, kerze, mql4, programmierung, programmierung metatrader, tick, tick kerze |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|