Ich habe einen EA mit 2 EMA-Kreuzung erstellt und brauche Ratschläge. - Seite 4

 
prupru:

Ich habe jetzt ein größeres Problem: Mein Broker neigt dazu, Aufträge nur teilweise auszuführen.

Sehr geehrter Kunde,

wir möchten Sie darauf hinweisen, dass Ihr Handel teilweise (2,32 von 15,84 Lots) zum Preis von 587,318 eröffnet wurde.

Sollten Sie weitere Fragen zu diesem Thema haben, zögern Sie bitte nicht, uns zu kontaktieren.

Mit freundlichen Grüßen,

Makler.

Hier ist, was der Support sagt:

Bitte beachten Sie, dass in Zeiten hoher Volatilität oder geringer Liquidität Limit Orders teilweise ausgeführt werden können. Das bedeutet, dass die Position sofort ganz oder teilweise ausgeführt wird, wenn der Preis erreicht wird. In Ihrem Fall wurde Ihr Auftrag teilweise ausgeführt, weshalb Sie eine Benachrichtigung erhalten haben.

Ich weiß, wie man alle Orders schließt, obwohl sie teilweise geschlossen wurden, ich muss nur Close all Orders while OrdersTotal() > 0 machen , aber ich weiß nicht, was ich tun soll, wenn die Orders teilweise geöffnet werden.

edit:

Ich habe gerade gemerkt, dass ich die richtigen Symbol- und Magicnumber-Orders prüfen muss, das ist etwas schwieriger

edit: hier ist die Funktion close all orders, die die Orders auch bei teilweiser Schließung schließen sollte


//Close all my Orders
void CloseAllOrders()
{
int notMyOrders = 0;

 while (OrdersTotal()>notMyOrders)
 {
 notMyOrders = 0;
 for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
   if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) {notMyOrders++; continue;}
   if(OrderType()<= 1)CloseOrder();
         
   }
 }
return;
}  
umgeschrieben
 
deVries:

umgeschrieben


wow!

Das ist ein bisschen knifflig für mich, ich habe es 4 oder 5 Mal durchgelesen, bevor ich es verstanden habe. Danke!

und... was passiert, wenn OrderSelect false zurückgibt?

Wie oft gibt OrderSelect false zurück? Ist das überhaupt möglich?

 
prupru:


wow!

das ist ein bisschen knifflig für mich, ich habe es etwa 4 oder 5 Mal durchgelesen, bevor ich es verstanden habe. Danke!

und... was passiert, wenn OrderSelect false zurückgibt?

Wie oft gibt OrderSelect false zurück? Ist das überhaupt möglich?


for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;

i= 0

kommt aus der Schleife zurück

i = -1

if(OrderSelect(-1,SELECT_BY_POS,MODE_TRADES)==false) break; // ==> Ende der Überprüfung der Trades, wir unterbrechen die Schleife

nächste CloseOrder()

//CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
  {
   Print("Close order error: ",GetLastError());
   Print("Type ", OrderType()," PR ",PR, " Ask ", Ask, " Bid ", Bid, " OrderTicket ", OrderTicket(), " OrderLots ", OrderLots());
  }
return;}
//--------------------------- end of close order

Welche allgemeinen Fehler können von GetLastError() zurückgegeben werden?

Wenn das Schließen fehlschlägt, kann es sein, dass das nächste Schließen auch wegen eines Fehlers wie tradecontext too busy oder eines anderen Fehlers fehlschlägt...

Was können Sie also tun, um zu vermeiden, dass viele dieser Situationen auftreten?

 
deVries:


Was können Sie also tun, um zu vermeiden, dass viele dieser Situationen eintreten?

Ich weiß es noch nicht. Ich muss darüber nachdenken.

Ich stecke im Moment mit einem anderen Problem fest.

Ich habe meinen EA auf einen Windows 2003 VPS gestellt und jetzt gibt er den Fehler "terminated by timeout" zurück, aber so einen Fehler habe ich auf meinem Heim-PC noch nie gesehen.

Und der Fehler poppt nicht die Zeit, meine während schließen und öffnen, um Zyklen laufen, aber wenn der Experte jush prüft für die Kreuzung und gehen im Leerlauf.

Ich meine, das Programm prüft, ob sich ein neuer Balken öffnet, trailingstop = 0, also kein Aufruf der Trailing-Stop-Funktion, dann, wenn sich ein neuer Balken öffnet, prüft es, ob sich die EMA-Linien kreuzen, es gibt keine Kreuzung (die Zeiten, in denen ich Timeout-Fehler bekam, waren die EMA-Linien weit davon entfernt, sich zu kreuzen), so dass das Programm returnes(0)

Es gibt keine Zyklen! Wie kann es durch eine Zeitüberschreitung beendet werden?

 
prupru:

Ich weiß es noch nicht. Ich muss darüber nachdenken.

Ich stecke im Moment mit einem anderen Problem fest.

Ich habe meine EA auf einem Windows 2003 VPS und jetzt ist es zurück "terminated by timeout" Fehler, aber ich habe noch nie einen solchen Fehler auf meinem PC zu Hause gesehen.

Und der Fehler poppt nicht die Zeit, meine während schließen und öffnen, um Zyklen laufen, aber wenn der Experte jush prüft für die Kreuzung und gehen im Leerlauf.

Ich meine, das Programm prüft, ob sich ein neuer Balken öffnet, trailingstop = 0, also kein Aufruf der Trailing-Stop-Funktion, dann, wenn sich ein neuer Balken öffnet, prüft es, ob sich die EMA-Linien kreuzen, es gibt keine Kreuzung (die Zeiten, in denen ich Timeout-Fehler bekam, waren die EMA-Linien weit davon entfernt, sich zu kreuzen), so dass das Programm returnes(0)

Es gibt keine Zyklen! Wie kann es durch eine Zeitüberschreitung beendet werden?


dies ist kein Zyklus?

while(!IsTradeAllowed()) Sleep(10);
 
deVries:


dies ist kein Zyklus?


Ich meine, während der Zeit, in der der EA beendet wurde, waren die EMA-Linien weit davon entfernt, sich zu kreuzen, so dass die NewOrder-Funktion nicht aufgerufen wurde, so dass der Zyklus, von dem Sie sprechen (der sich innerhalb der NewOrder-Funktion befindet), nicht ausgeführt wurde.

IsStopped-Bedingung hinzugefügt

while( (!IsTradeAllowed()) && (!IsStopped()) ) Sleep(10);
while ( (LotRemains>0) && (!IsStopped()) )
while ( (OrdersTotal()>0) && (!IsStopped()) ) 
 
Vielleicht tritt der Timeout-Fehler auf, weil ich keine VPS-Prozessorressourcen mehr habe. Ich habe zu einem teureren Plan gewechselt und ich sehe sie nicht, bis ich etwas Schweres wie Windows uodate ausführe
Grund der Beschwerde: