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.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3824
Beiträge: 36905
Benutzer: 6.074
Aktive Benutzer: 496
Links: 80
Wir begrüßen unseren neuesten Benutzer: hmf44
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 4 Stunden
- hmf44
vor 8 Stunden
- Crossa
vor 9 Stunden
- snatshit
vor einem Tag
- Roerich
vor einem Tag
- John_Liver...

Onlineuser
'Wer ist online' anzeigen Benutzer: 2
Gäste: 47
Gesamt: 49
Team: 0
Team:  
Benutzer:  bfranz, traderdoc
Freunde anzeigen

Empfehlungen

Werbung

Like Tree6Likes
Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 23.07.13
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 77
Biatsch befindet sich auf einem aufstrebenden Ast
Standard 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^^
  #2 (permalink)  
Alt 24.07.13
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.874
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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

TimeOld = Time[0];
traderdoc
Biatsch likes this.
  #3 (permalink)  
Alt 24.07.13
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 77
Biatsch befindet sich auf einem aufstrebenden Ast
Standard

Kannst du mir bitte noch sagen, welchen Datentypen TimeOld hat?
Mit double funktioniert das wohl nicht.
  #4 (permalink)  
Alt 24.07.13
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.874
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

muß haben: int
  #5 (permalink)  
Alt 25.07.13
Mitglied
 
Registriert seit: Jan 2012
Beiträge: 142
Hoschie befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Biatsch Beitrag anzeigen
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
  #6 (permalink)  
Alt 25.07.13
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.874
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

@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
  #7 (permalink)  
Alt 25.07.13
Mitglied
 
Registriert seit: Jan 2012
Beiträge: 142
Hoschie befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
@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
  #8 (permalink)  
Alt 25.07.13
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.874
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

"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
  #9 (permalink)  
Alt 25.07.13
Elite Mitglied
 
Registriert seit: May 2011
Ort: München
Beiträge: 391
rekors befindet sich auf einem aufstrebenden Ast
Standard

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);
}
Deepack likes this.
  #10 (permalink)  
Alt 25.07.13
Mitglied
 
Registriert seit: Jan 2012
Beiträge: 142
Hoschie befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
"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
rekors and Biatsch like this.
Thema geschlossen

Lesezeichen

Stichworte
funktion erster tick, funktion tick kerze, kerze, mql4, programmierung, programmierung metatrader, tick, tick kerze


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 +1. Es ist jetzt 20:13 Uhr.



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