Jump to content
Tom Next - Daytrading Community

EA mit Teilausstieg


Omega

Recommended Posts

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

Link to comment
Share on other sites

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.

Also normalerweise müßte es wenn der EA sauber programmiert ist und die MagicNumber korrekt berücksichtigt funktionieren. Den MetaTrader zweimal zu installieren dürfte das Problem nicht beheben. Vermutlich ist der EA nicht sauber programmiert. Oder deine Margin reicht nicht aus für 2 Trades. Falls du den Quelltext des EA hast, kann ich mal drüberschauen was da schief läuft.

 

Viele Grüße

Knochen

Link to comment
Share on other sites

Das Problem hatte ich früher auch mal. Wenn die beide zum gleichen Zeitpunkt handeln wollen, geht es nicht. Dir blieben dabei die Möglichkeiten

1.) im EA zu überprüfen, ob die Order ausgeführt wurde und wenn nicht diese ggf. neu zu senden,

2.) einen der EAs mittels Sleep-Befehl dazu zu zwingen, ein wenig mit Setzen der Order zu warten,

3.) den MT4 nochmals zu installieren und die Systeme auf verschiedenen Konten laufen zu lassen oder

4.) einfach den EA so zu modifizieren, dass er dann die halbe Position an der ersten Marke schließt, damit Du auf den zweiten EA verzichten kannst

 

Neben der letzten Lösung ist die sauberste sicherlich die erst genannte. Eventuell ist Dir die Tradebox von Mythos dabei behilflich, dies sauber umzusetzen. Wenn Du magst, kannst Du ja auch mal Teile des Quelltextes hier reinstellen, damit man sich das im Detail anschauen kann.

Link to comment
Share on other sites

Dankeschön erstmal an alle.

Also in zwei Chartfenstern läuft es ja schon, mit zwei verschiedenen EAs.

 

Wie kann man eigentlich in einem EA eine Teilposition glattstellen. Ich trade bei Activ Traders, und ich kann auch manuell keine Position teilen. Man kann hier Long und Short in einem Wert gleichzeitig sein.

 

Ich schreibe hier im Einsteigerforum weil ich vom programieren selbst wenig Ahnung habe. Ich wäre dankbar für Vorschläge mit Code.

 

Und was ist die Tradebox von Mythos??

 

Viele Grüße

Omega

Link to comment
Share on other sites

Dankeschön erstmal an alle.

Also in zwei Chartfenstern läuft es ja schon, mit zwei verschiedenen EAs.

 

Moment, wolltest du 2 EAs am gleichen Chart laufen lassen? Das geht nicht, in MT kannst du pro Chart nur einen EA am laufen haben, ziehst du einen zweiten EA drauf, so wird der erste automatisch entfernt.

 

Und was ist die Tradebox von Mythos??

 

Eine kleine MT-Library die ich mal geschrieben habe um oft verwendete Blöcke nicht ständig tippen zu müssen. (zB. das Senden einer Order mit Fehlerbehandlung, Parameternormalisierung etc.)

gibts hier im Downloadbereich: linked.gif

Link to comment
Share on other sites

Danke Mythos,

 

die Tradebox habe ich nun gefunden, aber das ist alles noch etwas schwierig für mich.

 

In einem Chartfenster wollte ich natürlich nicht 2 EAs laufen lassen, das habe auch ich schon verstanden.

 

Gut wäre es mit der von conglom-o erwähnten sleep Funktion. Wie funktioniert das?

Link to comment
Share on other sites

Gut wäre es mit der von conglom-o erwähnten sleep Funktion. Wie funktioniert das?

Du setzt einfach nach Generierung des Signals und vor Absenden der Order einen Sleep-Befehl.

 

Bspw. so:

if (Signal == NIMM_WAS_MIT) {
Sleep(1000);
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
}

 

Ich würde aber dennoch zur Variante raten, einfach die halbe Order zu schließen. Wie bereits erwähnt, ist es einfacher, wenn wir Deinen Quelltext kennen. whipsaw macht das sicher auch gerne in einem geschützten Bereich, wenn Du ihn lieb drum bittest :ph34r:.

Link to comment
Share on other sites

Hallo conglom-o,

 

danke für den Quelltext. Mir fehlt aber leider hier noch sehr viel Wissen :ph34r: . Ich weiss hier nicht was ich unter NIMM_WAS_MIT eintragen soll. Und warum enthält der Sleep-Befehl OrderClose...

 

Ich bin bei ActivTrades. Und hier ist ein schließen einer Teilposition nicht möglich. Glaube ich zumindest.

