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.

Keine neuen Order, wenn letzte Order Verlustorder

Geschrieben

Hallo Tradingfreunde,

 

bin seit kurzem hier und beschäftige mich seit ca. 4 Wochen mit MQ4- habe auch schon ein relativ stabiles Handelssystem - nach einigen Anlaufschwierigkeiten- programmiert. Die Hinweise im Web zu MQ4 bzw. der Programmcode zu einzelnen Themen ist sehr vielfältig- zu meinem Problem habe ich zwar einiges gefunden, was passen könnte, aber eben im DEMO-Konto- und auch im Backtest- so einfach nicht funktioniert.

 

Das Problem mit nur einer Order pro Balken kommt dem zwar nahe- aber eben nur teilweise, da sich dann das ganze immer auf den jeweiligen Zeitrahmen beschränken würde

 

Mein System handelt wiegesagt relativ zuverlässig- bei der Auswertung habe ich aber festgestellt, das in Zeiten, in denen die Inidkatoren zwar richtig anzeigen- aber der Markt trotzdem weiter fällt oder steigt- nach einer Verlustorder (z.B. SELL) der Stop ausgelöst wird. Nun eröffnet mein System aber sofort eine neue Order, in diesem Falle wieder eine SELL-Order, welche im schlimmsten Fall nach erneutem SL mit Verlust geschlossen wird. Das ganze passiert schon mal 3-4 mal in Folge- was ich verhindern will.

 

Der EA soll also maximal 2 Verlustorder in EINE Richtung akzeptieren -also 2x BUY oder 2x SELL Verlust. Dann soll er eine vordefinierte Zeit (OrderStop) warten.

 

Ich habe einen Zähler, welche die BUY- oder SELL Order zählt und wenn die Anzahl größer wie vorgegeben ist UND die letzte Order mit Verlust geschlossen wurde, erhalte ich das Signal ORDERPAUSEBUY oder ORDERPAUSESELL= TRUE

 

 

Der folgende Code liest die Variable aus und übergibt sie an die Bedingungen vor erneuter Orderausführung (CheckOrderPause...), OrderStop ist dabei die vordfinierte Zeit der OrderPause (bei mir 60 Minuten = 3600 s)

 

bool CheckOrderPauseBuy()
{  
 static datetime WaitTimeBuy=0;				   // initialisierung Wartezeit
 if (OrderPauseBuy == true)
 WaitTimeBuy = TimeLocal() + (OrderStop);  // Wartezeit = Aktuelle Zeit + OrderStop (3600 s)
 while (TimeLocal() < WaitTimeBuy)			  // solange aktuelle Zeit kleiner wie Wartezeit
  
 { 
	return (true);											// CheckOrderPauseBuy = TRUE--> keine neuen BUY Order werden geöffnet- SELL Order möglich
 } 
		
	return (false);										   // nach Ablauf der Wartezeit --> CheckOrderpauseBuy = FALSE, neue BUY Order erlaubt.
	  
}

 

Und hierher wird die Bedingung übergeben- vor Orderausführung:

 

if   ((Signal == 1) && (EnableNewBuy) && !CheckOrderPauseBuy())// Wenn Signal =1, Enable New BUY = true und OrderPause FALSE!

 

 

...nun erfolgt die Orderausführung, wenn alle Bedingungen richtig sind.........................

 

 

Der Code funktioniert, die Variablen schalten von FALSE auf TRUE und umgekehrt- aber die Orderpause wird nicht ausgeführt.

Frage: Weiß jemand einen Rat- was mache ich falsch oder wie kann man sonst eine solche Orderpause einfach realisieren ?

 

 

Grüße und Dank im Voraus von Freecode

 

 

P.S. Sollte ich nicht immer gleich antworten- sorry- bin viel unterwegs, deswegen auch die Idee mit dem EA;-)

Featured Replies

Geschrieben

Hi freecode!

 

Herzlich Willkommen hier im Forum :hmmmm:

 

