Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   PO über expiration gelöscht und noch immer in OrdersTotal()? (http://www.expert-advisor.com/forum/showthread.php?t=6672)

stoffel 23.05.20 17:54

PO über expiration gelöscht und noch immer in OrdersTotal()?
 
Liste der Anhänge anzeigen (Anzahl: 1)
seit gegrüßt;),

Ich habe in meinem EA eine Funktion die zum Tagesende alle Positionen löscht/schließt. Jetzt bekommen ich immer die Fehlermeldung
'Unknown Ticket 1 for OrderDelete Function'. Das Ticket 1 ist eine Pending Order die über expiration gelöscht wurde.

Mit 'index = OrdersTotal()' bekomme ich die Anzahl der offenen Orders und der Pending Orders. Soweit klar. Aber wenn gelöscht (deleted due expiration) sollte diese Order nicht mehr unter OrdersTotal() auftauchen!?

Code:

  void CloseAllOpenPositions(string f, int intMaxSlippage) {
      if(debug)
        Print(">>>",f,"::",__FUNCTION__+"()");
      bool checkOrderClose=true;
      int index=OrdersTotal()-1;
      while(index>=0) {
        if(OrderSelect(index,SELECT_BY_POS,MODE_TRADES)) {
            Print(f,"::Close all Positions: ",TimeCurrent());
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
              if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
                  checkOrderClose=OrderDelete(OrderTicket(),CLR_NONE);
                  if(!checkOrderClose) {
                    int errorCode=GetLastError();
                    if(errorCode==1 || errorCode==2 || errorCode==5 || errorCode==6 || errorCode==64 || errorCode==65 || errorCode==132 || errorCode==133 || errorCode==139) {
                        Print(__FUNCTION__," Error: delete pendingOrder ",OrderTicket(),"|",OrderComment(),"|",ErrorDescription(errorCode));
                    }
                  }
              }
            }
        }
        index--;
      }

Verstehe ich etwas falsch :confused:
VG
stoffel

MT4
build 1260
24.01.2020

stoffel 23.05.20 20:36

Liste der Anhänge anzeigen (Anzahl: 1)
habe mal eine Durchlaufzähler für die Funktion eingefügt. Bei jedem Aufruf wird der Zähler um 1 erhöht.

OrdersTotal() = 1 !! Also nur eine Position. Trotzdem findet die F. bei gleichem index eine weitere Pos. (BuyStop mit Ticket 1).:eek:

MA-EA 23.05.20 21:11

Nach kurzem Überfliegen fallen mir 2 Sachen auf:
Code:

bool checkOrderClose=true;
braucht zu Beginn eigentlich nicht extra deklariert werden
Code:

index--;
Ist eigentlich überflüssig weil ja die Schleife die Orders zählen soll, ohne dass irgendwelche Werte verringert werden. :confused:

Indikator-Trading 23.05.20 21:23

Hallo, in dem Code, welchen du geschrieben hast, werden ja nur PendingStop Orders behandelt. Das passt dann nicht zu dem Log den du als letztes angehängt hast.

Pendingorders mussen gelöscht werden OrderDelete(), MarketOrders müssen geschlossen werden OrderClose()

Hier meine CloseAllOrders Funktion, allerdings ohne gutes Error Handling:

Code:

void CloseAllOrders(int Slippage_local,int MagicNumber_local)
  {
  for(int i=OrdersTotal()-1; i>=0; i--)
    {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
        break;
      if((OrderMagicNumber()!=MagicNumber_local) || (OrderSymbol()!=Symbol()))
        continue;
      //--- check order type
      if(OrderType()==OP_BUY)
        {
        if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage_local,White))
            Print(__FUNCTION__," ERROR OP_BUY ",GetLastError());

        continue;
        }
      if(OrderType()==OP_SELL)
        {
        if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage_local,White))
            Print(__FUNCTION__," ERROR OP_SELL ",GetLastError());
        continue;
        }
      if(OrderType()>1) //OP_BUYSTOP OP_SELLSTOP OP_BUYLIMIT OP_SELLLIMIT
        {
        if(!OrderDelete(OrderTicket(),White))
            Print(__FUNCTION__," ERROR OP_BUYSTOP OP_SELLSTOP OP_BUYLIMIT OP_SELLLIMIT ",GetLastError());
        continue;
        }
    }
  }


Indikator-Trading 23.05.20 21:28

Zitat:

Zitat von MA-EA (Beitrag 43759)
Code:

