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)
-   -   Problem mit OrderModify (http://www.expert-advisor.com/forum/showthread.php?t=5193)

Bucardo 01.10.16 20:33

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");
    }
  }
  }
 }
}


traderdoc 01.10.16 22:44

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

JoeDormann 02.10.16 00:08

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

Bucardo 02.10.16 18:13

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");
    }
  }
  }
 }
}

Der Übersichtlichkeit halber habe ich eine Trennung zwischen der Breakeven-Funktion und der TakeProfit2-Funktion vorgenommen. Für Kritik bin ich jederzeit offen :)

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 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