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)
-   -   "CloseAllOrders" am SL einer 2. Position (http://www.expert-advisor.com/forum/showthread.php?t=6038)

piptrade 12.03.18 18:09

"CloseAllOrders" am SL einer 2. Position
 
Liebe Trader, liebe User-Gemeinde,
seit geraumer Zeit komme ich einfach nicht weiter und würde mich über Eure Unterstützung sehr freuen.

Das Problem:
Eine 1. Position wird eröffnet und mit einem Trailing_Stop ausgestattet. Hier funktioniert der nachfolgende Code:
Code:

    double TSL = Trail_SL *100 *Point;
 
//--- Trailing_SL for order type BUY --------------------------------+
  if (OrderType() == OP_BUY  &&  openOrders == 1)
      {
      if (Bid - OrderOpenPrice() > Trail_Target *100 * Point)          //  Trail_Target = Trailing begin
        {
        if (OrderStopLoss() < Bid - TSL  ||  OrderStopLoss() == 0) 
            {
            if (!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
              Print("Error setting Buy trailing stop: ", GetLastError());
            }
        }
      }

Wird nun eine 2. Position zusätzlich eröffnet, sollen an dessen Trailing_Stop BEIDE Positionen glattgestellt werden. Also habe ich den Code der 1. Position übernommen und lediglich mit "CloseAllOrders" ergänzt:
Code:

    if (OrderType() == OP_BUY  &&  openOrders == 2)
      {
      if (Bid - OrderOpenPrice() > Trail_Target *100 * Point)
        {
        if (OrderStopLoss() == 0  ||  OrderStopLoss() < Bid - TSL)
            {
            if (!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
                Print("Error setting Buy trailing stop: ", GetLastError());
         
                CloseAllOrders();
            }                       
        }
      }

Obwohl mir der o.a. Ansatz logisch erscheint, funktioniert der Code nicht, wie gewünscht. Ist "CloseAllOrders" falsch eingeordnet, muss ich zusätzliche Bedingungen schaffen?
Würde mich über Eure Hilfestellung sehr freuen.

LG. piptrade

AVT 12.03.18 20:53

Das fällt mir auf die Schnelle dazu ein:
Zitat:

sollen an dessen Trailing_Stop BEIDE Positionen glattgestellt werden
An wessen Trailing_Stop? Von der 1. Position? der ändert sich doch mit jedem Pips und Paps, dazu müßtest Du einen Weg finden, die Position des TS auszulesen (dazu brauchst Du die Ticket Nummer, damit Du auch die richtige Position erwischt).
Irgendwie verstehe ich aber noch nicht ganz, wie Deine beiden Position laufen, etwa so: 1. Position eröffnet mit TS und läuft, 5 Min später 2. Position eröffnet mit TS und läuft hinterher - wenn 2. Position den TS der ersten einholt, alles zumachen?

piptrade 13.03.18 09:50

Hallo AVT,
herzlichen Dank für Dein schnelles Statement. An Hand der Antworten merkt man erst einmal, was man ggf. falsch erläutert hat und wie präzise die deutsche Sprache ist.

Zitat:

sollen an dessen Trailing_Stop BEIDE Positionen glattgestellt werden
Hier war "dessen" natürlich falsch; - "deren" (der 2. Position nämlich) wäre hier richtig gewesen !

Unabhängig von allen strategischen Überlegungen und allen "Pips und Paps" (wäre zu umfangreich) hier nochmals eine kurze Erläuterung, was ich eigentlich will:
Es sind 2 Positionen geöffnet (die 1. Pos. ohne TP und ohne SL) und die 2. Position läuft in den TS. Genau an dieser Stelle sollen nun BEIDE Positionen geschlossen werden.
Der Code soll einfach nur BEIDE Positionen schließen, falls die 2. Position den TS erreicht. Deshalb der "Einbau" "CloseAllOrders" unter ---> if (openOrders() == 2).

LG. piptrade

next user 13.03.18 11:48

Zitat:

Zitat von piptrade (Beitrag 40526)
Es sind 2 Positionen geöffnet (die 1. Pos. ohne TP und ohne SL)

Klang beim Anfangspost aber noch etwas anders:
Zitat:

Zitat von piptrade (Beitrag 40516)
Eine 1. Position wird eröffnet und mit einem Trailing_Stop ausgestattet.

Mal nebenbei, wenn die Bedingungen relativ gleich sind, so lieber immer zusammenfügen. Dein Code würde dann so aussehen:
Code:

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());
           
        if(openOrders == 2)
            CloseAllOrders();
      }
  }
}