index--;
Ist eigentlich überflüssig weil ja die Schleife die Orders zählen soll, ohne dass irgendwelche Werte verringert werden. :confused:

Er macht das in einer While-Schleife und nicht (wie üblich) in einer For-Schleife. Daher muss er die mitlaufende Variable ändern. Eine For-Schleife wäre dennoch die deutlich bessere Lösung

stoffel 23.05.20 22:21

hallo MA-EA,

wenn ich eine bool Variable deklariere ist sie automatisch true? ok.

@ Indikator-Trading
du hast völlig recht.Ich habe den Code etwas eingekürzt weil noch ein paar andere Dinge über diese Funktion geregelt werden.
Es ist aber nur der Teil den ich kopiert habe fehlerhaft.

Leider habe ich kein Idee woran es liegen kann.

hier noch der Teil für die Market Orders.
Und Danke für eure Bemühungen.

Code:

  void CloseAllOpenPositions(string f, int intMaxSlippage) {
      if(debug)
        Print(">>>",f,"::",__FUNCTION__+"()");
      bool checkOrderClose=true;
      int index=OrdersTotal()-1;
      while(index>=0) {
        if(OrderSelect(index,SELECT_BY_POS,MODE_TRADES)) {
            Print(f,"::Close all Positions durchlauf ",cap,"| ",TimeCurrent());
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
              RefreshRates();
              if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
                  Print("::index market Order ",index,"|type ",OrderType(),"|ticket ",OrderTicket());
                  if(OrderType()==OP_BUY) {
                    checkOrderClose=OrderClose(OrderTicket(),OrderLots(),Bid,Deviation,CLR_NONE);
                    if(checkOrderClose){
                        if(pLable)
                          ProfitLable(__FUNCTION__);
                        if(Optimizer)
                          VirtualTrades(__FUNCTION__+"()"+"()",OrderTicket(),OrderType(),_Symbol,TimeToStr(OrderOpenTime(),TIME_MINUTES),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit(),"22:55",OrderClosePrice(),OrderLots(),"Life");
                    }
                  }
                  if(OrderType()==OP_SELL) {
                    checkOrderClose=OrderClose(OrderTicket(),OrderLots(),Ask,Deviation,CLR_NONE);
                    if(checkOrderClose){
                        if(pLable)
                          ProfitLable(__FUNCTION__);
                        if(Optimizer)
                          VirtualTrades(__FUNCTION__+"()"+"()",OrderTicket(),OrderType(),_Symbol,TimeToStr(OrderOpenTime(),TIME_MINUTES),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit(),"22:55",OrderClosePrice(),OrderLots(),"Life");
                    }
                  }
                  if(checkOrderClose==false) {
                    int errorCode=GetLastError();
                    if(errorCode==1 || errorCode==2 || errorCode==5 || errorCode==6 || errorCode==64 || errorCode==65 || errorCode==132 || errorCode==133 || errorCode==139) {
                        Print(__FUNCTION__," Error: marketOrder",ErrorDescription(errorCode));
                        break;
                    } else continue;
                  }
              }
              if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
                  checkOrderClose=OrderDelete(OrderTicket(),CLR_NONE);
                  if(!checkOrderClose) {
                    int errorCode=GetLastError();
                    if(errorCode==1 || errorCode==2 || errorCode==5 || errorCode==6 || errorCode==64 || errorCode==65 || errorCode==132 || errorCode==133 || errorCode==139) {
                        Print(__FUNCTION__," Error: delete pendingOrder ",OrderTicket(),"|",OrderComment(),"|",ErrorDescription(errorCode));
                    }
                  }
              }
            }
        }
        index--;
      }


stoffel 24.05.20 12:36

Liste der Anhänge anzeigen (Anzahl: 1)
moin @ all,

ich habe jetzt den Code von Indikator-Trading probiert. Keine Fehlermeldung :D. Anschließend habe ich nach und nach den Rest meiner
Funktion hinzugefügt und festgestellt das der Fehler NICHT bei OrderDelete zu suchen ist ! Sondern schon vorher beim Schließen der offenen Orders.

In dem Teil hatte ich bei erfolgreichem schließen zwei weitere Funktionen aufgerufen.