Da ich das ganze auf den Tageschart anwenden möchte, spielt eine Verzögerung des Einstieges keine Rolle.

Link to comment
Share on other sites

Nochmal zusammenfassend (damit ich nicht Lösungen für Probleme vorschlage, die es gar nicht gibt ;):

Du hast einen EA der bei einem gewissen Level die Hälfte der Position schließen soll, und später den Rest?

 

Derzeit gehst du her und lässt 2 EAs laufen, mit unterschiedlichen TP und hast das Problem, das beide gleichzeitig die Order senden wollen, wodurch einer eine Errormeldung bekommt und nur eine Order durchgeht, richtig?

 

mMn gibts 2 Varianten:

Variante 1: 2 EAs wie gehabt, aber im EA ersetzt du den OrderSend - Befehl durch eine Schleife sodass er bei Fehlern die Order erneut sendet.

zB

 result= OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,exp
iration);
 while(result == -1)
 {
   error=GetLastError();
   switch(error)
   {
     case ERR_SERVER_BUSY:
     case ERR_BROKER_BUSY:
     case ERR_TRADE_CONTEXT_BUSY:
       Alert("TB",VERSION_NUMBER,": Server, Broker or Context is busy!");
       Sleep(PAUSE_ON_BUSY);
       break;
     case ERR_TOO_FREQUENT_REQUESTS:
       Alert("TB",VERSION_NUMBER,": Tried too often!");
       Sleep(PAUSE_ON_TOO_FREQUENT);
       break;
     case ERR_NOT_ENOUGH_MONEY:
       Alert("TB",VERSION_NUMBER,": We are broke!");
       break;
     case ERR_TRADE_TOO_MANY_ORDERS:
       Alert("TB",VERSION_NUMBER,": Too many open trades!");
       break;
   }
   loopcount++;
   if(loopcount > max_retries)
    break;
   RefreshRates();
   result= OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,exp
iration);
 }

Alternativ kannst du auch die tbSendOrder Funktion aus der TradeBox verwenden, die macht genau das und noch ein bissl mehr zur Errorreduktion.

 

Variante 2: Bleib bei einem EA, aber sende einfach 2 Orders hintereinander, mit unterschiedlichen Magics und beim teilschließen schließt du eben nur eine Order.

Hier würde ich aber auch die Schleife beim OrderSend verwenden, da du Fehler bei der Abwicklung nicht ausschließen kannst. Vor allem wenn du im Tageschart arbeitest und dir kleine Abweichungen egal sind, es aber wichtig ist das die Order durchgeht.

 

HTH

Link to comment
Share on other sites

  • 2 months later...

Hallo, ich möchte nochmal was zum Sleep Befehl nachfragen.

 

Ist per Sleep eine Verzögerung von mehr als 60s möglich? Bei meinen Backtests ändert sich nehmlich ab 60000 nichts mehr an den Trades.

 

Wenn die Order verzögert wird, werden dann nach der Verzögerungszeit nochmal alle Einstiegsparameter abgefragt im EA und der Trade ggf. nicht ausgeführt wenn sich was geändert hat?

 

Oder muss eine innerhalb der Verzögerungszeit eingetretene Kursveränderung als Slippage angesehen werden.

 

Ich habe immer noch das Problem das ich zwei identische EAs ausführen lassen möchte. Einzeln funktioniert jedes im Strategietester, auch das mit dem eingefügten Sleep-Befehl. Wenn aber beide auf dem Demokonto sozusagen live laufen wird nur eine Order ausgeführt von dem EA ohne Sleep-Befehl. Muss ich noch irgendwas beachten?

Link to comment
Share on other sites

Ist per Sleep eine Verzögerung von mehr als 60s möglich?

Ja

 

Bei meinen Backtests ändert sich nehmlich ab 60000 nichts mehr an den Trades.

was sollte sich denn ändern?

 

Wenn die Order verzögert wird, werden dann nach der Verzögerungszeit nochmal alle Einstiegsparameter abgefragt im EA und der Trade ggf. nicht ausgeführt wenn sich was geändert hat?

Sleep verzögert nicht die Order, es sorgt nur dafür das der gesamte EA an der Stelle im Code für die angegebene Zeit steht. Wenn sich jetzt in dieser Zeit der Kurs ändert, und du Market einsteigen willst, wirst du Errors kriegen weil du bei einem falschen Kurs reinwillst.

 

Zur Sicherheit:

1) produzieren die EAs irgendwelche Errors? (Was steht im Log?)

2) werden die EAs in unterschiedlichen Chartfenstern ausgeführt (haben wir glaub ich schon geklärt, aber nur sicherheitshalber)

3) könntest du den Block mit dem Ordersend posten?

Link to comment
Share on other sites

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.

 

Die einfachste Variante ohne Programmiereingriff wäre wirklich 2 MT4 ausführen.

Du brauchst also 2 Metatrader-Instanzen aus 2 verschiedenen Ordner ausführen (MT4 brauchst übrigens nicht installieren, eine Kopie reicht auch aus)

selbstverständlich mit gleichen Accountdaten und auf jedem einen EA ausführen.

Die Orders werden sich nicht gegenseitig stören, da 2 separate Verbindungen zum Tradeserver aufgebaut werden

Link to comment
Share on other sites

Danke Mythos, Danke titanfx,

 

an Mythos: Ich nahm an je größer die Verzögerung um so größer die Kursabweichung im Vergleich zum EA ohne Sleep-Befehl. Was sollte ich denn nun tun damit die Order etwas verzögert ausgeführt wird?

 

zu1. keine Fehlermeldungen, nur eben keine Ausführung.

 

zu2. ja

 

zu3. keine Ahnung - was ist Ordersend?

 

an titanfx: Bist Du Dir da sicher das dies beim gleichen Broker/gleiches Konto auch so funktioniert. Denn das wäre für mich wohl die einfachste Lösung, weil ohne Programmierkenntnisse umzusetzen.

Link to comment
Share on other sites

an titanfx: Bist Du Dir da sicher das dies beim gleichen Broker/gleiches Konto auch so funktioniert. Denn das wäre für mich wohl die einfachste Lösung, weil ohne Programmierkenntnisse umzusetzen.

 

Ich kann dir als "unabhängiger Dritter" bestätigen, dass es funktioniert.

Link to comment
Share on other sites

Was sollte ich denn nun tun damit die Order etwas verzögert ausgeführt wird?

Ehrlich gesagt gefällt mir die Variante mit dem verzögern überhaupt nicht. Ich weiß ich bin ein bissl nervig, aber ich muss echt nochmal nachfragen: Sicher das der EA keine Fehler produziert? Was steht denn im Log und im Journal wenn eine Order ausgeführt werden sollte?

(Wenn wirklich ein EA die Order senden sollte, das aber nicht tut ohne einen Fehler zu melden, dann wurde gar nicht versucht die Order zu senden)

 

Nach dem was ich denke müsste einer der beiden EAs beim senden der Order einen "Tradecontext busy" error kriegen. Schöne Lösung: Beim senden der Order auf solche Fehler überprüfen und ggf. die Order erneut senden. (zB mit der Schleife die ich weiter oben schonmal gepostet hab)

 

zu1. keine Fehlermeldungen, nur eben keine Ausführung.

Nur zur Sicherheit: mit Fehlermeldung mein ich kein Popupfenster, sondern nur einen Logeintrag der über den Fehler informiert.

 

zu3. keine Ahnung - was ist Ordersend?

:empathy2: kleiner Tippfehler, ich mein die MetaTrader Builtin-Function "OrderSend(...)" mit der du eine Order erzeugst (und an den Broker sendest)

Link to comment
Share on other sites

Was steht denn im Log und im Journal wenn eine Order ausgeführt werden sollte?

(Wenn wirklich ein EA die Order senden sollte, das aber nicht tut ohne einen Fehler zu melden, dann wurde gar nicht versucht die Order zu senden)

 

eben nicht..

wenn die Anfrage an den Server programmtechnisch nicht bearbeitet wird, erscheint auch keine Meldung

und es ist unmöglich nachzuweisen, dass OrderSend() ausgeführt wurde.

 

unten Script zur Überprüfung und Auszug aus dem Log :empathy2:

 

tom_02.png

 

tom_03.png

teste_ordersend.mq4

Link to comment
Share on other sites

wenn die Anfrage an den Server programmtechnisch nicht bearbeitet wird, erscheint auch keine Meldung

und es ist unmöglich nachzuweisen, dass OrderSend() ausgeführt wurde.

 

Was meinst du mit "programmtechnisch nicht bearbeitet"? Wenn der EA "OrderSend()" aufruft, wird die Order zum Server geschickt oder? (Natürlich wenn der EA nicht zu dem Punkt mit dem OrderSend kommt wird natürlich nix geschickt)

Und sobald die Order zum Server geschickt wird gibts doch nur 2 Alternativen:

Variante 1 sie geht durch( OrderSend gibt Zahl > 0 zurück)

Variante 2 es gibt einen Error und OrderSend gibt -1 zurück.

 

Bei Variante 2 wird dann im Log (undoder kA) Journal der Fehler angezeigt.

 

Oder können OrderSend Befehle seit neuestem einfach "verschwinden"? :empathy2:

 

EDIT: um Missverständnissen vorzubeugen: Mein "was steht denn im Log wenn eine Order ausgeführt werden sollte" war nicht gemeint als "was sollte allgemein dort stehen wenn eine Order ausgeführt wird", sondern "was steht konkret bei ihm im Log wenn die Order eigentlich ausgeführt werden sollte, sie aber nicht ausgeführt wurde"

Link to comment
Share on other sites

Oder können OrderSend Befehle seit neuestem einfach "verschwinden"? :empathy2:

OrderSend() -Befehl verschwindet doch nicht, er wird ausgeführt - nur im Fall eines Fehlers, wenn die Funktionsantwort nicht ausgwertet wird, ist es schwierig nachzuweisen ob die Funktion ausgeführt wurde.

Führe doch den Script aus, den ich beigefügt habe - OrderSend() generiert eigentlich ein Fehler von dem du nichts mitbekommst und im Journal wird kein Fehler reingeschrieben, wenn er nicht ausdrucklich durch Print() ausgegeben wurde. Jetzt kannst du die auskommentierte Zeile wieder aktivieren und bekommst somit die erwartete Fehlermeldung

 

Deswegen ist es immer schwierig nach Fehlern zu suchen, wo keine Fehlerbehandlung der Funktionen statfindet

Link to comment
Share on other sites

Was meinst du mit "programmtechnisch nicht bearbeitet"? Wenn der EA "OrderSend()" aufruft, wird die Order zum Server geschickt oder? ...

... sondern "was steht konkret bei ihm im Log wenn die Order eigentlich ausgeführt werden sollte, sie aber nicht ausgeführt wurde"

 

Es wird nicht gewährleistet, dass die OrderSend() eine Anfrage an den Server schickt.

Es gibt die internen Fehlerkontrollen seitens Terminals bevor eine Anfrage an den Server weitergeleitet wird

und wenn ein Fehler lokal festgestellt wurde - wird die Order gar nicht mehr an den Server geschickt.

Daher bekommst du keine Antwort ( oder ein Fehler ) vom Server, da er in dem Fall keine Anfrage erhalten hat

Link to comment
Share on other sites

Sorry mein Fehler. :empathy2:

titan hat natürlich Recht.

 

Wird nur bei falschen Parametern der Error verschwiegen oder auch Fälle wie TradeContextBusy (da ich bei mir immer auch die eigenen Errormeldungen hab bin ich mir jetzt nimmer sicher, aber die Errors vom Server kommen glaub ich explizit ins Journal)?

 

Nichtsdestoweniger denk ich immer noch das es ein TradeContextBusy Error ist ;)

(Da der EA von ihm normalerweise Orders schickt geh ich mal davon aus, das die Parameter passen und die OrderSend normalerweise zum Server geht...)

Link to comment
Share on other sites

Sorry mein Fehler. :empathy2:

titan hat natürlich Recht.

 

Wird nur bei falschen Parametern der Error verschwiegen oder auch Fälle wie TradeContextBusy (da ich bei mir immer auch die eigenen Errormeldungen hab bin ich mir jetzt nimmer sicher, aber die Errors vom Server kommen glaub ich explizit ins Journal)?

 

Nichtsdestoweniger denk ich immer noch das es ein TradeContextBusy Error ist ;)

(Da der EA von ihm normalerweise Orders schickt geh ich mal davon aus, das die Parameter passen und die OrderSend normalerweise zum Server geht...)

 

Das ist garantiert TradeContext, der OrderSend() hindert,

da TradeContext-Kontrolle auch lokal kontrolliert werden kann - wird die Order gar nicht an den Server weitergeleitet

und kein Fehler im Journal generiert.

Link to comment
Share on other sites

Hallo an alle, :empathy2:

 

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

 

 

Muuste mal googlen nach barHiLo.mql, so heißt das Sys glaub ich, habs irgendwo in einem Forum mal gesehen.

Davon gibts mehere Versionen, ich glaub BarHiLo-Stace war eins was fuktioniert hatte, aber warum gibst du die 2. Order erstmal nicht manuell ein?

 

scalp

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...