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: 4973
Beiträge: 43248
Benutzer: 7.219
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: Hopfen&Malz
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107
vor 2 Wochen
- rg-trader

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

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #11 (permalink)  
Alt 14.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Hallo, next user, - da bin ich wieder !

Gestern war ich noch recht optimistisch, was sich bis zum heutigen Tag allerdings in Grenzen hält. Der Code wurde entsprechend Deiner guten Hinweise "zig" mal geändert und läuft nach wie vor mit der alleinigen 1. Position reibungslos.
Sobald die 2. Position nun am Trail-Target geöffnet wird, gerät alles ein bisschen durcheinander ! Unmittelbar nach Eröffnung der 2. Position werden sofort alle Positionen geschlossen; - ein erster SL wird gar nicht erst initiiert, geschweige denn nachgezogen. Einfach nur die Glattstellung am Trail-Target !
Hier nochmals der gesamte Code (für SELL):

Code:
//--- SELL -------------------------+
   if (OrderType() == OP_SELL  &&  (openOrders == 1  ||  openOrders == 2))
      {
      if (Ask < OrderOpenPrice() - Trail_Target_1 *100 * Point)
         {
         if (OrderStopLoss() == 0  ||  OrderStopLoss() > Ask + TSL)
            {
            if (!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
               Print("Error setting Buy trailing stop: ", GetLastError());
            }
         }
      } 
   if (OrderType() == OP_SELL  &&  openOrders == 2)
      {
      if (Ask >= OrderStopLoss())
         {  
          CloseAllOrders();
         }
      }
U.a. habe ich die Zeile mit dem Trail-Target einfach deaktiviert. In diesem Falle wird der SL tatsächlich gesetzt und im richtigen Abstand nachgezogen. Problematisch hierbei ist nur, dass das Trailing zu früh beginnt und anstatt "CloseAllOrders()" wieder nur die 2. Position geschlossen wird. - Irgendwie scheinen sich "CloseAllOrders()" und "Trail-Target" absolut nicht zu mögen.

Nachdem ich den logischen Ablauf des Codes mehrmals nachzuvollziehen versuchte und den Fehler einfach nicht finden kann, würde ich mich über eine nochmalige Hilfestellung, - von wem auch immer, - sehr freuen.

Ganz LG. piptrade
  #12 (permalink)  
Alt 14.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Was mir gerade noch eingefallen ist:

Könnte es sein, dass nach dem "OrderModify" ein "return" eingefügt werden muss ? (Kleine Ursache, - große Wirkung ?)

Oder anders herum gefragt:
Gibt es ohne Rückgabewert überhaupt eine "OrderStopLoss()", eine "OrderStopLoss()", die innerhalb einer ergänzenden if-Bedingung zum Tragen kommt und so die Funktion "CloseAllOrders()" auslöst ?

Code:
//--- SELL -------------------------+ 
   if (OrderType() == OP_SELL  &&  (openOrders == 1  ||  openOrders == 2))
      {
      if (Ask < OrderOpenPrice() - Trail_Target_1 *100 * Point)
         {
         if (OrderStopLoss() == 0  ||  OrderStopLoss() > Ask + TSL)
            {
            if (!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
               Print("Error setting Buy trailing stop: ", GetLastError());
            }
            return;
         }
      }
   if (OrderType() == OP_SELL  &&  openOrders == 2  &&  Ask >= OrderStopLoss())
           {  
           CloseAllOrders();
           }
Angenommen, dieses "return" fehlt tatsächlich, an welcher Stelle müßte es dann korrekt eingesetzt werden? So, wie im oben eingefügten Code (für SELL) ?

LG. piptrade
  #13 (permalink)  
Alt 14.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Ein "return" müsste da jetzt nicht hin, dieses beendet ja nur die aktuelle Funktion und springt zum Aufruf zurück.
Wenn der Code nach "OrderModify()" Probleme macht, so muss da an den Bedingungen der Ausführung gearbeitet werden...

Wo hast du denn deinen Code untergebracht? Ein "return" würde, wenn überhaupt, dann nur bei einer eigenen Funktion sinn machen.

PS: Kannst du kurz mal sagen, was genau "Trail_Target" & "Trail_SL" für Werte haben.

Geändert von next user (14.03.18 um 19:14 Uhr)
  #14 (permalink)  
Alt 14.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

"Trail_Target" = 9 *100 *Point und "Trail_SL" = 5 *100 *Point (für DAX). Das Trailing soll also erst dann beginnen, wenn die Position bereits im Plus ist.

LG.
  #15 (permalink)  
Alt 14.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Mal ein kleines Beispiel:
(Davon ausgehend, das du immer nur 2 Orders offen hast...)
Code:
int   orderTicket1 = 0;
int   orderTicket2 = 0;

// Order eröffnen...
// ...
// ...

void OnTick()
{
   ...
   
   if(orderTicket1)
      updateSL(orderTicket1);
      
   if(orderTicket2)
      updateSL(orderTicket2);
   
   if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
   {
      if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
      {
         if(OrderType() == OP_BUY)
            OrderClose(orderTicket1,OrderLots(),Bid,3);
         else
            OrderClose(orderTicket1,OrderLots(),Ask,3);
      }
   }
   
   ...
}

void updateSL(int ticket)
{
   ResetLastError();

   if(OrderSelect(ticket,SELECT_BY_TICKET))
   {
      if(OrderType() == OP_BUY)
      {
         if(Bid - OrderOpenPrice() > Trail_Target *100 * Point)
         {
            if(OrderStopLoss() < Bid - TSL || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
                  Print("Error setting Buy trailing stop: ", GetLastError());
            }
         }
      }
      else if(OrderType() == OP_SELL)
      {
         if(OrderOpenPrice() - Ask > Trail_Target *100 * Point)
         {
            if(OrderStopLoss() > Ask + TSL || OrderStopLoss() == 0)
            {
               if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
                  Print("Error setting Sell trailing stop: ", GetLastError());
            }
         }
      }
   }
}
"OrderClose(...)" ist hier nur im Beispiel. Kannst hier auch deine "CloseAllOrders()" aufrufen, wobei bei 2 Positionen ja
eh nur eine übrig bleibt und geschlossen werden muss.
  #16 (permalink)  
Alt 14.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Jedes Argument ist absolut richtig ! DANKE !!!

Die Codehinweise gehe ich morgen in aller Ruhe durch. Letztendlich möchte ich auch wieder einiges dazulernen. Dazu muss ich aber auch jeden Schritt verstehen und interpretieren können. Step by step.

Dennoch ganz, ganz herzlichen Dank, dass Du mich "nicht im Regen stehen läßt".

Melde mich so schnell, wie möglich, - bis bald.

LG. piptrade
  #17 (permalink)  
Alt 14.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Von der Neugierde getrieben habe ich mir Deine Code-Intensionen schon einmal angesehen, - und .... ??? - Alles scheinbar absolut TOP !
Dennoch, geht das nicht auch etwas einfacher ?
Diese "blöde" 1. Position muss sich ggf. doch auch einfacher schließen lassen. Oder liege ich da "schief" ?

LG.
  #18 (permalink)  
Alt 15.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von piptrade Beitrag anzeigen
Dennoch, geht das nicht auch etwas einfacher ?
Diese "blöde" 1. Position muss sich ggf. doch auch einfacher schließen lassen. Oder liege ich da "schief" ?
Ist doch recht einfach gehalten
Code:
if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
{
   if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
   {
      if(OrderType() == OP_BUY)
         OrderClose(orderTicket1,OrderLots(),Bid,3);
      else
         OrderClose(orderTicket1,OrderLots(),Ask,3);
   }
}
Die erste "OrderSelect()" ist nur "true", wenn die zweite Order in der History ist, also schon geschlossen wurde.
Dann wird mit dem zweiten "OrderSelect()" die andere Order selektiert und geschlossen.

Hab jedoch noch ne Kleinigkeit vergessen:
Code:
if(orderTicket1 && orderTicket2)
{
   if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
   {
      if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
      {
         if(OrderType() == OP_BUY)
            OrderClose(orderTicket1,OrderLots(),Bid,3);
         else
            OrderClose(orderTicket1,OrderLots(),Ask,3);
            
         orderTicket1 = 0;
         orderTicket2 = 0;
      }
   }
}
Den Code dann noch evtl. optimieren bzgl. Schließungsgrund & Ordertyp, ect.
  #19 (permalink)  
Alt 15.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Ohah..., Du bist meinen ersten Fragen zuvorgekommen. Thanks.
Dennoch schicke ich diese Zeilen zwecks der besseren Verständigung und werde mich anschließend sofort mit Deinem neuen Beitrag beschäftigen. Bis hierher erst einmal Danke, Danke, Danke!

//---

Hallo next user,

die Grundidee und die Abfolge Deines Codes glaube ich (zumindest im Groben) verstanden zu haben. Dennoch ist DAS für mich "ein ganz schöner Brocken", den es erst einmal "zu verdauen" gilt. Also:

//---

Im 1. Code-Block sollen SL_updates der 1. und der 2. Position erfragt werden - dann wird festgestellt, ob wir uns in der Pos.2 befinden und dann, ob es eine Pos.1 gibt. Ist das alles so weit richtig, wird OP_BUY erfragt und sollte OP_BUY vorliegen, wird Pos.1 mit Bid geschlossen ---> anderenfalls wäre es eine OP_SELL, die mit Ask geschlossen wird. So weit ok..

Wenn ich jetzt allerdings kompelliere, = 2 warnings: "Der Rückgabewert von 'OrderClose' sollte aktiviert sein !"
Dem entsprechend habe ich "return;" ergänzt, was allerdings nicht weitergeholfen hat; - die warnings bleiben bestehen ! Wie könnte ich diese "warnings" beheben ?

Zum 2. verstehe ich nicht ganz, was anstelle Deiner 3 Punkte eingesetzt werden muss. Oben vermutlich: "if(OrderSelect(ticket,SELECT_BY_TICKET)== true)" oder ähnlich. Ist das richtig ? ... und unten ?

//---

Im 2. Code-Block werden dann die SL_updates (Trail_SLs), einmal für BUY und einmal für SELL, erstellt. Hier verstehe ich den Part "ResetLastError();" nicht ganz. Soll hiermit eine letzte Fehlermeldung eliminiert werden ? Könntest Du den Grund und die Auswirkung kurz erläutern ?

//---

Bis hierher erst einmal ein ganz, ganz herzliches DANKESCHÖN ! Allein die von Dir gewählte Herangehensweise war "Neuland", hat meinen Horizont aber um einiges erweitert; - DANKE !

Voller Spannung/Anspannung hoffe ich auf Deine baldige Antwort.

LG.

PS.: Ich melde mich, sobald ich mir ALLES angesehen und halbwegs "verdaut" habe.
  #20 (permalink)  
Alt 15.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Bin grad am (späten) Frühstücken, also verdauen wir es mal gemeinsam

Zitat:
Zitat von piptrade Beitrag anzeigen
Im 1. Code-Block sollen SL_updates der 1. und der 2. Position erfragt werden...
Jap. Wie du weißt, erfragt ein "if", ob etwas "true oder false" ist. Dabei sind die nummerischen Werte dafür 0(false) und alles ungleich 0(true).
Dies ermöglicht auch den Code
Code:
if(orderTicket1)
   updateSL(orderTicket1);
   
if(orderTicket2)
   updateSL(orderTicket2);
Wenn "orderTicket1 / 2" immer noch "0" sind, so ist es "false" und "updateSL()" wird nicht aufgerufen.
Enthalten sie hingegen eine Zahl ungleich "0"(Ticketnummer), wird "updateSL()" aufgerufen und der SL ggf. nachgezogen.

=== === === === === === === === === === === ===

Zitat:
Zitat von piptrade Beitrag anzeigen
... dann wird festgestellt, ob wir uns in der Pos.2 befinden und dann, ob es eine Pos.1 gibt. Ist das alles so weit richtig, wird OP_BUY erfragt und sollte OP_BUY vorliegen, wird Pos.1 mit Bid geschlossen ---> anderenfalls wäre es eine OP_SELL, die mit Ask geschlossen wird. So weit ok..
Nicht ganz. Ob wir uns in einer Position befinden wird ja nicht festgestellt, sondern wir legen es mit "OrderSelect()" fest.
Der Code
Code:
// 1  if(orderTicket1 && orderTicket2)
      {
// 2     if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
         {
// 3        if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
            {
// 4           if(OrderType() == OP_BUY)
                  OrderClose(orderTicket1,OrderLots(),Bid,3);
               else
                  OrderClose(orderTicket1,OrderLots(),Ask,3);
                  
// 5           orderTicket1 = 0;
               orderTicket2 = 0;
            }
         }
      }
  1. Hier wird abgefragt, ob die beiden Variablen "true (ungleich 0)" sind, also quasi einen Ticket beinhalten.
  2. Hier wird versucht das Ticket der zweiten Order in der "MODE_HISTORY", also in der Historie der
    abgelaufenen / geschlossenen Orders zu finden und die entsprechende Order zu selektieren.
  3. Punkt 2 wird also nur "true", wenn die zweite Order (die mit dem TSL) geschlossen wurde.
    Erst dann kommen wir zu diesem Punkt 3, wo wir die verbleibende Order selektieren.
  4. Wie du bereits richtig geschrieben hast, fragen wir hier den Ordertyp der gerade selektierten Order ab und
    schließen sie entsprechend mit Bid oder Ask.
  5. Dieser Punkt ist wichtig. Da beide Orders jetzt geschlossen wurden, müssen wir die Variablen mit den Ticketnummern
    wieder auf "0" setzen, damit Punkt 1 und auch die Abfrage für "updateSL()" nicht mehr "true" ergeben.

=== === === === === === === === === === === ===

Zitat:
Zitat von piptrade Beitrag anzeigen
Wenn ich jetzt allerdings kompelliere, = 2 warnings: "Der Rückgabewert von 'OrderClose' sollte aktiviert sein !"
Dem entsprechend habe ich "return;" ergänzt, was allerdings nicht weitergeholfen hat; - die warnings bleiben bestehen ! Wie könnte ich diese "warnings" beheben ?
Bevor irgendwas behoben werden kann, muss verstanden werden, was die Meldung sagt. Diese sagt einfach "Hey, OrderClose() liefert
einen Rückgabewert. Und da es keine unbedeutene Funktion ist, solltest du den Rückgabewert abfangen und nachschauen,
ob deine Order geschlossen werden konnte, oder es einen Fehler gab."
Ein "return" hat da nichts verloren. Würdest du dort ein "return" setzen, so springst du an der Stelle aus "OnTick()" raus.

Beheben kannst du diese Warnings also, indem du den Rückgabewert abfängst. Ich habe den Code "auf die schnelle" geschrieben
und das ausgelassen. Ein Beispiel könnte so aussehen
Code:
if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
   Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
else
   Print("BIN ZU !!!");
=== === === === === === === === === === === ===

Zitat:
Zitat von piptrade Beitrag anzeigen
Zum 2. verstehe ich nicht ganz, was anstelle Deiner 3 Punkte eingesetzt werden muss.
Welche drei Punkte? Meinst du in meinem Post hier:
Zitat:
Zitat von next user Beitrag anzeigen
"OrderClose(...)" ist hier nur im Beispiel.
Damit hab ich einfach nur dargestellt, das "OrderClose(...)" Parameter hat. Wie du in meinen anderen Posts sehen kannst,
mach ich das manchmal, manchmal nicht.
Anstelle dieser Punkte musst du nichts einsetzen. Lies den Satzt nochmal und du wirst verstehen, das ich lediglich gesagt habe, das
du anstelle von "OrderClose(...) / ()" auch deine Funktion "CloseAllOrders()" nutzen kannst.

=== === === === === === === === === === === ===

Zitat:
Zitat von piptrade Beitrag anzeigen
Im 2. Code-Block werden dann die SL_updates (Trail_SLs), einmal für BUY und einmal für SELL, erstellt.
Und auch geupdatet.

Zitat:
Zitat von piptrade Beitrag anzeigen
Hier verstehe ich den Part "ResetLastError();" nicht ganz. Soll hiermit eine letzte Fehlermeldung eliminiert werden? Könntest Du den Grund und die Auswirkung kurz erläutern ?
Jap. damit setzt du "GetLastError()", genauer die Variable "_LastError" zurück, damit er beim nächsten Aufruf nicht ggf. den alten
Code in ihr ausgibt. Du kannst es allerdings getrost vergessen. Das betrifft nur MQL5, weil dort die Variable nach "GetLastError()"
nicht wieder auf 0 zurückgesetzt wird. Ist wegen MQL5 halt ne Angewohnheit von mir. Einfach vergessen...

=== === === === === === === === === === === ===

Das "else" bei der Orderprüfung habe ich so gesetzt, da ich davon ausgegangen bin, das beide Orders aktiv sind.
Falls das nicht (immer) der Fall ist, die erste Order bei der Schließung der zweiten also noch "Pending" sein kann, so solltest du
im Code vielleicht noch ergänzen:
Code:
if(OrderType() == OP_BUY)
{
   if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
      Print("BUY-Order konnte nicht geschlossen werden, weil: ", GetLastError());
   else
      Print("BIN ZU !!!");
}
else if(OrderType() == OP_SELL)
{
   if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
      Print("SELL-Order konnte nicht geschlossen werden, weil: ", GetLastError());
   else
      Print("BIN ZU !!!");
}
else
{
   // Wenn Order noch Pending, dann OrderDelete() und NICHT OrderClose() !!!
   OrderDelete(orderTicket1);
}
Thema geschlossen

Lesezeichen

Stichworte
alle order schließen, closeallorders, mql4, programmierung, programmierung metatrader, programmierung mql4, trailingstop

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 19:42 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.
-----------------------------------------------------------------------------------------------------------------------------