Gleich mal zu deinem Problem.

Wenn ich richtig verstehe willst du wenn OrderPauseBuy == true für 3600s keine Order mehr zulassen.

bool CheckOrderPauseBuy()
{  
 static datetime WaitTimeBuy=0;				   // initialisierung Wartezeit
 if (OrderPauseBuy == true)
 WaitTimeBuy = TimeLocal() + (OrderStop);  // Wartezeit = Aktuelle Zeit + OrderStop (3600 s)
 while (TimeLocal() < WaitTimeBuy)			  // solange aktuelle Zeit kleiner wie Wartezeit
  
 { 
	return (true);											// CheckOrderPauseBuy = TRUE--> keine neuen BUY Order werden geöffnet- SELL Order möglich
 } 
		
	return (false);										   // nach Ablauf der Wartezeit --> CheckOrderpauseBuy = FALSE, neue BUY Order erlaubt.
	  
}

 

Wenn der Code so 1:1 implementiert ist, dann wird die Funktion immer true liefern, da du ja WaitTimeBuy immer wieder nachlädst.

 

So sollte es funktionieren.

bool CheckOrderPauseBuy()
{  
	 static datetime WaitTimeBuy=0;				   // initialisierung Wartezeit
 if (OrderPauseBuy == true)
 {
   WaitTimeBuy = TimeLocal() + (OrderStop);  // Wartezeit = Aktuelle Zeit + OrderStop (3600 s)
   OrderPauseBuy=false;
 }
 if (TimeLocal() < WaitTimeBuy)			  // solange aktuelle Zeit kleiner wie Wartezeit
  
 { 
	return (true);											// CheckOrderPauseBuy = TRUE--> keine neuen BUY Order werden geöffnet- SELL Order möglich
 }
 else 
 {
	return (false);										   // nach Ablauf der Wartezeit --> CheckOrderpauseBuy = FALSE, neue BUY Order erlaubt.
 }		 
}

 

Dein Problem schein aber zu sein, dass die Orders auch ausgeführt werden wenn die Funktion "true" liefert

if ((Signal == 1) && (EnableNewBuy) && !CheckOrderPauseBuy())// Wenn Signal =1, Enable New BUY = true und OrderPause FALSE!

Da diese Bedingung stimmt muss irgendwo anders in deinem Code noch was falsch laufen... :rofl:

Bearbeitet von WOGO

Geschrieben
  • Autor

Hi WOGO,

 

danke für die schnelle Antwort - ich habes jetzt so programmiert - im Backtest scheint es zu funktionieren. LIFE warte ich noch darauf.

Werd mal die Indikatoren großzügiger einstellen.

 

Sollte es nicht LIFE laufen, melde ich mich wieder.

 

Danke nochmal - und Gruß von

 

Freecode

Geschrieben
  • Autor

Hi WOGO,

 

die Freude war etwas verfrüht. Der untenstehende Code funktioniert.

 

 if (OrderPauseBuy == true)
 {
   WaitTimeBuy = TimeLocal() + (OrderStop);  // Wartezeit = Aktuelle Zeit + OrderStop (3600 s)
   OrderPauseBuy=false;
 }
 if (TimeLocal() < WaitTimeBuy)			  // solange aktuelle Zeit kleiner wie Wartezeit
  
 { 
	return (true);											// CheckOrderPauseBuy = TRUE--> keine neuen BUY Order werden geöffnet- SELL Order möglich
 }
 else 
 {
	return (false);										   // nach Ablauf der Wartezeit --> CheckOrderpauseBuy = FALSE, neue BUY Order erlaubt.
 }

 

ABER: Ich habe mehrmals länger als die eingestellte Zeit in Sekunden gewartet- und die Variable schaltet nicht von TRUE auf FALSE zurück.

 

Nun habe ich mir TimeLocal() und TimeWaitingBuy in Echtzeit auf dem Chart angeschaut- und festgestellt:

 

TimeLocal() und TimeWaitingBuy haben genau immer den Abstand zueinander, welchen ich mit OrderStop vorgebe. Das heisst, das die IF anweisung unendlich läuft.

 

Problem:

 

TimeWaitingBuy MUSS in dem Moment, in welchem es aufgerufen wir, als FESTE ZAHL stehenbleiben, damit die aktuelle Zeit in X- sekunden größer ist- und damit die OrderPause zurücksetzt.

 

Im Moment laufen beide Variablen parallel zueinander.

 

Für weitere Anregungen dankt

 

Codefree

Geschrieben
TimeWaitingBuy MUSS in dem Moment, in welchem es aufgerufen wir, als FESTE ZAHL stehenbleiben, damit die aktuelle Zeit in X- sekunden größer ist- und damit die OrderPause zurücksetzt.

Tja,

dein Problem ist vermutlich, dass du OrderPauseBuy immer wieder auf "true" setzt.

Du musst sicherstellen, dass OrderPauseBuy immer nur 1x nach dem Schliessen einer Order gesetzt wird.

Ansonsten wird deine Zeit, wie du schon richtig festgestellt hast, immer wieder neu gestartet.

 

Generell finde ich die Methode, nach einer aktiven Position erst mal über ein Zeitfenster eine neue Position zu unterbinden, nur die zweitbeste Lösung.

Ich mach das in der Regel so, dass jedesmal, wenn ein neues Signal generiert wird, ein Zähler hochgezählt wird (darf aber nur 1x pro Signal gezählt werden).

Die Signale werden somit durchnummeriert und ich lasse dann pro Signalnummer nur einen Einstieg zu.

Bei deiner Methode kann auch bei einem Signal, das schon länger aktiv ist und schon wieder abschwingt, nochmal ein Einstieg erfolgen.

Ob das für dein System besser ist musst aber du entscheiden :hmmmm:

Geschrieben
  • Autor
Tja,

dein Problem ist vermutlich, dass du OrderPauseBuy immer wieder auf "true" setzt.

Du musst sicherstellen, dass OrderPauseBuy immer nur 1x nach dem Schliessen einer Order gesetzt wird.

Ansonsten wird deine Zeit, wie du schon richtig festgestellt hast, immer wieder neu gestartet.

 

Generell finde ich die Methode, nach einer aktiven Position erst mal über ein Zeitfenster eine neue Position zu unterbinden, nur die zweitbeste Lösung.

Ich mach das in der Regel so, dass jedesmal, wenn ein neues Signal generiert wird, ein Zähler hochgezählt wird (darf aber nur 1x pro Signal gezählt werden).

Die Signale werden somit durchnummeriert und ich lasse dann pro Signalnummer nur einen Einstieg zu.

Bei deiner Methode kann auch bei einem Signal, das schon länger aktiv ist und schon wieder abschwingt, nochmal ein Einstieg erfolgen.

Ob das für dein System besser ist musst aber du entscheiden :hmmmm:

 

Hi WOGO,

 

habe jetzt 2 Tage experimentiert- dein Hinweis war richtig, das es mit TRUE nicht funktioniert, da die IF Schleife so immer wieder von vorn beginnt zu laufen. habe es jetzt mit einem Zähler realisiert- und der bringt das gewünschte Ergebnis mit der OrderPause.

 

Die Idee mit dem Zähler find ich gut - allerdings produziert mein System mit 3 Indikatoren exakt zum gleichen Zeitpunkt die besten Ergebnisse - Profitfaktor über 6 Monate (Backtest) nahe 2,0 - mit einem Zähler ist wieder die Frage, wo soll nun der Einstieg erfolgen.

 

Mein größtes Problem im Moment sind wiegesagt aufeinanderfolgende Verluste durch STOP-LOSS. Setze ich den Stop enger, wird der Gewinn geringer, setze ich den Stop großzügiger, weiten sich auch die Verluste aus- besonders an Tagen wie dem 06.05, 20.01 oder 27.04.2010. Hiersuch ich noch die Lösung.

 

