Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Funktion nur beim ersten Tick einer neuen Kerze ausführen (http://www.expert-advisor.com/forum/showthread.php?t=3102)

Biatsch 23.07.13 23:38

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^^

traderdoc 24.07.13 00:13

Code:

if (Time[0] != TimeOld) {
.
.
.
.
}

TimeOld = Time[0];

traderdoc

Biatsch 24.07.13 14:25

Kannst du mir bitte noch sagen, welchen Datentypen TimeOld hat?
Mit double funktioniert das wohl nicht.

traderdoc 24.07.13 22:40

muß haben: int

Hoschie 25.07.13 10:22

Zitat:

Zitat von Biatsch (Beitrag 22605)
Kannst du mir bitte noch sagen, welchen Datentypen TimeOld hat?
Mit double funktioniert das wohl nicht.

Sauber wäre das wie folgt:
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

traderdoc 25.07.13 11:23

@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

Hoschie 25.07.13 12:05

Zitat:

Zitat von traderdoc (Beitrag 22640)
@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

@Traderdoc

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

traderdoc 25.07.13 12:39

"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

rekors 25.07.13 13:00

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);
}

Hoschie 25.07.13 13:13

Zitat:

Zitat von traderdoc (Beitrag 22642)
"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

Vor 20 Jahren hätte ich dir recht gegeben bzgl. des Speichers und Ressourcen, aber heutzutage ist das mit dem Speicher und Ressourcen kein Thema mehr, weil es einem quasi hinterher geschmissen wird und auch kein Kostenfaktor mehr ist. Zum Glück sind diese Zeiten vorbei.

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


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:47 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum