Jump to content
Tom Next - Daytrading Community

Probleme beim E/A, dauernd Fehlermeldungen


sill3000

Recommended Posts

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 ?

Edited by sill3000
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

... das ist jetzt keine ernst gemeinte Frage oder?

Ich glaube Quickbeam21 meinte eher, welchen Typ und welche Werte diese Variablen haben :nictation:

 

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.

Link to comment
Share on other sites

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 :correct: )

 

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.

Link to comment
Share on other sites

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. :correct:

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

Link to comment
Share on other sites

Ja, das hast du genau richtig erkannt. :correct:

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Wert 1: z.B. EURUSD

Wert 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 ? :nictation:

Link to comment
Share on other sites

Hast du es so gemeint ? :nictation:

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?

Link to comment
Share on other sites

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 ?

Link to comment
Share on other sites

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()-Befehl

In 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.

Link to comment
Share on other sites

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/TP

2. 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.

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...