Gruß und dank nochmals

 

Freecode

Geschrieben
Mein größtes Problem im Moment sind wiegesagt aufeinanderfolgende Verluste durch STOP-LOSS. Setze ich den Stop enger, wird der Gewinn geringer, setze ich den Stop großzügiger, weiten sich auch die Verluste aus- besonders an Tagen wie dem 06.05, 20.01 oder 27.04.2010. Hiersuch ich noch die Lösung.

 

:hmmmm:

 

Gutes Exits sind m.E. schwerer zu finden als gute Entrys.

 

Hast du einen festen SL?

Schau mal, ob du den variabel gestalten kannst. Da aber die max. DrawDowns der Gewinnertrades auch so in den Minus-Bereich gehen werden musst du aber aufpassen, dass man die Gewinnertrades nicht zu viel beschneidet. Vielleicht helfen auch gezielte Gegenpositionen ab einem bestimmten Level.

Geschrieben
Gutes Exits sind m.E. schwerer zu finden als gute Entrys.

Genau so ist es!

 

Viele Trader stecken sehr viel Energie in die Auswertung von Einstiegssignalen, setzen dann aber nur sehr grobe Trailingstops.

Man kann hier beliebig viel Aufwand in komplizierte Algorithmen stecken. Das generelle Problem hast du aber schon selbst sehr gut beschrieben.

Setze ich den Stop enger, wird der Gewinn geringer, setze ich den Stop großzügiger, weiten sich auch die Verluste aus...

Solltest du hierfür eine perfekte Lösung finden, lass es uns wissen! :hmmmm: :rofl:

Geschrieben
  • Autor
:hmmmm:

 

Gutes Exits sind m.E. schwerer zu finden als gute Entrys.

 

Hast du einen festen SL?

Schau mal, ob du den variabel gestalten kannst. Da aber die max. DrawDowns der Gewinnertrades auch so in den Minus-Bereich gehen werden musst du aber aufpassen, dass man die Gewinnertrades nicht zu viel beschneidet. Vielleicht helfen auch gezielte Gegenpositionen ab einem bestimmten Level.

 

Ich hab mit allen möglichen SL bzw. Trailingstops experimentiert.

 

Eregebnis: optimaler Trailingstop: 39 Punkte SL:24 Punkte. Zeitraum: 15.12.2009 -20.05.2010

 

Einen dynamischen SL müsste man aber an irgendetwas koppeln.

 

Eine Veränderung dieser Werte bringt nur weniger Profit.

Die Idee mit den Gegenpositionen ist daher nicht schlecht. Zur gleichen Zeit als Absicherung oder als neue Order?

 

Die Logik dahinter müsste lauten: Wenn der letzte Trade ( in eine Richtung- SELl oder BUY) ein Verlusttrade, dann setze alle Signale in die Gegenrichtung und eröffne Gegenposition. Ergebnis: Ein weiterer Verlusttradewird nicht eröffnet, obwohl die Signale das eigentlich erwarten würden.

 

Das Problem besteht beim realen traden manuell ja genauso, da man nie weiss- wann ist nun UNTEN. - oder OBEN. Unabhängig von Indikatoren, die in diesen Phasen immer nur neue Einstiege anzeigen, obwohl es immer weiter runter geht.

 

Die Auswertung meiner Tester-Reports hat wiegesagt ergebn, das eine Reihe von Verlustrades unnötig waren, insbesondere an Tagen, wo der Markt extrem fällt oder steigt.

 

Hier müsste das Handelssystem entweder anhalten- VERLUSTPAUSE- oder in die Richtung des momentanen Trends handeln und alles andere ausser acht lassen. Allerdings kenne ich keinen Indikator, der die tatsächliche Trendrichtung frühzeitig und sicher anzeigt.

 

Gruß Freecode

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.