Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools  
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4443
Beiträge: 40902
Benutzer: 6.832
Aktive Benutzer: 266
Links: 80
Wir begrüßen unseren neuesten Benutzer: burkijan
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- burkijan
vor 2 Tagen
- Chidiroglo...
vor 3 Tagen
- JapanTrade...
vor 5 Tagen
- chroma
vor 6 Tagen
- statisticm...

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 111
Gesamt: 111
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor 2 Tagen
Neues Mitglied
 
Registriert seit: Apr 2019
Beiträge: 20
stoffel befindet sich auf einem aufstrebenden Ast
Standard PO über expiration gelöscht und noch immer in OrdersTotal()?

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
VG
stoffel

MT4
build 1260
24.01.2020
Angehängte Grafiken
Dateityp: png OrderDelete.png (8,1 KB, 5x aufgerufen)
Mit Zitat antworten
  #2 (permalink)  
Alt vor 2 Tagen
Neues Mitglied
 
Registriert seit: Apr 2019
Beiträge: 20
stoffel befindet sich auf einem aufstrebenden Ast
Standard

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).
Angehängte Grafiken
Dateityp: png OrderDelete2.png (15,1 KB, 2x aufgerufen)
Mit Zitat antworten
  #3 (permalink)  
Alt vor 2 Tagen
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 932
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #4 (permalink)  
Alt vor 2 Tagen
Neues Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 20
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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;
        }
     }
  }
Mit Zitat antworten
  #5 (permalink)  
Alt vor 2 Tagen
Neues Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 20
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von MA-EA Beitrag anzeigen
Code:
index--;
Ist eigentlich überflüssig weil ja die Schleife die Orders zählen soll, ohne dass irgendwelche Werte verringert werden.
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
Mit Zitat antworten
  #6 (permalink)  
Alt vor 2 Tagen
Neues Mitglied
 
Registriert seit: Apr 2019
Beiträge: 20
stoffel befindet sich auf einem aufstrebenden Ast
Standard

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--;
      }
Mit Zitat antworten
  #7 (permalink)  
Alt vor einem Tag
Neues Mitglied
 
Registriert seit: Apr 2019
Beiträge: 20
stoffel befindet sich auf einem aufstrebenden Ast
Standard

moin @ all,

ich habe jetzt den Code von Indikator-Trading probiert. Keine Fehlermeldung . 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

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

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
Angehängte Grafiken
Dateityp: png profitlable.png (23,4 KB, 2x aufgerufen)
Mit Zitat antworten
  #8 (permalink)  
Alt vor einem Tag
Neues Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 20
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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?
Mit Zitat antworten
  #9 (permalink)  
Alt vor einem Tag
Neues Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 20
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #10 (permalink)  
Alt vor einem Tag
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 932
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von stoffel Beitrag anzeigen
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. Wollte nur sagen, dass es unnötig ist, eine Variable extra zu deklarieren, wenn das ein paar Zeilen später sowieso passiert.
Mit Zitat antworten
Antwort

Lesezeichen


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 11:16 Uhr.





Die Suchmaschine - Der Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2020 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2020 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------