Problem der Mehrfachbestellung - Seite 5

 
RaptorUK:

Lesen Sie sich die Ausführungsfehlercodes durch und passen Sie Ihren Code an die dort gegebenen Informationen an, zum Beispiel.

ERR_TRADE_TIMEOUT128Die Zeitüberschreitung für den Handel wurde erreicht. Vor einem erneuten Versuch(zumindest im 1-Minuten-Takt) muss sichergestellt werden, dass die Handelsoperation nicht wirklich erfolgreich war (es wurde keine neue Position eröffnet, oder die bestehende Order wurde nicht geändert oder gelöscht, oder die bestehende Position wurde nicht geschlossen)


Hallo RaptorUK,

Vielen Dank für den Hinweis.

Ein anderes Problem (mehr.....);

Angenommen, bei einem ECN-Broker ist ein Handel offen und gemäß den "Anforderungen und Beschränkungen bei der Durchführung von Handelsgeschäften" kann eine Market-Order nicht geschlossen werden, wenn sich der Stoploss innerhalb der Freezing-Distanz befindet. Wird in diesem Fall die CloseAll-Funktion auch die Orders schließen, die sich innerhalb der Freezing-Distanz befinden?

Mit freundlichen Grüßen

Luis

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;   
        RefreshRates(); 

   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket>0)                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()-OrderClosePrice())>            
            MathAbs(OrderStopLoss()-OrderClosePrice()))              
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
                  GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 
 
  if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());           
}
 
luisneves:


Hallo RaptorUK,

Vielen Dank für den Hinweis.

Ein anderes Problem (mehr ein.....);

Angenommen, bei einem ECN-Broker ist ein Handel offen und gemäß den "Anforderungen und Beschränkungen bei der Durchführung von Trades" kann eine Market-Order nicht geschlossen werden, wenn der Stoploss innerhalb der Freezing-Distanz liegt. Wird in diesem Fall die CloseAll-Funktion auch die Orders schließen, die innerhalb der Freezing-Distanz liegen?

Nein, es wird fehlschlagen, wahrscheinlich Fehler 130
 

Hallo RaptorUK,

Wenn möglich, möchte ich Sie um Hilfe bei diesem Problem bitten;

Dieses Codestück findet die letzten OrderLots() und multipliziert sie mit dem Multiplikatorfaktor, aber einige Male geht es an diesem Faktor vorbei und ich habe Aufträge auf diese Weise; 0.01, 196,83, 590,49, etc.

Ich muss sagen, dass ich ein Limit für offene Aufträge habe, in diesem Fall 5. Nun, die Art, wie ich bin diese Logik gesehen, auch wenn eine Bedingung, um eine Bestellung über 5 wird es nicht öffnen und dann die Anzahl der Aufträge in den Pool sind auf 5 begrenzt, so dass, wenn der Code nur sehen, 5 Aufträge in den Pool die Losgröße für diese Aufträge sein sollte; 0,01, 0,02, 0,04, 0,08, 0,16. Ist irgendetwas in diesem Code falsch, was ich nicht weiß?

(Ich hoffe, die Einrückung ist in Ordnung...)

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
 if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
   {//12
 if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
   {//13
     LastLot = OrderLots();
   }//13              
     MLots = 0;                       
     MLots = LastLot * Multiplier;        
   }//12
 else MLots = LotSize;
   }//11 
 return(0);
 }//0 

Mit freundlichen Grüßen

Luis

 
luisneves:

Hallo RaptorUK,

Wenn möglich, möchte ich Sie um Hilfe bei diesem Problem bitten;

Dieses Codestück findet die letzten OrderLots() und multipliziert sie mit dem Multiplikatorfaktor, aber einige Male geht es an diesem Faktor vorbei und ich habe Aufträge auf diese Weise; 0.01, 196,83, 590,49, etc.

Ich muss sagen, dass ich ein Limit für offene Aufträge habe, in diesem Fall 5. Nun, die Art, wie ich bin diese Logik gesehen, auch wenn eine Bedingung, um eine Bestellung über 5 wird es nicht öffnen und dann die Anzahl der Aufträge in den Pool sind auf 5 begrenzt, so dass, wenn der Code nur sehen, 5 Aufträge in den Pool die Losgröße für diese Aufträge sein sollte; 0,01, 0,02, 0,04, 0,08, 0,16. Ist irgendetwas in diesem Code falsch, was ich nicht weiß?

(Ich hoffe, die Einrückung ist in Ordnung...)

Ich mache es so...

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         }//13              
      MLots = 0;                       
      MLots = LastLot * Multiplier;        
      }//12
   else MLots = LotSize;
   }//11 
return(0);
}//0 

wenn die OrderSelect() fehlschlägt MLots = LotSize ?? warum ? Ihre Einrückung hilft Ihnen nicht zu sehen, was mit Ihren if-Anweisungen und geschweiften Klammern passiert . . wollten Sie dies tun?

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         MLots = 0;                       
         MLots = LastLot * Multiplier; 
         }//13              
      }//12
   }//11 
if(MLots < 0.001) MLots = LotSize;  //  if MLots == 0.0
return(0);
}//0 

Ich habe dies getan...

if(MLots < 0.001)

. als schnelle und schmutzige Methode, um doppelte Vergleichsprobleme zu vermeiden, haben Sie das gelesen?Kann Preis != Preis ?

 
RaptorUK:

Ich mache es so...

wenn die OrderSelect() fehlschlägt MLots = LotSize ?? warum ? Ihre Einrückung hilft Ihnen nicht zu sehen, was mit Ihren if-Anweisungen und geschweiften Klammern passiert . . wollten Sie dies tun?

Ich habe dies getan...

