Geschrieben 27. September 201015 Jr. comment_105462 Hallo zusammen, habe da wieder das eine oder andere Problem ? Wenn ich den E/A starte kommt manchmal, das heisst nicht immer zwei Fehlermeldungen beim " Experten"-Reiter bei MT4. Nämlich : 4108 d.h. invalid Ticket würde ich mal mit "ungültigem Ticket" übersetzen. 129 d.h. invalid Price na ja, "ungültiger Preis". irgendwie kriege ich das nicht gebacken, weil es nur ab und zu mal auftritt, verstehe ich nicht. Grüsse schon mal an alle und an die Leute besonders, die mir helfen könnten. Danke schonmal im Voraus. Melden
Geschrieben 27. September 201015 Jr. comment_105463 Alleine mit diesem Statement kann man dir wahrscheinlich nicht helfen. Helfen würde es wenn du zumindest dein Orderblock hier als Code rein stellen würdest incl. der Parameter und jede Zeile so diese Parameter aufgerufen bzw. verändert wird.Vergiss nicht die Deklarierung und die Initiierung dieser Variablen aufzuzeigen. Melden
Geschrieben 27. September 201015 Jr. comment_105464 4108 d.h. invalid Ticket 129 d.h. invalid Price invalid Ticket:Du versucht vermutlich mit einer nicht mehr gültigen Ticket-Nummer eine Order zu schliessen oder zu modifizieren. Nicht mehr gültig heisst - die Order existiert nicht mehr, weil sich z.B. die Position via SL oder TP schon "von selbst" geschlossen hat. invalid Price:kommt vor, wenn man bei "ordersend" "Bid" und "Ask" vertauscht, oder wenn man eine Order modifizieren will und dabei und einen ungültigen SP oder TP absetzt. Melden
Geschrieben 27. September 201015 Jr. comment_105471 129 d.h. invalid Price Die Kursdaten können sich ändern innerhalb weniger Sekunden.Du musst Sie also immer Aktualisieren in MQL5. Füge diese Funktion in deinen Code ein, vor deiner eigentliche Aktion(OrderSend...). RefreshRates(); http://docs.mql4.com/windows/RefreshRates Melden
Geschrieben 27. September 201015 Jr. Autor comment_105476 invalid Ticket:Du versucht vermutlich mit einer nicht mehr gültigen Ticket-Nummer eine Order zu schliessen oder zu modifizieren. Nicht mehr gültig heisst - die Order existiert nicht mehr, weil sich z.B. die Position via SL oder TP schon "von selbst" geschlossen hat. invalid Price:kommt vor, wenn man bei "ordersend" "Bid" und "Ask" vertauscht, oder wenn man eine Order modifizieren will und dabei und einen ungültigen SP oder TP absetzt. Also die Ticket Nummer, dachte ich gibt es nur einmal pro geöffnetem Trade und ist gültig solange sie geschlossen wird. Die Aussage verstehe ich nicht so ganz. ( tut mir leid). Meine Order für long: ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"My EA",12345,0,Green); Meine Order für short: ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"My EA",12345,0,Red); Das ist doch richtig, oder ? Bearbeitet 27. September 201015 Jr. von sill3000 Melden
Geschrieben 27. September 201015 Jr. comment_105477 was ist takeprofit und stoploss?Es gibt hier auch ne möglichkeit den Code zitat ähnlich anzeigen zu lassen. Dann gibts auch syntax highlighting. Melden
Geschrieben 27. September 201015 Jr. comment_105488 Also die Ticket Nummer, dachte ich gibt es nur einmal pro geöffnetem Trade und ist gültig solange sie geschlossen wird. Die Aussage verstehe ich nicht so ganz. ( tut mir leid). Meine Order für long: ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"My EA",12345,0,Green);Meine Order für short: ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"My EA",12345,0,Red); Das ist doch richtig, oder ? Das stimmt schon. Allerdings hast Du nur eine gültige Ticketnummer wenn dein OrderSend ausgeführt wurde, das muss aber nicht immer der Fall sein. Daher solltest Du immer eine Fehlerabfrage machen. z.B. ticket=OrderSend(.... if (ticket<0) { Print("Order Send Failed with error # ", ErrorDescription(GetLastError()); } Angenommen Dein OrderSend-Befehl ist aus irgendeinem Grunde nicht ausgeführt worden, (z.B. invalid Lotsize, oder Invalid Price etc.), dann bekommst Du eine Fehlermeldung, wenn Du einen Befehl ausführst indem die Ticket-Nummer verwendet wird. z.B.: OrderModify(ticket, 0, SL, 0,0, Green); oder OrderSelect(ticket, SELECT_BY_TICEKT, ...) auch diese Befehle solltest Du immer auf Fehler checken. Melden
Geschrieben 27. September 201015 Jr. comment_105489 was ist takeprofit und stoploss? ... das ist jetzt keine ernst gemeinte Frage oder? Melden
Geschrieben 28. September 201015 Jr. comment_105491 ... das ist jetzt keine ernst gemeinte Frage oder?Ich glaube Quickbeam21 meinte eher, welchen Typ und welche Werte diese Variablen haben Also die Ticket Nummer, dachte ich gibt es nur einmal pro geöffnetem Trade und ist gültig solange sie geschlossen wird. Schon, aber du gibst bei deiner Order ja einen Stop-Loss an, der am Server deines Brokers hinterlegt wird. Fällt der Kurs nun unter diesen Wert (bzw. steigt darüber bei short), dann wird deine Position geschlossen, ohne daß dein EA das im ersten Schritt merkt.Will dann dein EA die Position erneut schließen, etwa weil er einen eigenen Stop-Loss im Programm mitzieht, dann bekommst du eine Fehlermeldung, da diese Position ja nichtmehr offen ist. Verhindern kannst du das, indem dein EA zyklisch vom Server ausliest, welche Positionen noch offen sind und dann dementsprechend darauf reagiert, wenn eine Position nicht mehr vorhanden ist.Im ersten Ansatz kannst du aber auch mal ausprobieren, daß du den Server-Stop-Loss sehr weit vom Kurs weglegst. Melden
Geschrieben 28. September 201015 Jr. Autor comment_105504 Liebe Community-Mitglieder, habe alles was ihr mir gepostet habt ausprobiert und es läuft ganz gut, bis auf ein paar Ausnahmen. Jetzt bekomme ich den Error: 146 " trade context is busy ". ( Aber die beiden anderen Errors sind weg ) Kann das daran liegen, dass ich zwei Kurse mit dem gleichen E/A beaufschlage, das die Orderroutinen beim Broker durcheinander kommen ? Im voraus besten Dank an alle, ihr seid spitze. Melden
Geschrieben 28. September 201015 Jr. comment_105505 Kann das daran liegen, dass ich zwei Kurse mit dem gleichen E/A beaufschlage, das die Orderroutinen beim Broker durcheinander kommen ? Ja, das hast du genau richtig erkannt. Es kann immer nur ein EA einen "Orderkanal" zum Broker aufbauen. Wenn 2 gleichzeitig eine Order absetzen wollen, dann bekommst du den Fehler 146. Du kannst diesen Fall umgehen, indem du die Funktion IsTradeAllowed() benutzt. Diese gibt dir "true" zurück, wenn du eine Order absetzen kannst.Du kannst also abfragen: if(!IsTradeAllowed()) return; else ....Order absetzen Melden
Geschrieben 28. September 201015 Jr. Autor comment_105510 Ja, das hast du genau richtig erkannt. Es kann immer nur ein EA einen "Orderkanal" zum Broker aufbauen. Wenn 2 gleichzeitig eine Order absetzen wollen, dann bekommst du den Fehler 146. Du kannst diesen Fall umgehen, indem du die Funktion IsTradeAllowed() benutzt. Diese gibt dir "true" zurück, wenn du eine Order absetzen kannst.Du kannst also abfragen: if(!IsTradeAllowed()) return; else ....Order absetzen Manchmal habe ich auch das Problem, das die Order nicht geschlossen werden mit: für long : OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);für short: OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); Gibt es das gleiche Problem auch für das Schliessen von Trades ? danke schonmal für die Beantwortung der Fragen. Melden
Geschrieben 28. September 201015 Jr. comment_105511 Manchmal habe ich auch das Problem, das die Order nicht geschlossen werden mit:für long : OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);für short: OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);Gibt es das gleiche Problem auch für das Schliessen von Trades ? Das Problem ist hier dann vermutlich das selbe. Auch hier funktioniert es nicht mit mehreren EAs gleichzeitig. Du kannst hier die Rückmeldung von OrderClose auswerten. Hat das mit dem Schließen nicht geklappt, dann bekommst du "false" zurück und kannst den Befehl nochmal absetzten.Ein gutes Beispiel ist in der TradeBox von Mythos zu finden. Ich hab dir hier von der CloseOrder-Funktion nur mal das Wichtigste für das Schließen einer Long-Position rauskopiert. int tbCloseOrder(int ticket,double lots,int slipage,int max_retries = -1) { OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES); double price=0; if(OrderType() == OP_BUY) closed= OrderClose(ticket,lots,MarketInfo(OrderSymbol(),MODE_BID),slipage); while(!closed) { error=GetLastError(); Sleep(1000); loopcount++; if(loopcount > max_retries) { return(-error); } RefreshRates(); if(OrderType() == OP_BUY) closed= OrderClose(ticket,lots,MarketInfo(OrderSymbol(),MODE_BID),slipage); } if(closed) return(1); else return(-1); } Der OrderClose-Befehl wird hier mit Warteschleife so oft ausgeführt, bis er entweder erfolgreich war, oder eine Maximalzahl an Versuchen überschritten wurde. Es ist aber schon Zufall, daß bei dir 2 EAs so häufig gleichzeitig handeln. Handelt dein EA sehr hochfrequent auf Tickbasis? Melden
Geschrieben 28. September 201015 Jr. Autor comment_105513 ... nee, er wird nur einmal pro Bar aufgerufen. Bearbeitet 28. September 201015 Jr. von ronner Melden
Geschrieben 5. Oktober 201015 Jr. Autor comment_105782 Aber ein anderes Problem ist mit den ticket, wie kann man die auseinander halten, wenn man den E/A auf zwei Kurse gleichzeitig laufen lässt ? Melden
Geschrieben 5. Oktober 201015 Jr. comment_105785 Aber ein anderes Problem ist mit den ticket, wie kann man die auseinander halten, wenn man den E/A auf zwei Kurse gleichzeitig laufen lässt ?Wenn du den EA einmal auf Wert 1 laufen läßt und gleichzeitig auf Wert 2, dann wissen beide nichts voneinander und agieren vollkommen unabhängig voneinander.Jeder von beiden bekommt für die Orders seine eigenen Tickets.Frägst du die offenen Positionen vom Server ab, dann tust du das halt nur für das jeweils aktive Symbol. Melden
Geschrieben 6. Oktober 201015 Jr. Autor comment_105828 Wenn du den EA einmal auf Wert 1 laufen läßt und gleichzeitig auf Wert 2, dann wissen beide nichts voneinander und agieren vollkommen unabhängig voneinander.Jeder von beiden bekommt für die Orders seine eigenen Tickets.Frägst du die offenen Positionen vom Server ab, dann tust du das halt nur für das jeweils aktive Symbol. Wert 1, Wert 2, wie meinst du das ? tschuldigung, verstehe ich nicht Melden
Geschrieben 6. Oktober 201015 Jr. comment_105829 Wert 1, Wert 2, wie meinst du das ? tschuldigung, verstehe ich nichtWert 1: z.B. EURUSDWert 2: z.B. GBPUSD oder hab ich dich falsch verstanden? Melden
Geschrieben 6. Oktober 201015 Jr. Autor comment_105833 Wert 1: z.B. EURUSDWert 2: z.B. GBPUSD oder hab ich dich falsch verstanden? Wie programmiere ich das denn bei der Order-Funktion ? Nicht allgemein halten mit der Fkt. Symbol(), sondern speziell z.B. für EUR/USD oder GBP/USD die Funktionen anpassen. Hast du es so gemeint ? Melden
Geschrieben 6. Oktober 201015 Jr. comment_105839 Hast du es so gemeint ? Nein.Wenn ich dich richtig verstanden habe, dann hast du bedenken, den selben EA auf 2 unterschiedlichen Underlyings laufen zu lassen, also z.B. auf EURUSD und gleichzeitig auf GBPUSD. Richtig? Wenn ja, dann ist das kein Problem. Du kannst einen EA gleichzeitig in unterschiedlichen Kursfenstern laufen haben, genau so wie du das mit einem Indikator machen kannst. Jetzt zum Ticket. Sobald du eine Order absetzt bekommst du das Ticket als Rückgabewert. Wenn sich dein EA dieses Ticket merkt, dann kennt nur er das (es sei denn, du liest Ticketnummern für ein anderes Symbol vom Server aus, aber das wollen wir jetzt mal nicht annehmen...). Der 2. EA, der ja auf einem anderen Kurs läuft, weiß davon nichts. Er kennt nur das Ticket, das er auch selbst bei OrderSend zurückbekommen hat, bzw. das er für sein Symbol vom Server ausgelesen hat. Beantwortet das deine Frage? Melden
Geschrieben 7. Oktober 201015 Jr. Autor comment_105869 Danke, ja, das habe ich jetzt verstanden, vielen Dank. Aber nun habe ich noch was anderes, denn ich setze bool-Variablen (TRUE,FALSE), wenn ich einen Trade eingehe und modifiziere die Orders, naqch und nach. Aber wie erkennt der PC(Das Programm), wenn eine Order geschlossen wurde, wird da etwas zurückgegeben in Form von einer speziellen Ticketnummer oder was anderes ? Melden
Geschrieben 7. Oktober 201015 Jr. comment_105872 Aber wie erkennt der PC(Das Programm), wenn eine Order geschlossen wurde, wird da etwas zurückgegeben in Form von einer speziellen Ticketnummer oder was anderes ?Es gibt zwei Möglichkeiten, wie eine Position geschlossen werden kann. 1) Der EA schließt sie selbst per OrderClose()-BefehlIn diesem Fall ist der Rückgabewert von OrderClose() true (wenn's schief geht, dann false).D.h. du kannst das Schließen so ganz einfach per EA handeln. 2) Die Position wird durch Erreichen des am Server hinterlegten TP oder SL geschlossen. Dann bekommt das der EA nicht direkt mit. Wenn dein EA bei OrderSend() einen TP oder einen SL (oder beides) hinterlegt, dann mußt du zyklisch die offenen Positionen am Server abfragen. Das solltest du sowieso machen, damit sich dein EA wieder aufsynchronisieren kann im Falle eines Absturzes, oder wenn du MT schließt. Melden
Geschrieben 8. Oktober 201015 Jr. Autor comment_105960 Danke WOGO, das war sehr hilfreich. Super hier im Chat, nette hilfsbereite Leute und immer sehr interessante Themen. Danke Melden
Geschrieben 11. Oktober 201015 Jr. Autor comment_106251 Und was passiert, wenn ich z.B. drei short-Trades offen habe, wie erkennt denn der EA, welche Trades er schliessen soll ? Melden
Geschrieben 11. Oktober 201015 Jr. comment_106282 Und was passiert, wenn ich z.B. drei short-Trades offen habe, wie erkennt denn der EA, welche Trades er schliessen soll ?Es gibt zwei Möglichkeiten (siehe auch Post von Wogo):1. automatisch durch Erreichen von SL/TP2. per OrderClose Im zweiten Fall musstest du ja selber vorher per OrderSelect die Position wählen (Ticketnummer) und daher wird genau diese geschlossen. Nach dem OrderSelect würdest du in deinem EA prüfen, ob es die gewünschte Position ist: Symbol, MagicNumber etc. Melden
Geschrieben 11. Oktober 201015 Jr. comment_106291 ... ob es die gewünschte Position ist: Symbol, MagicNumber etc.Genau!Ich benutz bei einem EA, der gleichzeitig mehrere Positionen öffnet die letzten 4 Bits der MagicNumber um die Signale durchzunummerieren. So kannst du die einzelnen Positionen sauber separieren. Melden
Hallo zusammen, habe da wieder das eine oder andere Problem ?
Wenn ich den E/A starte kommt manchmal, das heisst nicht immer zwei Fehlermeldungen beim " Experten"-Reiter bei MT4.
Nämlich : 4108 d.h. invalid Ticket würde ich mal mit "ungültigem Ticket" übersetzen.
129 d.h. invalid Price na ja, "ungültiger Preis".
irgendwie kriege ich das nicht gebacken, weil es nur ab und zu mal auftritt, verstehe ich nicht.
Grüsse schon mal an alle und an die Leute besonders, die mir helfen könnten.
Danke schonmal im Voraus.