|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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--; } VG stoffel MT4 build 1260 24.01.2020 |
|
|||
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). |
|
|||
Nach kurzem Überfliegen fallen mir 2 Sachen auf:
Code:
bool checkOrderClose=true; Code:
index--; |
|
||||
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
|
|
|||
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--; } |
|
|||
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"); } } 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; } Schon mal vielen Dank an alle. VG stoffel |
|
||||
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? |
|
||||
Code:
for(int y=OrdersHistoryTotal()-1; y>=0; y--) { if(OrderSelect(y,SELECT_BY_POS,MODE_HISTORY)) { if((OrderMagicNumber()==magic) && (OrderSymbol()==Symbol())) { Code:
if(Optimizer) { VirtualTrades(__FUNCTION__+"()"+"()",OrderTicket(),OrderType(),_Symbol,TimeToStr(OrderOpenTime(),TIME_MINUTES),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit(),"22:55",OrderClosePrice(),OrderLots(),"Life"); } 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. |
|
|||
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.
|
Lesezeichen |
|
|