. als schnelle und schmutzige Methode, um doppelte Vergleichsprobleme zu vermeiden, haben Sie das gelesen?Kann Preis != Preis ?


Hallo RaptorUk,

Vielen Dank für Ihre prompte Antwort.

Also, ich denke, das ist besser, einfach nicht zu verwenden, weil das ist es für nichts. Und danke für den Link zur Verfügung gestellt.

Beste Grüße

Luis

 

Hallo RaptorUK,

Ich habe ein Problem (mehr ein.....)

Einige Aufträge schließen vor der Zeit, was ich meine ist;

Diese Aufträge waren offen und es gibt ein Limit von bis zu 6 offenen Aufträgen. Alle Aufträge sollten mit Hilfe des TrailingStop geschlossen werden, aber die Aufträge 1. 3 und 5 wurden vor den anderen geschlossen, die nach (07:43) geschlossen wurden.

Da diese 3 Orders vor den anderen geschlossen wurden, ist Platz für die Orders 7, 8 und 9, die mit einem Lot basierend auf dem letzten Lot (2.43) geöffnet werden.

Also, soweit ich verstanden habe, sollte das unregelmäßige Schließen der Orders um 07:23 nicht passieren und es wurden keine Fehler gefunden...

1 - 49518192013.01.28 19:51verkaufen0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04kaufen0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12verkaufen0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20kaufen0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27verkaufen0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48kaufen2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23verkaufen7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40kaufen21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40verkaufen65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

Der Code zum Schließen dieser Aufträge mit Hilfe von TrailingStop ist dieser;

Könnte dieser Code fehlschlagen und die Aufträge zu unterschiedlichen Zeiten schließen?

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;
        
   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket > 0 )                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()- OrderClosePrice())>            
            MathAbs(OrderStopLoss()- OrderClosePrice()))             
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 

Mit freundlichen Grüßen

Luis

 
luisneves:


Der Code, um alle Aufträge mit Hilfe von TrailingStop zu schließen, ist dieser;

Könnte dieser Code fehlschlagen und die Aufträge zu unterschiedlichen Zeiten schließen?

OK, das macht keinen Sinn ... ein Trailing SL wird so gesetzt, dass, wenn der Preis mit einer Order steigt, der SL in Richtung des Preises verschoben wird, so dass, wenn der neue SL getroffen wird, es weniger Verlust oder sogar einen Gewinn gibt. Warum ein Trailing-SL, wenn Sie den Handel sowieso mit OrderClose() schließen? Für mich ist das kein Trailing-SL, es ist kein SL irgendeiner Art, da Sie den Handel aktiv über den EA und nicht über den SL schließen.

Vielleicht macht Ihre CloseAllOnSL()-Funktion etwas anderes als das, was ich denke, dass sie tut, aber Sie haben keine Kommentare, die erklären, was Ihr Code zu tun versucht. Es gibt keinen Trailing-SL, da es keine OrderModify() gibt.

 

Lesen Sie dies:Was sind Funktionsrückgabewerte? Wie kann ich sie verwenden?

if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 {
                 GLError = GetLastError();

                 //  ? ? ? ? ?  why aren't you printing the information about the OrderClose() failure ? ? 
                 Print("OrderClose failed, error# ", GLError);  //<-----  like this  but more info
                 } 
              }//32 

Fügen Sie weitere Informationen zur Print-Anweisung hinzu, fügen Sie OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, etc, etc alle Informationen hinzu, die Sie benötigen, um zu bestimmen, was das Problem war, als der Fehler auftrat, Sie können nicht einfach in der Zeit zurückgehen und all dies herausfinden, also wenn es passiert, drucken Sie es in das Protokoll.

 
luisneves:


Soweit ich verstanden habe, sollten die unregelmäßigen Orderabschlüsse um 07:23 Uhr nicht vorkommen und es wurden keine Fehler gefunden...

1 - 49518192013.01.28 19:51verkaufen0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04kaufen0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12verkaufen0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20kaufen0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27verkaufen0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48kaufen2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23verkaufen7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40kaufen21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40verkaufen65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

Zeigen Sie die Ausgabe des Protokolls, wenn dies passiert ist...
 
RaptorUK:

Lesen Sie dies:Was sind Funktionsrückgabewerte? Wie kann ich sie verwenden?

Fügen Sie weitere Informationen zur Print-Anweisung hinzu, fügen Sie OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, etc, etc alle Informationen hinzu, die Sie benötigen, um zu bestimmen, was das Problem war, als der Fehler auftrat, Sie können nicht einfach in der Zeit zurückgehen und all dies herausfinden, also wenn es passiert, drucken Sie es in das Protokoll.


Hallo RaptorUk,

Wir danken Ihnen für Ihre Zeit.

Der Code für TrailingStop befindet sich in einem anderen Teil, der gesendete Code ist nur dazu da, um alle Aufträge zu schließen, sobald sie mittels TrailingStop geschlossen wurden.

Nichtsdestotrotz werde ich Ihren Rat befolgen und nach Fehlern suchen, die weitere Informationen darüber liefern könnten, warum Aufträge vor anderen geschlossen werden.

Übrigens, macht es im folgenden Code Sinn, die Position von MLots = 0; von der aktuellen Stelle vor der for-Schleife zu ändern?

   MLots = 0; <-----------------------------------------------------------------to here 
   for(int cnt = 0; cnt < OrdersTotal(); cnt++)
      {//11
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {//12
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//13
            LastLot = OrderLots();
            }//13            
         MLots = 0;  <-----------------------------------------------------------from here                      
         MLots = LastLot * Multiplier;        
         }//12      
      }//11 
   return(0);
   }//0 

Mit freundlichen Grüßen

Luis