Code:

            if(!OrderClose(OrderTicket(),OrderLots(),Bid,intMaxSlippage,White)) {
              Print(__FUNCTION__," ERROR OP_BUY ",GetLastError());
              continue;
            } else {
              if(pLable) {
                  ProfitLable(__FUNCTION__);
              }
              if(Optimizer) {
                  VirtualTrades(__FUNCTION__+"()"+"()",OrderTicket(),OrderType(),_Symbol,TimeToStr(OrderOpenTime(),TIME_MINUTES),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit(),"22:55",OrderClosePrice(),OrderLots(),"Life");
              }
            }

Die Funktion 'ProfitLable(__FUNCTION__)' verursacht den Fehler. Da sie aber funktioniert und der Fehler nicht ständig auf tritt bin ich soweit wie vorher, ich habe keine Ahnung:mad:

Vielleicht kann mal jemand über diese Funktion schauen und mir sagen was ich falsch mache :confused:

Code:

void ProfitLable(string f)
{
  if(debug)
      Print(">>>",f+"()","::",__FUNCTION__+"()");
  color clr;
  for(int y=OrdersHistoryTotal()-1; y>=0; y--) {
      if(OrderSelect(y,SELECT_BY_POS,MODE_HISTORY)) {
        if((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol())) {
            if(OrderCloseTime()>0) {
              lastTicket= OrderTicket();
              int plshift = iBarShift(_Symbol,_Period,OrderCloseTime());
              datetime plshift2 = iTime(_Symbol,0,plshift+7);
              if(OrderProfit()>0)clr=clrOlive;
              else clr=clrRed;
              if(OrderType()==OP_BUY) {
                  if(OrderProfit()>0) {
                    drawLabel("ProfitText"+(string)lastTicket,DoubleToString(OrderProfit(),2),High[plshift]+(40*_Point),clr,plshift,9);
                  } else {
                    drawLabel("ProfitText"+(string)lastTicket,DoubleToString(OrderProfit(),2),Low[plshift]-(30*_Point),clr,plshift,9);
                  }
              }
              if(OrderType()==OP_SELL) {
                  if(OrderProfit()<0) {
                    drawLabel("ProfitText"+(string)lastTicket,DoubleToString(OrderProfit(),2),High[plshift]+(30*_Point),clr,plshift,9);
                  } else {
                    drawLabel("ProfitText"+(string)lastTicket,DoubleToString(OrderProfit(),2),Low[plshift]-(40*_Point),clr,plshift,9);
                  }
              }
              lastTicket=0;
            }
        }
      }
  }
  return;
}

Screenshot im Anhang

Schon mal vielen Dank an alle.
VG
stoffel

Indikator-Trading 24.05.20 19:10

iBarShift() benötigt eigentlich noch ein true/false als letzten Parameter, der angibt wie exakt die Suche sein soll.

Ansonsten kann es wohl am ehesten an deiner drawLabel Funktion liegen. Welche Fehlermeldung sagt die der Compiler bzw. MT beim ausführen des EAs?

Indikator-Trading 24.05.20 19:29

Code:

  for(int y=OrdersHistoryTotal()-1; y>=0; y--) {
      if(OrderSelect(y,SELECT_BY_POS,MODE_HISTORY)) {
        if((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol())) {

Du suchst nach dem Schließen der Order in der History nach allen Orders, welche das selbe Symbol und die gleiche Magicnumber haben. Da müsstest du ja einige Treffer laden, da in der History ja alle für den aktuell gewählten Zeitraum vorhanden sind.

Code:

if(Optimizer) {
                  VirtualTrades(__FUNCTION__+"()"+"()",OrderTicket(),OrderType(),_Symbol,TimeToStr(OrderOpenTime(),TIME_MINUTES),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit(),"22:55",OrderClosePrice(),OrderLots(),"Life");
              }

Zudem hast du über die letzte OrderSelect, ja irgendeine Order selektiert.
Im Coder für das Closen fragst du allerdings direkt wieder die OrderTicket() usw. ab ohne genau zu wissen, ob die letzte Orderselect auch noch die Order ausgewählt hat, welche du erwartest.

MA-EA 24.05.20 22:33

Zitat:

Zitat von stoffel (Beitrag 43763)
hallo MA-EA,
wenn ich eine bool Variable deklariere ist sie automatisch true? ok.

Code:

bool checkOrderClose=true;

checkOrderClose=OrderClose(OrderTicket(),OrderLots(),Bid,Deviation,CLR_NONE);


Weiß ich nicht. :rolleyes: Wollte nur sagen, dass es unnötig ist, eine Variable extra zu deklarieren, wenn das ein paar Zeilen später sowieso passiert.


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:47 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum