Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

EA soll nur am ersten Tick eines Bars traden

Geschrieben

...besser wärw auf Baropen warten. (muss da erst noch reinlesen WIE ich

das 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;

Featured Replies

Geschrieben

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 ich

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

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

Geschrieben
  • Autor

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.

Geschrieben
  • Autor

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.

Geschrieben

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.

Geschrieben

 

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

Image 4.png

Geschrieben

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

Jein, 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.
Geschrieben

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 simpel

Ein "Jein" ist nicht akzeptabel shocked.gif - es ist eine Verbesserung

Geschrieben

Die Variante hier erlaubt trading "1 mal pro Bar"

Ich mein meine Variante ;)

Ein "Jein" ist nicht akzeptabel shocked.gif - es ist eine Verbesserung

Eine 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.
Geschrieben

Ok,

Hauptsache der Anwender setzt die Funkton richtig ein und vor allem weiss was die Funktion macht.

Geschrieben
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 wink.gif).

Geschrieben

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 wink.gif).

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.
Geschrieben

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.

Geschrieben

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

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.