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 mit Teilausstieg

Geschrieben

Hallo an alle, :blink:

 

ich melde mich mal wieder mit einer Frage.

 

Ich habe ein einfaches EA (Kauft über Hoch und Verkauft unter Tief). Ich möchte bei einem Buchgewinn einen Teilaustieg vornehmen, dazu habe ich das EA zweimal installiert. Natürlich verschiedene Namen und Magic-Nr., jeweils mit der halben Positionsgröße. Und habe nur den Take Profit verändert in den EAs. Aber es wird immer nur ein EA ausgeführt. Ich denke das liegt daran das die Einstiegsoder in beiden EAs zur genau gleichen Zeit erfolgt und dies funktioniert wohl nicht.

Gibt es hier eine Lösung durch Programmierung. Oder muss ich den Meta-Trader zweimal installieren um so das EA 2-mal laufen zu lassen.

 

Viele Grüße und gute Trades

wünscht Omega

Featured Replies

Geschrieben
Aber falls es nun keine Eintragung gibt, was mach ich nun mit dem Sleep-Befehl damit das zweite EA auf einen Trade eröffnet?

 

Meine Empfehlung: lösch den Sleep befehl raus und mach eine gscheite Errorbehandlung ;)

 

zB:

 

füge folgende Funktion in deinen EA ein:

int myOrderSend(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment="", int magic=0, datetime expiration=0, color arrow_color=CLR_NONE) 
{
 int result,error;
 int loopcount= 0;
 result= OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,exp
iration,arrow_color);
 while(result == -1)
 {
   error=GetLastError();
   switch(error)
   {
     case ERR_SERVER_BUSY:
     case ERR_BROKER_BUSY:
     case ERR_TRADE_CONTEXT_BUSY:
       Sleep(500);
       break;
     case ERR_TOO_FREQUENT_REQUESTS:
       Sleep(5000);
       break;
     case ERR_NOT_ENOUGH_MONEY:
       Alert("We are broke!");
       break;
     case ERR_TRADE_TOO_MANY_ORDERS:
       Alert("Too many open trades!");
       break;
   }
   loopcount++;
   if(loopcount > 100)
    break;
   RefreshRates();
   if(cmd == OP_BUY)
     price= Ask;
   if(cmd == OP_SELL)
     price= Bid;
   
   result= OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,exp
iration,arrow_color);
 }
 if(result < 0)
   Print("Error sending Order, give up trying! Error was:", error);
 
 return(result);
}

 

für die schönen Konstanten musst du noch

#include <stderror.mqh>

am Beginn des EA einfügen.

 

Dann gehst du per Suchen und Ersetzen durch den EA und ersetzt OrderSend durch myOrderSend. Und schon hast du zumindest eine grundlegende Fehlerbehandlung ;)

Geschrieben
...

Meine Empfehlung: lösch den Sleep befehl raus und mach eine gscheite Errorbehandlung ;)

...

 

wurde auch schon mehrmals gesagt, die Sleep-Geschichte, zumindest ausschliesslich via Sleep, ist eine ziemlich unrunde Sache und kann dir nicht in jedem Falle Context-Busy-Errors ersparen. Wenn man mal beobachtet, wie zeitlich bei neuen Bars verschiedene Charts (gleiches Underlying) aktualisiert werden, dann wird klar, dass hier je nach Auslastung des eigenen Rechners und auch des Servers zeitlich minimale aber durchaus auch große Unterschiede auftreten, auch mit anderer MT4-Instanz.

 

Also entweder man synchronisiert die entsprechenden EAs (via Semaphoren oder re-Implementierungen von diesem Konzept, dürfte unter MT4 schwierig werden, Filesystem wäre möglich), da der Zugriff auf die Tradeengine vom Server nunmal eine zu synchronisierende Ressource darstellt und dann nicht beliebig alle durcheinander darauf zugreifen dürfen (zumindest bei der augenblicklichen Umsetzung, MT5 kann es anders sein). Oder aber man behandelt die Fehler, wie oben von verschiedenen Leuten angesprochen. Requotes, InvalidePrices/SL/TP und verschiedene andere Fehler würde ich da aber noch mit hinzu nehmen. I.V.m. diesem Fehlerhandling kann man die Orders je nach Fehler erneut abschicken, allerdings mit einem kleinen Delay. Und hier bietet sich jetzt wirklich Sleep an.

Geschrieben
  • Autor

OK Danke Mythos, dann werde ich das mal probieren. Da ich Anfänger bin kann es aber ein bisschen dauern.

Melde mich dann wieder was draus geworden ist. Aber Danke nochmal für die hilfreichen Zeilen.

 

Wünsche allen gute Trades!

Geschrieben
  • Autor

Hallo, also ich habs nochmal probiert.

Wenn das zweite EA mit Sleep-Befehl nicht ausführt gibt es auch keine Einträge. Seltsamerweise funktioniert das mit Sleep Brokerabhängig,

d.h. bei manchem Broker funktioniert es problemlos und bei anderen garnicht.

 

Mit der Errorbehandlung von Mythos liefert das EA keine Trades. Im Journal steht: not enough stack for parameter .

Geschrieben
Seltsamerweise funktioniert das mit Sleep Brokerabhängig,

Natürlich, je nachdem wie lange der Broker für die abarbeitung der Order braucht. Es dürfte nicht nur Brokerabhängig sondern auch "Orderabhängig" sprich nicht bei jeder Order gleich funktionieren.

 

Im Journal steht: not enough stack for parameter .

:hmmm: also die Funktion läuft bei mir einwandfrei. Wieviele Parameter hat denn dein EA? hast da welche hinzugefügt?

 

lass mal bitte dieses script laufen:

(das testscript von titan, nur mit der myOrderSend())

teste_ordersend.mq4

Geschrieben
  • Autor

Hallo Mythos,

 

ich habe Dein teste_Ordersend probiert. Es passiert aber garnichts, weder im Liveeinsatz noch im Strategietester.

Was sollte denn passieren und wie sollte ich es einsetzen?

Geschrieben
  • Autor

Hallo Mythos,

 

ja im Experten-Log ist zu sehen das das EA alle paar Sekunden versucht die Order erneut zu senden.

 

2009.12.14 10:46:05 teste_ordersend EURUSD,M5: loaded successfully

2009.12.14 10:46:14 teste_ordersend EURUSD,M5: fuehre OrderSend() aus

2009.12.14 10:46:14 teste_ordersend EURUSD,M5: Error sending Order, give up trying! Error was:130

2009.12.14 10:46:14 teste_ordersend EURUSD,M5: error OrderSend(): 0

2009.12.14 10:46:14 teste_ordersend EURUSD,M5: OrderSend() ausgefuehrt

2009.12.14 10:46:18 teste_ordersend EURUSD,M5: fuehre OrderSend() aus

2009.12.14 10:46:18 teste_ordersend EURUSD,M5: Error sending Order, give up trying! Error was:130

 

u.s.w

Geschrieben
ja im Experten-Log ist zu sehen das das EA alle paar Sekunden versucht die Order erneut zu senden.

 

Das ist eigentlich ein skript aber egal. Somit ist klar das die myOrderSend bei dir funktioniert. und die Fehlermeldung von oben nicht an der Änderung auf myOrderSend liegt.

 

Sind deine Stopps vielleicht zu eng?

 

Ja, das Order_send skript war nur ein test wo der Order Send ein TP und SL mit 1 Pip diff mitgegeben wird, der Error ist also gewolltes Verhalten ;)

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.