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.

Maximal 1 Order je 5 Min

Geschrieben

Ichh würde gern ein System programmieren, welches maximal alle 5 Minuten eine Order absetzt. Dieser Schutz muss eingebaut werden, da das System ansonsten 5-10 Trades hintereinander öffnet, da ja bei jedem Tick eine Order wieder aufgemacht wird, sobald das Signal der Indikatoren da ist.

 

Leider gelingt es mir nicht. Zwar habe ich durch die Zeitabfrage nun geschafft das 99% weniger Positionen eröffnet werden, jedoch trotzdem pro Minute bis zu 10 Trades, ich weiß nicht genau was da gerade passiert. Könnt ihr mir vielleicht helfen?

 

Ich erkläre kurz wie ich es mir dachte. Zuerst der ganze Code

 

#property copyright "Blabla"
#property link	  "http://www.google.de"


//---- input parameters
extern double	TakeProfit=50.0;
extern double	StopLoss=10.0;
extern double	Lots=0.5;
//+------------------------------------------------------------------+
//| expert initialization function								   |
//+------------------------------------------------------------------+
int init()
 {
//----
  
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| expert deinitialization function								 |
//+------------------------------------------------------------------+
int deinit()
 {
//----
  
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| expert start function											|
//+------------------------------------------------------------------+
int start()
 {
//----
  double bup = iBands(Symbol(),0,20,2,0,PRICE_OPEN,MODE_UPPER,0);
  double bdn = iBands(Symbol(),0,20,2,0,PRICE_OPEN,MODE_LOWER,0);
  
  double stoca = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0);
  
  int ticket; 
  int timeblock = 0;
  
  if(OrdersTotal() > 0){
	 if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES)){
		datetime timecheck = TimeCurrent() - OrderOpenTime();
		
		if(timecheck < 300){
		   timeblock = 1;
		}
	 }
  }   
		  
  //
  //Oberer Rand -> Verkaufen
  //
  if(Close[0]>bup+(4*Point) && stoca>90){
  //Nur alle 5 Minuten
  if(timeblock == 0){
	 //Order absenden
	 ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"FOREX Fighter",12345,0,Red);
	 //Auf Fehler prüfen
	 if(ticket>0){
		if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)){ 
		   Print("Short Position eröffnet: ",OrderOpenPrice(), " ", timeblock, timecheck); 
		} 
	 }
  }
  }

  //
  //Unterer Rand -> Kaufen
  //
  else if(Close[0]<bdn-(4*Point) && stoca<10){
  //Nur alle 5 Minuten
  if(timeblock == 0){
	 //Order absenden
	 ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"FOREX Fighter",12345,0,Green);
	 //Auf Fehler prüfen
	 if(ticket>0){
		if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)){
		   Print("Long Position eröffnet: ",OrderOpenPrice());
		} 
	 }
  }
  }

//----
 }
//+------------------------------------------------------------------+

 

Dieser Block soll schauen ob eine Position offen ist, wenn ja soll geprüft werden ob diese schon 5 Minuten her ist. Wenn nicht: Variable Timeblock auf 1 setzen.

if(OrdersTotal() > 0){
	 if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES)){
		datetime timecheck = TimeCurrent() - OrderOpenTime();
		
		if(timecheck < 300){
		   timeblock = 1;
		}
	 }
  }

 

Und dann soll vor der Order-Öffnung geprüft werden ob die Variable auf 1 steht. Wenn ja, dann nicht eröffnen:

   if(Close[0]>bup+(4*Point) && stoca>90){
  //Nur alle 5 Minuten
  if(timeblock == 0){
	 //Order absenden
	 ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"FOREX Fighter",12345,0,Red);
	 //Auf Fehler prüfen
	 if(ticket>0){
		if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)){ 
		   Print("Short Position eröffnet: ",OrderOpenPrice(), " ", timeblock, timecheck); 
		} 
	 }
  }
  }

 

Wie gesagt, leider hält das System sich nicht an die 5 Minuten. Was mache ich falsch? Vielleicht hat jemand auch eine Idee, wie ich es besser lösen kann? Sollte das System funktionieren, werde ich es frei zum Download anbieten. Demnächst kommt ein besseres Moneymanagement, damit die Gewinne maximiert werden.

Featured Replies

Geschrieben
Ichh würde gern ein System programmieren, welches maximal alle 5 Minuten eine Order absetzt. Dieser Schutz muss eingebaut werden, da das System ansonsten 5-10 Trades hintereinander öffnet, da ja bei jedem Tick eine Order wieder aufgemacht wird, sobald das Signal der Indikatoren da ist.

...

Du willst doch einfach nicht dass mehrere Orders innerhalb eines Balkens eingegangen wird.

Das geht viel einfacher:

 

static bool firsttrade=false;
static int Balken;

if (Balken!=Bars)
{
Balken=Bars;
firsttrade=true;
}
…
if(Close[0]>bup+(4*Point) && stoca>90 && firsttrade)
{
	 //Order absenden
	 ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"FOREX Fighter",12345,0,Red);
	 //Auf Fehler prüfen
	 if(ticket>0)
	{
		if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
	   { 
		   Print("Short Position eröffnet: ",OrderOpenPrice(), " ", timeblock, timecheck); 
		   firsttrade=false;
		} 
	 }
 }

Geschrieben

Hi,

 

ein problem könnte sein, das MQL keine Reihenfolge in den OrdersTotal garantiert. Wenn du also sicher die letzte Order dabei haben willst, musst du alle offenen Orders durchgehen.

 

falls das nicht hilft (und Siscops idee nicht passt): in welchen Fällen werden denn mehrere ORders erzeugt? von beginn an oder erst später? nur zu gewissen Zeiten?

Geschrieben

Anmerkung noch zu der Lösung von siscop:

Falls Du 5 Minuten als Mindestabstand haben möchtest, musst Du das System dann auf dem 5-Minutenchart laufen lassen, da es quasi überprüft, ob eine neue Kerze existiert. Erst dann darf er wieder handeln. Für 15 Minuten Abstand dann auf dem 15er Chart etc.

 

Das Problem an Deiner Lösung ist, wie Mythos schon beschrieben hat, dass Du quasi willkürlich eine Order raus greifst. Je mehr Orders Du offen hast, desto wahrscheinlicher ist es, dass er zufällig gerade eine betrachtet, die schon länger als 5 Minuten läuft. Folglich kann er dann neue Orders platzieren. Korrekterweise müsstest Du alle offenen Orders überprüfen.

 

	   for (int k = OrdersTotal(); k >= 0; k--) {
	 OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
	 if(OrderSymbol()==Symbol()) {
		datetime timecheck = TimeCurrent() - OrderOpenTime();
		if(timecheck < 300) timeblock = 1;
	 }
   }

 

Den timeblock würde ich eleganterweise dann aber als Variable des Typ bool nutzen. Kann ja eh nur wahr oder falsch sein :hmmmm:.

Geschrieben

Wenn dein EA im 5-Minutenchart läuft, dann ginge auch das hier:

 

 

int Start()
{
static int iLastTrade = -1;

// in aktueller Kerze schon ein Trade durch diesen EA eröffnet?
if (iLastTrade == TimeMinute(Time[0])) return(1); // Time[0] gibt die Minute zurück, mit der die akt. Kerze eröffnet wurde

int ticket=OrderSend(Symbol(),OP_BUY,Lots,Bid,1,SL,TP,"Test",123,0,Yellow);
if(ticket>0)
{
 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
 {
  //das geht nicht!: iLastTrade = TimeMinute(OrderOpenTime()); <-- das wäre die Minute der Tradeeröffnung und die kann auch außerhalb der 5min-Zyklen liegen, daher
  iLastTrade = Time[0]; // Time[0] gibt die Minute zurück, mit der die akt. Kerze eröffnet wurde
 }
}


return(0);
}

 

Sowas in der Art nutze ich, damit ich innerhalb der gleichen Kerze (bei mir H1) nicht mehrfach handele. Der Code funktioniert nur, wenn der EA läuft. Nach einem Neustart würde er auch sofort wieder loshandeln!

Geschrieben
Sowas in der Art nutze ich, damit ich innerhalb der gleichen Kerze (bei mir H1) nicht mehrfach handele. Der Code funktioniert nur, wenn der EA läuft. Nach einem Neustart würde er auch sofort wieder loshandeln!

Deswegen die Überprüfung aller laufenden Orders (bei mehreren EAs am besten mit MagicNumber). Dann handelt er auch bei Neustart nicht gleich los.

Geschrieben
Deswegen die Überprüfung aller laufenden Orders (bei mehreren EAs am besten mit MagicNumber). Dann handelt er auch bei Neustart nicht gleich los.

 

Vollkommen korrekt. Der Entwicklungsleiter in meiner Firma (ich arbeite in einer Softwarefirma) würde jedoch ausrasten, weil unnötig Performance geschluckt wird: bei jedem Tick wird durch die OrderListe iteriert.

 

