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: 4972
Beiträge: 43246
Benutzer: 7.217
Aktive Benutzer: 85
Links: 84
Wir begrüßen unseren neuesten Benutzer: DFeck
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einer Stunde
- DFeck
vor 2 Tagen
- bb1107
vor einer Woche
- rg-trader
vor 2 Wochen
- toshistyle
vor 2 Wochen
- Robin

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

Empfehlungen

Like Tree2Likes
  • 1 Post By traderdoc
  • 1 Post By JoeDormann
Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 01.10.16
Mitglied
 
Registriert seit: Nov 2014
Beiträge: 31
Bucardo befindet sich auf einem aufstrebenden Ast
Standard 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");
    }
   }
  }
 }
}
  #2 (permalink)  
Alt 01.10.16
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.732
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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
Bucardo likes this.
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #3 (permalink)  
Alt 02.10.16
Gesperrter Benutzer
 
Registriert seit: Sep 2011
Ort: Kassel
Beiträge: 749
JoeDormann befindet sich auf einem aufstrebenden Ast
JoeDormann eine Nachricht über Skype™ schicken
Smile

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 likes this.
  #4 (permalink)  
Alt 02.10.16
Mitglied
 
Registriert seit: Nov 2014
Beiträge: 31
Bucardo befindet sich auf einem aufstrebenden Ast
Standard

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
Thema geschlossen

Lesezeichen

Stichworte
mql4, ordermodify, ordermodify problem, programmierung, programmierung metatrader

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 +1. Es ist jetzt 11:01 Uhr.





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