Wie sieht denn deine "CloseAllOrders()" aus? Das "funktioniert nicht wie gewünscht" kommt vielleicht daher, das du ERST
den TrailingStop der zweiten Order mit "OrderModify()" aktualisierst, direkt danach dann aber "CloseAllOrders()" aufrufst.

piptrade 13.03.18 12:49

Hallo, next user,

der Zitate-Widerspruch resultiert daraus, dass ich alles etwas zu vereinfachen versuche, um am Kern des Problems ein Stückchen weiterzukommen.
Zum Zweiten: Das Zusammenfügen beider Code-Bestandteile bei gleichzeitiger Ergänzung der Ausnahme (if (openOrders == 2)) ist ein guter Hinweis. Werde ich so anwenden.
Und zum 3.: "CloseAllOrders()" sollte soweit richtig sein, da es an mehreren Stellen des EA angewendet wird und dort gut funktioniert. Was aber wichtig zu sein scheint ist die Tatsache, dass ich den Trail_SL mit "OrderModify()" aktualisiere, sofort danach aber "CloseAllOrders()" aufrufe. Damit kann ein Modify bestenfalls nur 1 x erfolgen.
Wäre dann die nachfolgende Code-Ergänzug möglich und sinnvoll ? ("CloseAllOrders()" soll ja erst dann stattfinden, wenn der modifitierte Trail_SL durchbrochen wird.)

Code:

if(OrderStopLoss() < Bid - TSL || OrderStopLoss() == 0)
      {
        if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
            Print("Error setting Buy trailing stop: ", GetLastError());
           
        if(openOrders == 2  &&  Bid == OrderStopLoss())  //  <==========
            CloseAllOrders();
      }

Vielleicht gibt es aber auch hier eine bessere Lösung ? Vorab schon einmal ein herzliches DANKESCHÖN und

LG. piptrade

next user 13.03.18 13:12

Zitat:

Zitat von piptrade (Beitrag 40537)
"CloseAllOrders()" soll ja erst dann stattfinden, wenn der modifitierte Trail_SL durchbrochen wird.

Das geht ja aber schlecht, wenn du "CloseAllOrders()" im selben if aufrufst, der NUR DANN aufgerufen wird, wenn der Kurs entsprechend in die
andere Richtung läuft und ein Nachziehen des StopLoss nötig wird.

piptrade 13.03.18 13:41

Hallo, next user,

richtig, der Trail_SL soll natürlich nachgezogen werden. Verläuft der Kurs dann aber in die entgegengesetzte Richtung, verbleibt der Trail_SL an seiner letzten Stelle, wo er u.U. gebrochen wird. Und erst dann soll CloseAllOrders() erfolgen.
Also müssen neue, separate if-Bedingungen geschaffen werden:

Code:

  {
      if(OrderStopLoss() < Bid - TSL || OrderStopLoss() == 0)
        {
        if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
            Print("Error setting Buy trailing stop: ", GetLastError());
        {
    if(openOrders == 2  &&  OrderStopLoss != 0)
        {           
        if(Bid == OrderStopLoss()
            CloseAllOrders();
        }

      }
  }

So könnte der Trailing-Part ungestört laufen und erst, wenn unter einem separatem "if" "Bid == OrderStopLoss()" ist, erfolgt "CloseAllOrders()".
Kommen wir so der Lösung etwas näher ?

LG. piptrade

next user 13.03.18 13:59

Ich würde Schwankungen immer im Code beachten, das heißt kein "==" sondern
Code:

if(Bid <= OrderStopLoss())

piptrade 13.03.18 14:04

Ohhh, sorry,
ich hatte nicht kompelliert. So sollte es etwas richtiger sein !

Code:


      {
        if (OrderStopLoss() == 0  ||  OrderStopLoss() < Bid - TSL) 
            {
            if (!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
                Print("Error setting Buy trailing stop: ", GetLastError());
            }
        if (openOrders == 2  &&  OrderStopLoss() != 0)
            {           
            if (Bid == OrderStopLoss())
                CloseAllOrders();

            }
        }

In banger Hoffnung nochmals
LG. piptrade

piptrade 13.03.18 14:19

Das <= gefällt mit gut ! (hatte ich vorher auch schon `mal, - allerdings mit den anfänglich falschen if-Bedingungen)

Im Moment bin ich recht zuversichtlich, werde den Code jetzt testen.
Somit vorab recht herzlichen Dank; - ich melde mich noch einmal, wenn alles funktioniert (- oder auch, wenn nicht!)

LG. piptrade


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:54 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