Und wenn wir unsere beiden Ansätze kombinieren? Bei mir wird bei einem Neustart iLastTrade mit -1 initialisiert. In diesem Fall würden dann alle Orders (dein Vorschlag) geprüft werden. Ist iLastTrade >= -1, dann kommt mein Ansatz zum Zuge. Ist zwar mehr Code, aber das in eine eigene Funktion ausgelagert stört auch keinen mehr (und mein Entwicklungsleiter wäre zufrieden). Einziger Nachteil dieser Kombination: der manuelle Handel wird nicht berücksichtigt. Wenn ich jedoch ben nimmdich richtig verstanden habe, geht es ihm darum, dass sein eigener EA nicht Dauerhandel betreibt.

Geschrieben

In Rainworms Lösung bleibt folgendes Problem: Was wenn er Signale auf M30 Basis generiert und die Schwelle trotzdem 5 Minuten sein soll? Oder umgekehrt EA läuft auf M1 und 5 Minuten schwelle... Dann ist nur mehr Conglom-o s Lösung möglich. Mit etwas aufwand kann man das iterieren durch die gesamte Orderliste vielleicht vermeiden indem man sich die letzte Ordereröffnung merkt und die Anzahl merkt. Wenn die Anzahl sich ändert-> neu berechnen der letzten Ordereröffnung, ansonsten alten Wert verwenden.

 

edit: ich sollt den Code vorher durchlesen *G* wenn nur die Orders von einem EA genommen werden sollen, dann funktioniert der Vorschlag von Rainworm natürlich erstklassig (also wenn man die "geht nicht" Variante nimmt und direkt auf Zeitdifferenz prüft). *asche auf mein haupt*

Geschrieben
Tja, und bei der "Differenzrechnungsmethode" bleibt das Problem, dass (z.B.) nur alle 5 Minuten gehandelt werden kann. Das ist was anderes, als die Prüfung auf eine neue nicht gehandelte 5min-Kerze. Die Frage ist also: möchte ich nur einmal in 5 Minuten handeln oder max. einmal pro 5min-Kerze. Im ersten Fall könnte also der Einsieg gegen Ende der Kerze erfolgen, sodass ein weiterer Einstieg frühstens gegen Ende der nächsten 5min stattfinden kann und ggf. ein weiteres Signal verpasst wird.
Geschrieben
Tja, und bei der "Differenzrechnungsmethode" bleibt das Problem, dass (z.B.) nur alle 5 Minuten gehandelt werden kann. Das ist was anderes, als die Prüfung auf eine neue nicht gehandelte 5min-Kerze. Die Frage ist also: möchte ich nur einmal in 5 Minuten handeln oder max. einmal pro 5min-Kerze. Im ersten Fall könnte also der Einsieg gegen Ende der Kerze erfolgen, sodass ein weiterer Einstieg frühstens gegen Ende der nächsten 5min stattfinden kann und ggf. ein weiteres Signal verpasst wird.

 

Geb ich dir voll Recht. Alles eine Frage der Anforderungen. Das schöne an deinem Codeschnippsel: Man kann je nach Anforderung beide Varianten leicht realisieren (entweder direkt wie du es hast, oder mit der Differenz und der "so nicht"-Variante ;).

Wär ein Paradebeispiel für ein Codeschnipsel fürs MetaTrader-Wiki. Wenn du magst wärs super wenn du es dort reinstellst (ansonsten stell ichs rein sofern du die Erlaubnis gibst)

Geschrieben
Wenn du magst wärs super wenn du es dort reinstellst (ansonsten stell ichs rein sofern du die Erlaubnis gibst)

 

Äh, mach mal :) Für den "so nicht"-Fall müsste jedoch noch die Differenz gebildet werden...

Geschrieben
Äh, mach mal :) Für den "so nicht"-Fall müsste jedoch noch die Differenz gebildet werden...

 

Done, ich hoff ich habs halbwegs lesbar hinbekommen. (Habs leicht modifiziert sodass start nicht sofort beendet wird wenn das Kriterium erfüllt ist)

Geschrieben
  • Autor
Ich muss hier unbedingt öfter vorbei schauen. Ich eröffne ein Thema und es kommen so viele tolle Antworten. Vielen Dank, ich habe mich für die Variante entschieden, die nun auch im Wiki steht. Danke an alle Helfer, jetzt kann ich weiter programmieren :-)

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.