|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Problem mit OrderModify
Hallo zusammen,
ich hänge aktuell an einem Problem fest und hoffe auf den richtigen Denkanstoß: Der EA eröffnet eine Order und soll diese dann mit der folgenden Subroutine abarbeiten: Wenn TP1 erreicht ist, erfolgt der erste Teilschluss der Position + Breakeven, und bei TP2 wird der TP gesetzt, sowie der SL auf TP1 nachgezogen. Ich habe den EA jetzt einige Tage laufen lassen und ich erhalte bei Erreichen von TP1 immer die Fehlermeldung: INvalid ticket number for OrderModify. Ich finde den Fehler mit der falschen Ticketnummer nicht. Hat jmand zufällig keine Tomaten auf den Augen? Danke und Gruß, Bucardo Code:
///////Ordermanagement void Ordermanagement() { for (int i = 0; i < OrdersTotal(); i++) { ph1=OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol() && (OrderMagicNumber() == Magic)) { //Buy-Order if(OrderType() == OP_BUY) { if(Bid > GlobalVariableGet(Symbol()+"_TP_1") && GlobalVariableGet(Symbol()+"_Remote_Buy_Management1") == 1) { ticket2=OrderClose(OrderTicket(),OrderLots() / 2,Bid,10); if(ticket2 > 0) { ph1=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() + 5 * Poin,0,0); GlobalVariableDel(Symbol()+"_TP_1"); GlobalVariableDel(Symbol()+"_Remote_Buy_Management1"); GlobalVariableSet(Symbol()+"_Remote_Buy_Management2",1); } } if(Bid > GlobalVariableGet(Symbol()+"_TP_2") && GlobalVariableGet(Symbol()+"_Remote_Buy_Management2") == 1) { ph2=OrderModify(OrderTicket(),OrderOpenPrice(),GlobalVariableGet(Symbol()+"_TP_2"),GlobalVariableGet(Symbol()+"_TP_3"),0,0); GlobalVariableDel(Symbol()+"_TP_2"); GlobalVariableDel(Symbol()+"_TP_3"); GlobalVariableDel(Symbol()+"_Remote_Buy_Management2"); } } //Sell-Order if(OrderType() == OP_SELL) { if(Ask < GlobalVariableGet(Symbol()+"_TP_1") && GlobalVariableGet(Symbol()+"_Remote_Sell_Management1") == 1) { ticket3=OrderClose(OrderTicket(),OrderLots() / 2,Bid,10); if(ticket3 > 0) { ph=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() - 5 * Poin,0,0); GlobalVariableDel(Symbol()+"_TP_1"); GlobalVariableDel(Symbol()+"_Remote_Sell_Management1"); GlobalVariableSet(Symbol()+"_Remote_Sell_Management2",1); } } if(Ask < GlobalVariableGet(Symbol()+"_TP_2") && GlobalVariableGet(Symbol()+"_Remote_Sell_Management2") == 1) { ph=OrderModify(OrderTicket(),OrderOpenPrice(),GlobalVariableGet(Symbol()+"_TP_2"),GlobalVariableGet(Symbol()+"_TP_3"),0,0); GlobalVariableDel(Symbol()+"_TP_2"); GlobalVariableDel(Symbol()+"_TP_3"); GlobalVariableDel(Symbol()+"_Remote_Sell_Management2"); } } } } } |
|
|||
Der Hase liegt hier begraben:
ticket2=OrderClose(OrderTicket(),OrderLots() / 2,Bid,10); if(ticket2 > 0) { ph1=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() + 5 * Poin,0,0); Wenn eine Order teilgeschlossen wird, bekommt die verbleibende Teilorder eine neue Ticketnumber. Die Ticketnumber, die noch bei der Teilschließung existent ist, existiert aber nicht mehr beim Aufruf der OrderModify()-Funktion, so dass der Fehler: Invalid ticket number for OrderModify erscheint. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hallo,
ich würde grundsätzlich vor weiteren evtl. Bearbeitungen, ohne die For-Schleife neu anzusetzen, nicht ein Close machen, da sich evtl. was verschieben kann. Also Close immer als letztes oder einzelne Aktion auf die For-Auswahl machen. Gruß Joe |
|
|||
Danke für die schnellen Antworten! Da hätte ich auch drauf kommen müssen...
Ich habe es jetzt folgendermaßen umgestellt. Code:
///////Breakeven void Breakeven() { //Buy for (int i = 0; i < OrdersTotal(); i++) { ph=OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol() && (OrderMagicNumber() == Magic)) { if(OrderType() == OP_BUY) { if(Bid > GlobalVariableGet(Symbol()+"_TP_1") && GlobalVariableGet(Symbol()+"_Remote_Buy_TP1") == 1) { ph=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() + 5 * Poin,0,0); if(ph > 0) { ph=OrderClose(OrderTicket(),OrderLots() / 2,Bid,10); GlobalVariableDel(Symbol()+"_TP_1"); GlobalVariableDel(Symbol()+"_Remote_Buy_TP1"); GlobalVariableSet(Symbol()+"_Remote_Buy_TP2",1); } } } } } //Sell for (int j = 0; j < OrdersTotal(); j++) { ph=OrderSelect(j, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol() && (OrderMagicNumber() == Magic)) { if(OrderType() == OP_SELL) { if(Ask < GlobalVariableGet(Symbol()+"_TP_1") && GlobalVariableGet(Symbol()+"_Remote_Sell_TP1") == 1) { ph=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() - 5 * Poin,0,0); if(ph > 0) { ph=OrderClose(OrderTicket(),OrderLots() / 2,Bid,10); GlobalVariableDel(Symbol()+"_TP_1"); GlobalVariableDel(Symbol()+"_Remote_Sell_TP1"); GlobalVariableSet(Symbol()+"_Remote_Sell_TP2",1); } } } } } } ///////Takeprofit 2 void TakeProfit2() { //Buy for (int h = 0; h < OrdersTotal(); h++) { ph=OrderSelect(h, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol() && (OrderMagicNumber() == Magic)) { if(OrderType() == OP_BUY) { if(Bid > GlobalVariableGet(Symbol()+"_TP_2") && GlobalVariableGet(Symbol()+"_Remote_Buy_TP2") == 1) { ph=OrderModify(OrderTicket(),OrderOpenPrice(),GlobalVariableGet(Symbol()+"_TP_2"),GlobalVariableGet(Symbol()+"_TP_3"),0,0); GlobalVariableDel(Symbol()+"_TP_2"); GlobalVariableDel(Symbol()+"_TP_3"); GlobalVariableDel(Symbol()+"_Remote_Buy_TP2"); } } } } //Sell for (int k = 0; k < OrdersTotal(); k++) { ph=OrderSelect(k, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol()==Symbol() && (OrderMagicNumber() == Magic)) { if(OrderType() == OP_SELL) { if(Ask < GlobalVariableGet(Symbol()+"_TP_2") && GlobalVariableGet(Symbol()+"_Remote_Sell_TP2") == 1) { ph=OrderModify(OrderTicket(),OrderOpenPrice(),GlobalVariableGet(Symbol()+"_TP_2"),GlobalVariableGet(Symbol()+"_TP_3"),0,0); GlobalVariableDel(Symbol()+"_TP_2"); GlobalVariableDel(Symbol()+"_TP_3"); GlobalVariableDel(Symbol()+"_Remote_Sell_TP2"); } } } } } Noch eine Frage (die euch wahrscheinlich ein müdes Lächeln abringt, aber ich bin Programmier-Autodidakt ) Ich nutze bei vielen Funktionen als double die Variable "ph" (= Platzhalter ), da mich die ständigen Fehlermeldungen/Hinweise beim Kompilieren gernervt haben. Nutzt ihr für sowas immer unterschiedliche Variablen, oder händelt ihr das ähnlich? VG Bucardo |
Lesezeichen |
Stichworte |
mql4, ordermodify, ordermodify problem, programmierung, programmierung metatrader |
|
|