Help needed !! OrderClose Fehler 3 = invalid trade parameters (MQL4)

 

Hallo,
ich hoffe mir kann jemand weiter helfen.
In meinem EA habe ich einen OrderClose Befehl, der unter bestimmten Umständen ausgeführt werden soll.

Es kann sein, dass es (ich bleibe in meinem Bsp. mal bei BUY() Positionen), sich mal um 2-3 Positionen handelt, es kann sich aber auch mal um 20-21 Positionen auf einmal handeln.

Was mir aufgefallen ist, manchmal kommt für einzelne Positionen die Fehlermeldung 3 (invalid trade parameters), leider kann ich nicht strukturell raus finden warum.

Anbei ist mal mein Code, für den OrderClose Befehl, vlt. hat jemand von euch eine Idee, warum es bei vereinzelnden Positionen zu der Fehlermeldung kommt?
Oder ist mein Code schlecht/fehlerhaft?

Danke im Voraus für Tipps / Hilfen / Diskussionen :-)

void closeBUY()
   {
      for(int c=OrdersTotal()-1;c>=0;c--)
      {
         if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES))
         {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
            {
                  RefreshRates();
                  double bid = NormalizeDouble(Bid,Digits);
                  double ask = NormalizeDouble(Ask,Digits);
                  if(OrderType()==OP_BUY)              
                  {
                        Closeticket=OrderClose(OrderTicket(),OrderLots(),bid,Slippage*10,clrGreen);  
                        if(Closeticket == false) 
                        {
                                FehlerCode  = GetLastError(); 
                                FehlerBeschreibung = ErrorDescription(FehlerCode); 
                                FehlerAusgabe = StringConcatenate("***** FEHLER   [closeBUY()]  Schließen BUY: ",     OrderTicket()," = ", FehlerCode," : ",FehlerBeschreibung); Print(FehlerAusgabe);
                        }
                 }
            }
         } 
      }
};
 
  1. Geht es um Positionen oder Orders? MQ5 macht einen Unterschied zwischen (offenen) Positionen (PositionsTotal()) und schwebenden Aufträgen (OrdersTotal()!
  2. Stell den Kursor auf OrderSelect und drück auf F1, manchmal (zB. bei OrderGetTicket()) gibt es auch ein Beispiel!!
 
Carl Schreiber #:
  1. Geht es um Positionen oder Orders? MQ5 macht einen Unterschied zwischen (offenen) Positionen (PositionsTotal()) und schwebenden Aufträgen (OrdersTotal()!
  2. Stell den Kursor auf OrderSelect und drück auf F1, manchmal (zB. bei OrderGetTicket()) gibt es auch ein Beispiel!!

Hi,

1. es ist MQL4 und es geht um Orders (zb OrderType() == OP_BUY).

2. grundsätzlich funktioniert der Code, nur eben bei einzelnen Order's bringt er die Fehlermeldung 3. Das ist das, was mich zweifeln lässt, ob meine Schleife und { } Setzung korrekt ist :-/

 
Markus Wilhelm #:

Hi,

1. es ist MQL4 und es geht um Orders (zb OrderType() == OP_BUY).

2. grundsätzlich funktioniert der Code, nur eben bei einzelnen Order's bringt er die Fehlermeldung 3. Das ist das, was mich zweifeln lässt, ob meine Schleife und { } Setzung korrekt ist :-/

Wenn  der Code nur hin und wieder falsch ist, hilft nur

  1. alles, Parameter und Preise(Preis-Gap?) ausdrucken, 
  2. vorher ein GetLastError(); platzieren ("After the function call, the contents of _LastError are reset."),
  3. prüfen, ob die Position nicht zwischenzeitlich durch SL oder TP geschlossen ist.
 
Markus Wilhelm:
void closeBUY()    {       for(int c=OrdersTotal()-1;c>=0;c--)       {          if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES))          {             if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)             {                   RefreshRates();                   double bid = NormalizeDouble(Bid,Digits);                   double ask = NormalizeDouble(Ask,Digits);                   if(OrderType()==OP_BUY)                                 {                         Closeticket=OrderClose(OrderTicket(),OrderLots(),bid,Slippage*10,clrGreen);                           if(Closeticket == false)                         {                                 FehlerCode  = GetLastError();                                 FehlerBeschreibung = ErrorDescription(FehlerCode);                                 FehlerAusgabe = StringConcatenate("***** FEHLER   [closeBUY()]  Schließen BUY: ",     OrderTicket()," = ", FehlerCode," : ",FehlerBeschreibung); Print(FehlerAusgabe);                         }                  }             }          }       } };

Hallo,

in Ihrem Code unten in den letzten Klammer steht };  (;) .

Kommt es nicht zur Fehler beim Kompilieren? 


Sonst probieren Sie den Order mit ask zu schließen.

https://docs.mql4.com/trading/orderclose

Gruß Igor

OrderClose - Trade Functions - MQL4 Reference
OrderClose - Trade Functions - MQL4 Reference
  • docs.mql4.com
OrderClose - Trade Functions - MQL4 Reference
 
Igor Widiger #:

Hallo,

in Ihrem Code unten in den letzten Klammer steht };  (;) .

Kommt es nicht zur Fehler beim Kompilieren? 


Sonst probieren Sie den Order mit ask zu schließen.

https://docs.mql4.com/trading/orderclose

Gruß Igor

Hi.
Das mit der Klammer war hier nur ein Tippfehler, beim EA selbst habe ich es korrekt, daher dort auch kein Fehler beim Kompilieren.

BUY Positionen werden doch aber immer zum BID Price geschlossen, wieso soll ich es mit dem ASK Price versuchen?
 
Markus Wilhelm #:

BUY Positionen werden doch aber immer zum BID Price geschlossen, wieso soll ich es mit dem ASK Price versuchen?

Richtig, es sei denn, es gibt plötzlicher Preissprünge.

Wie ich schon sagte: alle Parameter ausdrucken.

 
Carl Schreiber #:

Richtig, es sei denn, es gibt plötzlicher Preissprünge.

Wie ich schon sagte: alle Parameter ausdrucken.

Ok dann probiere ich es mal aus mit dem OrderPrint()
Ich werde berichten