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.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3425
Beiträge: 34291
Benutzer: 5.466
Aktive Benutzer: 639
Links: 79
Wir begrüßen unseren neuesten Benutzer: albertodlb
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 6 Stunden
- albertodlb
vor 17 Stunden
- GuitarMike...
vor einem Tag
- Chartist
vor 2 Tagen
- RedBaron
vor 2 Tagen
- djcorna

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 34
Gesamt: 35
Team: 0
Team:  
Benutzer:  traderdoc
Freunde anzeigen

Empfehlungen

Werbung

Like Tree2Likes
  • 1 Post By traderdoc
  • 1 Post By JoeDormann
Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 01.10.16
Neues Mitglied
 
Registriert seit: Nov 2014
Beiträge: 26
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");
    }
   }
  }
 }
}
Mit Zitat antworten
  #2 (permalink)  
Alt 01.10.16
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.572
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.
Mit Zitat antworten
  #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.
Mit Zitat antworten
  #4 (permalink)  
Alt 02.10.16
Neues Mitglied
 
Registriert seit: Nov 2014
Beiträge: 26
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
Mit Zitat antworten
Antwort

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 00:40 Uhr.



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