Geschrieben 10. Februar 201412 Jr. comment_148300 ...besser wärw auf Baropen warten. (muss da erst noch reinlesen WIE ichdas dem EA beibringen kann :) Das simpelsten Beispiel dafür mit MQL4 //--- Trading nur auf den erste Tick der neuen Bar if(Volume[0]>1) return; Melden
Geschrieben 10. Februar 201412 Jr. comment_148303 Tick trade ist nicht gewünscht, möchte noch eine Regelung einbauen - nur ein Trade pro Kerze, bzw. besser wärw auf Baropen warten. (muss da erst noch reinlesen WIE ichdas dem EA beibringen kann :) int BarCount; --- int start() { if (BarCount<iBars(Symbol(),0)) { **** Hier steht dann alles, was zur Kerzeneröffnung abgearbeitet werden soll! *** } BarCount = iBars(Symbol(),0); return(0); } Melden
Geschrieben 10. Februar 201412 Jr. comment_148330 Hi, muss ehrlich sagen ich find die 2 Varianten nicht optimal: //--- Trading nur auf den erste Tick der neuen Bar if(Volume[0]>1) return;Diese Variante geht davon aus das der erste Tickt genau 1 Volume auslöst. Sollte meist passen, aber garantiert wird es nirgends, außerdem übersieht man so bars, wenn der erste Tick übersehen wurde. Sprich wenn start() noch busy war. int BarCount; --- int start() { if (BarCount<iBars(Symbol(),0)) { **** Hier steht dann alles, was zur Kerzeneröffnung abgearbeitet werden soll! *** } BarCount = iBars(Symbol(),0); return(0); }Hier geht man davon aus das zwischen den Bars der BarCount gleichbleibt bzw. eben um 1 mehr wird. Ist vermutlich noch stabiler als Variante 1, aber rein vom Prinzip her prüft die Bedingung auf einen Nebeneffekt der aber nicht in direktem Zusammenhang mit "neuer Bar" steht. (Falls MT im Hintergrund Bars nachlädt, ändert sich der Barcount auch oder? Detto: was passiert wenn die maximale Anzahl an Bars im Chart erreicht ist?) Meine Variante: bool isNewBar() { static datetime lastTime= 0; if(Time[0] == lastTime) return(false); else { lastTime= Time[0]; return(true); } } int start() { if(isNewBar()) { //code der nur am ersten bearbeiteten Tick des Bars gemacht werden soll } //code der bei jedem Tick ausgeführt werden soll, zB Trailingstop... } //bzw. int start() { if(!isNewBar()) return; //code der nur am ersten bearbeiteten Tick des Bars gemacht werden soll } Hier wird die Berechnung ausgeführt wenn der aktuelle Bar einen anderen Timestamp hat als der zuletzt bearbeitete Bar. Also ein neuer Bar ist. Egal ob Bars nachgeladen wurden, oder der erste Tick übersehen wurde. Was du bei jeder Version beachten musst: bei den Indis solltest du offset auf 1 setzen. Denn du betrachtest ja eigentlich am ersten Tick des neuen Bars, die Werte des letzten Bars. Der neue Bar besteht ja gerade aus 1 Tick und ist somit noch weit weg von fertig. hth Melden
Geschrieben 10. Februar 201412 Jr. Autor comment_148332 Mythos dein Variante gefällt mir. Was noch wichtig ist, ob schon ein Trade auf der Kerze ausgeführt wurde.Also müsste man die Trade Historie prüfen. Melden
Geschrieben 10. Februar 201412 Jr. comment_148335 Inwiefern ist das wichtig? Wenn nur 1 mal pro Bar eine Order eröffnet werden soll, muss man nur sicherstellen das bei dem Durchlauf am ersten Tick nur eine Order rausgeht. Melden
Geschrieben 10. Februar 201412 Jr. Autor comment_148337 Inwiefern ist das wichtig? Wenn nur 1 mal pro Bar eine Order eröffnet werden soll, muss man nur sicherstellen das bei dem Durchlauf am ersten Tick nur eine Order rausgeht. Ich habe die Erfahrung gemacht, dass MT4 zwischendurch neugestartet werden könnte (warum auch immer...) Die Erfahrung habe ich gerade beim benutzten eines VPS Server gemacht. Melden
Geschrieben 10. Februar 201412 Jr. comment_148338 Ich habe die Erfahrung gemacht, dass MT4 zwischendurch neugestartet werden könnte (warum auch immer...) Die Erfahrung habe ich gerade beim benutzten eines VPS Server gemacht.Stimmt, für den Fall müsste man extra vorsorgen. Die Frage stellt sich dann: Will ich nur am ersten Tick des Bars was machen, oder beim ersten bearbeiteten Tick. Wenn MT neu gestartet wird, ist es unwahrscheinlich das man am ersten Tick reinkommt. Auf getätigte Trades abfragen hilft auch nur wenn oft getradet wird, sonst wird der Bar trotzdem doppelt behandelt. Genau genommen müsste man entweder den zuletzt bearbeiteten timestamp in eine Globale Variable oder Filesystem speichern, oder (falls der Tick "nahe" am ersten Tick sein soll) zusätzlich zur Timestampabfrage noch den zeitlichen Abstand vom Servertimestamp abfragen. Am ersten Tick sollte der Servertimestamp == Time[0] sein. So kann man zB garantieren das nur bearbeitet wird, wenn man innerhalb der ersten 3 Sekunden des neuen Bars ist. Alles weitere wird dann zB ignoriert wodurch sicher nicht mitten in einem H1 Bar getradet wird. Melden
Geschrieben 11. Februar 201412 Jr. comment_148348 Hier geht man davon aus das zwischen den Bars der BarCount gleichbleibt bzw. eben um 1 mehr wird. Ist vermutlich noch stabiler als Variante 1, aber rein vom Prinzip her prüft die Bedingung auf einen Nebeneffekt der aber nicht in direktem Zusammenhang mit "neuer Bar" steht. (Falls MT im Hintergrund Bars nachlädt, ändert sich der Barcount auch oder? Detto: was passiert wenn die maximale Anzahl an Bars im Chart erreicht ist?) Meine Variante: bool isNewBar() { static datetime lastTime= 0; if(Time[0] == lastTime) return(false); else { lastTime= Time[0]; return(true); } } Um es perfekt zu machen fehlt hier noch eine kleine Zeile ( eingefügt in die Zeile 3 )Das ist die Absicherung damit beim ersten Tick kein neuer Bar getriggert wird, sondern erst wenn der neuer Bar tatsächlich generiert wird bool isNewBar() { static datetime lastTime= 0; if(lastTime == 0) lastTime = Time[0]; // Initialisierung beim ersten Tick if(Time[0] == lastTime) return(false); else { lastTime= Time[0]; return(true); } } PS: irgendwie funktioniert Syntaxhighlighting nicht, deswegen füge ich noch ein Bild dazu Melden
Geschrieben 11. Februar 201412 Jr. comment_148372 Um es perfekt zu machen fehlt hier noch eine kleine Zeile ( eingefügt in die Zeile 3 ) Das ist die Absicherung damit beim ersten Tick kein neuer Bar getriggert wird, sondern erst wenn der neuer Bar tatsächlich generiert wirdJein, wieder die Frage was man will. Die Variante hier erlaubt trading "1 mal pro Bar", auch wenn der erste Tick "übersehen" wurde. Es gibt natürlich Varianten das man nur exakt am ersten Tick tradet, oder nur innerhalb der ersten Sekunden des Bars etc. Aber hier hängt es mMn von den Anforderungen ab. Melden
Geschrieben 12. Februar 201412 Jr. comment_148378 Die Variante hier erlaubt trading "1 mal pro Bar"meinst du hiermit deine oder meine Variante? Im Prinzip ist es auch egal,die Zusatzzeile in der Funktion verhindert nur, dass beim aller ersten Programmstart die Fehltriggerung des neuen Bar vermieden wird,mehr ist es nicht, danach ist die Funktionalität von deinem Beispiel nicht beeinflüsst.Also ziemlich simpelEin "Jein" ist nicht akzeptabel - es ist eine Verbesserung Melden
Geschrieben 12. Februar 201412 Jr. comment_148397 Die Variante hier erlaubt trading "1 mal pro Bar"Ich mein meine Variante ;)Ein "Jein" ist nicht akzeptabel - es ist eine VerbesserungEine Verbesserung ist es nur wenn ich den allerersten Bar in der Simulation/Berechnung ausschließen will. Wenn ich aber will das jeder Bar einmal behandelt wird (egal ob mitten drin oder am Anfang), dann würde die "Verbesserung" dazuführen das ein Bar ignoriert wird, der nicht ignoriert werden sollte. So würde zB im H4 der EA erst bis zu 4 Stunden nach dem raufziehen auf den Chart das erste mal was machen. Aber wie gesagt: Es hängt von den Anforderungen ab. Melden
Geschrieben 12. Februar 201412 Jr. comment_148399 Ok,Hauptsache der Anwender setzt die Funkton richtig ein und vor allem weiss was die Funktion macht. Melden
Geschrieben 19. Februar 201412 Jr. comment_148534 bool isNewBar() { static datetime lastTime= 0; if(Time[0] == lastTime) return(false); else { lastTime= Time[0]; return(true); } } Habe mal die obere Variante in einen Indikator eingebaut. Nun meine Frage: was muss ich tun, damit er auch beim initialisieren isNewBar auf true setzt. Das scheint nämlich nicht der Fall zu sein (mit meiner Variante mit den Kerzen zählen klappt es, wobei mir das mit der Time aber eleganter erscheint, so dass ich das gerne einbauen würde ). Melden
Geschrieben 19. Februar 201412 Jr. comment_148552 Habe mal die obere Variante in einen Indikator eingebaut. Nun meine Frage: was muss ich tun, damit er auch beim initialisieren isNewBar auf true setzt. Das scheint nämlich nicht der Fall zu sein (mit meiner Variante mit den Kerzen zählen klappt es, wobei mir das mit der Time aber eleganter erscheint, so dass ich das gerne einbauen würde ).Inwiefern beim Initialisieren? Du meinst das der erste Bar im Backtest/nach dem reinziehen erlaubt ist? Das sollte automatisch so sein. Beim ersten Call ist lastTime 0 und somit != Time[0] also return(true). Die Methode liefert natürlich nur einmal pro Bar true zurück. Melden
Geschrieben 19. Februar 201412 Jr. comment_148553 Ich meine das so: wenn ich den Indikator rein ziehe oder den Timeframe wechsle soll er die Abfrage durchführen. Das tut er bei mir irgendwie nicht sondern nur wenn wirklich eine neue Kerze gezeichnet wird. Bei meiner Methode mit den Bars geht es aber. Warum auch immer. Melden
Geschrieben 19. Februar 201412 Jr. comment_148555 Wenn du den Indikator reinziehst sollte er es tun. Mach doch mal ein Print im isNewBar. Wenn du den Timeframe wechselst tut er es natürlich nur wenn der aktuelle Bar einen anderen Time hat als der zuletzt behandelte. Wobei, beim TF wechsel wird der Indi eh neu initialisiert oder? Du kannst lastTime auch global machen statt statisch und im init() mit 0 initialisieren, dann sollte er bei einem TF Wechsel sicher auch passen. Edit: gerade getestet, indikator der nur ein Print macht wenn isNewBar() true zurückliefert. Gibt brav isNewBar nach dem raufziehen auf den Chart und bei jedem TF-Wechsel Melden
Geschrieben 19. Februar 201412 Jr. comment_148556 Eigentlich dachte ich das auch - aber war nicht so. Werde es die Tage trotzdem nochmal testen. Melden
Das simpelsten Beispiel dafür mit MQL4