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

piptrade 14.03.18 11:59

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

piptrade 14.03.18 18:56

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

next user 14.03.18 19:02

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.

piptrade 14.03.18 19:39

"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.

next user 14.03.18 20:24

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.

piptrade 14.03.18 21:13

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

piptrade 14.03.18 21:32

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.

next user 15.03.18 04:01

Zitat:

Zitat von piptrade (Beitrag 40571)
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.

piptrade 15.03.18 11:24

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.

next user 15.03.18 12:55

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

Zitat:

Zitat von piptrade (Beitrag 40574)
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 40574)
... 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 40574)
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 40574)
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 40566)
"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 40574)
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 40574)
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);
}


piptrade 15.03.18 16:41

Hallo, lieber next user,

bin in den vergangene Stunden tatsächlich nochmals ALLES durchgegangen, habe den Code entsprechend den aktuellen Gegebenheiten ergänzt und noch unverstandene Details markiert (red). Mit nachfolgendem Resultat:

Code:

int  orderTicket1 = 0;
int  orderTicket2 = 0;

void ChekTicket(int ticket)  //  mein Versuch == ohne error  //  ????
//void OnTick()              //  deaktiviert, da error: 'OnTick' - function already defined and has body


{
  if(OrderSelect(ticket,SELECT_BY_TICKET)== true)  //  meine Ergänzug  //  ????

  if(orderTicket1)
      updateSL(orderTicket1);
     
  if(orderTicket2)
      updateSL(orderTicket2);


if(orderTicket1 && orderTicket2)
  {
  if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
      {
      if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
        {
        if(OrderType() == OP_BUY)
        {
            if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
              Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
            else
              Print("BIN ZU !!!");
        }
      else if (OrderType() == OP_SELL)
        {

            if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
              Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
            else
              Print("BIN ZU !!!");
        }

        orderTicket1 = 0;
        orderTicket2 = 0;
        }
      }
  }
}

void updateSL(int ticket)
{
  ResetLastError();

  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {
      if(OrderType() == OP_BUY  &&  (openOrders == 1  ||  openOrders == 2))
      {
        if(Bid - OrderOpenPrice() > Trail_Target_1 *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  &&  (openOrders == 1  ||  openOrders == 2))
      {
        if(OrderOpenPrice() - Ask > Trail_Target_1 *100 * Point)
        {
            if(OrderStopLoss() > Ask + TSL || OrderStopLoss() == 0)
            {
              if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
                  Print("Error setting Sell trailing stop: ", GetLastError());
            }
        }
      }
  }
}

So, wie o.a., erscheinen nach der Kompellierung keine errors und warnings !!! SUUUPER !!!
Dennoch gibt es sicher 2 - 3 "Ungereimtheiten" (meine Ergänzungen), die geprüft und ggf. bereinigt werden sollten.
In der Hoffnung auf Deine nochmaligen Denkanstöße

der ungeduldige, spannungsgeladene piptrade



PS.: Und wieder warst Du schneller ! Dieses mal habe ich mir Deinen post jedoch schon angesehen und die Ergänzungen bereits integriert.
Ich bin begeistert !
Darüber hinaus ist es einfach "Spitze", DASS Du und WIE Du die einzelnen Details "auseinandernimmst" und erläuternd darauf eingehst. Sicher werde ich noch einige Zeit brauchen, bis jede Erklärung auch bei mir in "Fleisch und Blut" übergegangen ist, dennoch habe ich schon bis hier her eine Menge dazugelernt.
Wenn jetzt noch die letzten kleinen Unsicherheiten ausgeräumt werden könnten, wäre die Welt endlich wieder in Ordnung.

DANKE für Deinen tollen Einsatz ! pt

next user 15.03.18 19:45

Zitat:

Zitat von piptrade (Beitrag 40577)
Code:

void ChekTicket(int ticket)  //  mein Versuch == ohne error  //  ????
//void OnTick()              //  deaktiviert, da error: 'OnTick' - function already defined and has body


Der Error liegt darin, dass du offensichtlich eine weitere Funktion "OnTick()" erstellt hast. Vermutlich hast du meinen Code mit
eben der OnTick-Angabe übernommen.

Ich dachte, dir wäre klar, wie ich es gemeint habe. "OnTick()" ist ja eine "hauseigene" Funktion eines EA's. Mit meinem Code
hatte ich nur angegeben, das der Code (in meinem OnTick) in die Funktion "OnTick gehört".

Also kurz nochmal:
  • In meinem Code ist nur die Funktion "updateSL()" eine eigens erstellte.
  • "OnTick()" ist, genau wie z.B. die Funktion "OnInit()", "OnDeinit()". "OnTimer()" oder "OnChartEvent()" Bestandteil
    eines EA's.
  • Das, was in meiner "OnTick()" im Code steht, gehört in deine vorhandene "OnTick()".
  • "OnTick()" ist die Funktion, die bei jedem neuen Tick aufgerufen wird. Und genau da soll der
    Code rein.

piptrade 16.03.18 12:45

Lieber next user, Hallo !

Da hast Du absolut recht; - dieses "OnTick()" wurde tatsächlich, ohne grassartig nachzudenken, übernommen. Damit war natürlich
ein "OnTick()" zuviel im Code und mußte als "error" ausgewiesen werden. Sorry, mein Fehler.

Was die Unterscheidung zwischen "hauseigenen" und "persönlichen" Haupt-Funktionen eines EA betrifft, bin ich mir der Differenzierung
bewußt. Dennoch habe ich auch hierzu nachfolgende Frage:

Nach Initialisierung und Deklaration von Parametern, nach "void OnInit()" und "void DeInit()" beginnt irgendwann auch der Abschnitt "void OnTick()". So der "hauseigene" Funktionsablauf. Alle in diesen letzten 2 Klammern stehenden Operationen werden also per Tick durchlaufen.
Innerhalb meines Codes wurde die "OnTick()"-Funktion zwar richtig angelegt, fälschlicher Weise aber relativ zeitig wieder geschlossen. Es folgten weitere abgegrenzte Bereiche mit eigens kreierten, persönlichen "voids", die weitere Funktionen im EA abdecken. Auch diese Bereiche werden per Tick durchlaufen und funktionieren tadellos.
So wurde das Auslösen der "Trail_SL-Funktion" in einem Abschnitt "void TakeProfit()" untergebracht und wurde dort auch ohne Beanstandung ausgeführt !!! So weit zur Vorgeschichte.

Jetzt waren die in diesem Beitrag erarbeiteten Code-Bereiche A) "Schließen der 1. Position" und B) "updateSL" in den Gesamt-Code zu integrieren.
Bereich A): wurde nun unmittelbar an die "Trail_SL-Funktion" angehängt und "void TakeProfit()" auch erst hier per Klammer geschlossen.
Bereich B): hier funktionierte dieses Anhängen nicht; - hier sollte "Global deklariert" werden. Dem entsprechend habe ich die Funktion "updateSL" unmittelbar hinter der "OnTick()"-Funktion eingeordnet - und siehe da - keine errors !
Allerdings verblaßte diese erste Freude, als ich den ersten Test durchführte !
Ich bin exakt auf dem Stand von vor 5 Tagen. Irgend etwas scheint immer noch nicht zu stimmen.

Hier die Demonstration des "Eibaus", einschl. ausführlichen Code-Details:

Code:

void OnTick() {
     
// ...
 
//--- calculate open orders by current symbol --> and close by TP
  if (CalculateCurrentOrders(Symbol()) == 0) CheckForOpen();

//--- calculate open orders --> and opening a hedging position
  if (CalculateCurrentOrders(Symbol()) != 0) CheckHedgeOpen();
 
  CheckTakeProfit();
}
//---------------------------------------------------------------------------
void updateSL(int ticket)
{
  ResetLastError();

double TSL = Trail_SL *100 *Point;


  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {
      if(OrderType() == OP_BUY  &&  (openOrders == 1  ||  openOrders == 2))
      {
        if(Bid - OrderOpenPrice() > Trail_Target_1 *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  &&  (openOrders == 1  ||  openOrders == 2))
      {
        if(OrderOpenPrice() - Ask > Trail_Target_1 *100 * Point)
        {
            if(OrderStopLoss() > Ask + TSL || OrderStopLoss() == 0)
            {
              if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
                  Print("Error setting Sell trailing stop: ", GetLastError());
            }
        }
      }
  }
}
//-------------------
//--- mehrere eigene "voids"
//-------------------
void CheckTakeProfit();  {

//--- Bereich TakeProfit

//+==================================================================+
//|  Check for Trailing_StopLoss Conditions                          | 
//+==================================================================+ 
int    orderTicket1 = 0;
int    orderTicket2 = 0;
double TSL = Trail_SL *100 *Point;

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

//--- Schließen Ticket1 -------------------------
//    völlig NEU (next user)

  if(orderTicket1)
      updateSL(orderTicket1);
     
  if(orderTicket2)
      updateSL(orderTicket2);


if(orderTicket1 && orderTicket2)
  {
  if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
      {
      if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
        {
        if(OrderType() == OP_BUY)
        {
            if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
              Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
            else
              Print("BIN ZU !!!");
        }
      else if (OrderType() == OP_SELL)
        {

            if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
              Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
            else
              Print("BIN ZU !!!");
        }

        orderTicket1 = 0;
        orderTicket2 = 0;
        }
      }
  }
 }
 }  //  diese Klammer schließt nun den gesamten TP-Bereich

Was kann ich jetzt noch verändern, damit unsere Arbeit nicht umsonst war ? Vielleicht findest Du am WE ein bisschen Zeit
und entdeckst den verhängnisvollen "Haken" ? - Ich würde mich riesig freuen - und auch gegenüber den anderen usern wäre es ein "runder"
Beitrag.

Und wieder spannungsgeladen und ungeduldig - mit
ganz lb. Grüße pt.


PS.: Die Tests dauern ewig, da die 2. Pos. entweder gar nicht erreicht oder ergebnislos schon durch eine 3. Pos. abgelöst wird.
Somit "SORRY", dass ich mich nicht schneller melden konnte.

next user 16.03.18 19:18

Oh oh, ich glaub da ist bischen was an Verständnis verrutscht :D

Gehen wirs nochmal durch:
Code:

void OnTick()
{
  //--- calculate open orders by current symbol --> and close by TP
  if(CalculateCurrentOrders(Symbol()) == 0)
      CheckForOpen();
 
  //--- calculate open orders --> and opening a hedging position
  if(CalculateCurrentOrders(Symbol()) != 0)
      CheckHedgeOpen();
 
  CheckTakeProfit();
}

Die ersten beiden Funktionen kann ich nicht beurteilen. Hoffe die funktionieren wie gewollt.
Die dritte "CheckTakeProfit()" muss ich jetzt aber etwas auseinandernehmen:

Code:

void CheckTakeProfit();  {
Müsste bei dir eigentlich einen Fehler beim Kompilieren generieren. Das Semikolon gehört da nicht hin.

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

Code:

double TSL = Trail_SL *100 *Point;
Diese Variable brauchst du ja unabhängig der Funktion. Da bietet es sich doch an, diese global oben zu erstellen.

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

Code:

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

  • Das ist ja der Code, den ich in die "updateSL()" gepakt habe.
  • Ich finde, in "updateSL()" passt er namentlich besser rein, als "CheckTakeProfit()", oder? :D

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

Code:

//--- Schließen Ticket1 -------------------------
//    völlig NEU (next user)

if(orderTicket1)
updateSL(orderTicket1);

if(orderTicket2)
updateSL(orderTicket2);


if(orderTicket1 && orderTicket2)
{
  if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
  {
      if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
      {
        if(OrderType() == OP_BUY)
        {
            if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
              Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
            else
              Print("BIN ZU !!!");
        }
        else if (OrderType() == OP_SELL)
        {
            if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
              Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
            else
              Print("BIN ZU !!!");
        }
       
        orderTicket1 = 0;
        orderTicket2 = 0;
      }
  }
}

  • So, nachdem der Punkt zuvor vom Programm bearbeitet wurde, rufst du hier mit "updateSL()" erneut den gleichen Code auf.
  • Der Code gehört eigentlich in die "OnTick()", wie bereits erwähnt.

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

Code:

void updateSL(int ticket)
{
  ResetLastError();
 
  double TSL = Trail_SL *100 *Point;
 
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {
      if(OrderType() == OP_BUY  &&  (openOrders == 1  ||  openOrders == 2))
      {
        if(Bid - OrderOpenPrice() > Trail_Target_1 *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  &&  (openOrders == 1  ||  openOrders == 2))
      {
        if(OrderOpenPrice() - Ask > Trail_Target_1 *100 * Point)
        {
            if(OrderStopLoss() > Ask + TSL || OrderStopLoss() == 0)
            {
              if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
              Print("Error setting Sell trailing stop: ", GetLastError());
            }
        }
      }
  }
}

  • Die Variable "TSL" würde ich wie gesagt global oben definieren.
  • Sowohl hier, als auch im selben Code in der "CheckTakeProfit()" hast du den Code mit
    Code:

    (openOrders == 1  ||  openOrders == 2)
    erweitert. Was genau steckt dahinter? Was machen sie?

Eigentlich müsste dein Code ungefähr so aussehen:
Code:

// OBEN
int    orderTicket1 = 0;
int    orderTicket2 = 0;
double TSL = Trail_SL *100 *Point;
...

// In OnTick()
void OnTick()
{
  //--- calculate open orders by current symbol --> and close by TP
  if(CalculateCurrentOrders(Symbol()) == 0)
      CheckForOpen();
 
  //--- calculate open orders --> and opening a hedging position
  if(CalculateCurrentOrders(Symbol()) != 0)
      CheckHedgeOpen();
 
 
1  if(orderTicket1)
  updateSL(orderTicket1);
 
2  if(orderTicket2)
  updateSL(orderTicket2);
 
3  if(orderTicket1 && orderTicket2)
  {
      if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
      {
        if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
        {
            if(OrderType() == OP_BUY)
            {
              if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
                  Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
              else
                  Print("BIN ZU !!!");
            }
            else if (OrderType() == OP_SELL)
            {
              if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
                  Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
              else
                  Print("BIN ZU !!!");
            }
           
            orderTicket1 = 0;
            orderTicket2 = 0;
        }
      }
  }
}

// Die Funktion "updateSL()" außerhalb setzen.
// Der Code & die ganze Funktion "CheckTakeProfit()" sind unnötig.
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());
            }
        }
      }
  }
}

  • Die drei Variablen außerhalb, oben definieren.
  • OnTick():
    1. Ist "orderTicket1 != 0" dann in der Funktion "updateSL()" Bedingungen überprüfen und ggf. StopLoss anpassen.
    2. Ist "orderTicket2 != 0" dann in der Funktion "updateSL()" Bedingungen überprüfen und ggf. StopLoss anpassen.
    3. Ist "orderTicket1 && orderTicket2 != 0" dann in den folgenden Codezeilen schauen, ob Order2 geschlossen ist.
      Ist das der Fall, so Order1 schließen.
  • Der Code der Funktion "updateSL()" hat nichts in der "CheckTakeProfit()" zu suchen.
    Auch der andere Code in "CheckTakeProfit()" gehört nicht darein. Die Funktion ist somit unnötig!

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

Code:

}  //  diese Klammer schließt nun den gesamten TP-Bereich
Ironie des Schiksals: Eben diese Klammer ist eine Klammer zuviel!

piptrade 16.03.18 21:34

Lieber next user, Hallo!

Es ist einfach nur toll, dass Du mich nicht "auf die Folter spannst", sondern mir so schnell geantwortet hast. DANKE.
Dem entsprechend bin ich jedes Wort, jede Silbe und manchesmal sogar jeden Buchstaben durchgegangen und habe jeden Logikansatz nachvollzogen.

Deine Argumente sind absolut überzeugend !

Das, was zwischenzeitlich etwas durcheinandergeraten war, sollte jetzt wieder geradegerückt sein und in den richtigen Bahnen verlaufen.

Fast auf Anhieb "NULL error" !!! Schon DAS ist richtig gut ! ... Und wenn dann noch die Live-Tests am Mo. halbwegs klappen - ohhhh, dass wäre ... !

Lieber next user; - zwischendurch nochmals DANKE; - ich melde mich !
LG. pt.

PS.: ... und wenn dann der in diesem Thema ursprünglich gewünschte Part tatsächlich funktionsfähig ist, gebe ich mehr als nur gern, meine Empfehlung weiter !
Allein das "Hin und Her" der Diskussionen war lehrreich und hilft zumindest mir ein großes Stück weiter.

piptrade 17.03.18 17:54

Liste der Anhänge anzeigen (Anzahl: 2)
Lieber next user, nochmals Hallo!
Was in den letzten Tagen relativ schnell abgearbeitet wurde, kann ich heute "Revue passieren" lassen:

Zitat 1:
Zitat:

void CheckTakeProfit(); {
Müsste bei dir eigentlich einen Fehler beim Kompilieren generieren. Das Semikolon gehört da nicht hin.
Wie sich das Semikolon "eingeschlichen" hat, weiß ich nicht. Im Original-Code ist es zumindest NICHT enthalten.

Zitat 2:
Zitat:

double TSL = Trail_SL *100 *Point;
Diese Variable brauchst du ja unabhängig der Funktion. Da bietet es sich doch an, diese global oben zu erstellen.
Richtig ! Habe jetzt verschiedene Variablen dem laufenden Code entnommen und global deklariert.

Zitat 3:
Zitat:

... Code ...
Das ist ja der Code, den ich in die "updateSL()" gepakt habe.
Ich finde, in "updateSL()" passt er namentlich besser rein, als "CheckTakeProfit()", oder?
"CheckTakeProfit()" paßt natürlich überhaupt nicht ! Dennoch habe ich mich für "void CheckStopLoss()" entschieden:rolleyes:, um den Terminus der anderen Funktionen beizubehalten:).

Zitat 4:
Zitat:

... Code ...
So, nachdem der Punkt zuvor vom Programm bearbeitet wurde, rufst du hier mit "updateSL()" erneut den gleichen Code auf.
Der Code gehört eigentlich in die "OnTick()", wie bereits erwähnt.
Lapsus meinerseits;- sorry ! Er wird jetzt nur noch 1 x verwendet und sollte an der korrekten Stelle stehen.

Zitat 5:
Zitat:

Sowohl hier, als auch im selben Code in der "CheckTakeProfit()" hast du den Code mit
(openOrders == 1 || openOrders == 2)
erweitert. Was genau steckt dahinter? Was machen sie?
Sinn und Zweck ist, dass die Trailing-Order für Pos. 1 UND für Pos. 2 erfolgen soll (auch, wenn das im Moment nicht sehr einleuchtend ist). Rein strategisch ist es aber dennoch sinnvoll:cool:.

Zitat 6:
Zitat:

OnTick():
Ist "orderTicket1 != 0" dann in der Funktion "updateSL()" Bedingungen überprüfen und ggf. StopLoss anpassen.
Ist "orderTicket2 != 0" dann in der Funktion "updateSL()" Bedingungen überprüfen und ggf. StopLoss anpassen.
Ist "orderTicket1 && orderTicket2 != 0" dann in den folgenden Codezeilen schauen, ob Order2 geschlossen ist.
Ist das der Fall, so Order1 schließen.
Wie bereits erwähnt: Diese Herangehensweise ist einfach genial. Und jetzt, wo ich den Inhalt verstanden habe, - eine tolle, neue Erkenntnis.

Zitat 7:
Zitat:

Der Code der Funktion "updateSL()" hat nichts in der "CheckTakeProfit()" zu suchen.
O.k. ! - siehe oben: - ein Lapsus.

Zitat 8:
Zitat:

Auch der andere Code in "CheckTakeProfit()" gehört nicht darein. Die Funktion ist somit unnötig!
Ja und Nein ! Klar gehört der Code NICHT da hinein.
Die Funktion "CheckTakeProfit()" ist aber dennoch notwendig für eine 3., 4., 5. und 6. Order (DAX). Diese TPs werden "step by step" verkleinert, um eine 7. oder 8. Position möglichst auszuschließen. Hierzu wäre allerdings eine Strategie-Erläuterung sinnvoll, um das Gesamtanliegen des EA zu verstehen. 2 Anhänge sollen hierzu wenigstens eine kleinen Einblick vermitteln. (Bei näherem Interesse bitte einfach nachfragen;).)

And the last:
Zitat:

Code:
} // diese Klammer schließt nun den gesamten TP-Bereich
Ironie des Schicksals: Eben diese Klammer ist eine Klammer zuviel!
No comment ! Du sagst es !

So weit, so gut. Und wenn der gesamte Code dann etwas "aufgeräumt" und strukturiert ist, kann er sogar ästhetisch gut aussehen und "das Auge erfreuen"!

Dieses kleine "Zwischenspiel" war ich noch schuldig. Auch ein kleiner Einblick zur Wirkungsweise des EA und in die Performance gehören sicher dazu (siehe Anhänge).
Ansonsten werde ich mich am Mo. melden, um Erfolg oder Misserfolg meiner Tests zu verkünden.

Bis dahin, LG. pt.

piptrade 19.03.18 15:33

Hallo an alle user, die das Thema begleiten,
und natürlich ein Hallo an next user !

Mit Bangen hatte ich dem Moment entgegengesehen, der nun über Erfolg oder Misserfolg entscheiden würde: Die ersten
Tradingstunden der neuen Woche. Und um nicht lange drumherum zu reden, - der Code funktioniert NICHT !
Was könnte jetzt noch falsch sein ? "Sehe ich den Wald vor lauter Bäumen" nicht mehr?

Hier nochmals der vollständige Code:

Code:

int OnInit()
{
//--- calculate open orders by current symbol --> and close by TP
  if (CalculateCurrentOrders(Symbol()) == 0) CheckForOpen();

//--- calculate open orders --> and opening a hedging position
  if (CalculateCurrentOrders(Symbol()) != 0) CheckHedgeOpen();

//+==================================================================+
//|  Check for Trailing_StopLoss Conditions                          | 
//+==================================================================+ 

int    orderTicket1 = 0;
int    orderTicket2 = 0;

//--- Nachträgliches Schließen Ticket1 (Pos.1) ---------------------+
//    völlig NEU (next user) und innerhalb der "void OnTick"

  if (orderTicket1)
      TrailStopLoss(orderTicket1);
     
  if (orderTicket2)
      TrailStopLoss(orderTicket2);


  if(orderTicket1 && orderTicket2)                                       
  {
      if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
      {
        if(OrderSelect(orderTicket1,SELECT_BY_TICKET))
        {
            if(OrderType() == OP_BUY)
            {
              if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
                  Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
              else
                  Print("BIN ZU !!!");
            }
            else if (OrderType() == OP_SELL)
            {
              if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
                  Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
              else
                  Print("BIN ZU !!!");
            }
            orderTicket1 = 0;
            orderTicket2 = 0;
        }
      }
  }
}

//--- Trailing SL - openOrder ----------------------------------------+
//    Diese Funktion "TrailStopLoss()" außerhalb "void OnTick()" setzen

void TrailStopLoss(int ticket) 
{
  ResetLastError();

  if(OrderSelect(ticket,SELECT_BY_TICKET))
  { 
      if(OrderType() == OP_BUY  &&  (openOrders == 1  ||  openOrders == 2))
      {
        if(Bid - OrderOpenPrice() > Trail_Target_1 *100 * Point)
        {
            if(OrderStopLoss() < Bid - TSL || OrderStopLoss() == 0)
            {
              if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue))
              return;
                  Print("Error setting Buy trailing stop: ", GetLastError());
            }
        }
      }
      else if(OrderType() == OP_SELL  &&  (openOrders == 1  ||  openOrders == 2))
      {
        if(OrderOpenPrice() - Ask > Trail_Target_1 *100 * Point)
        {
            if(OrderStopLoss() > Ask + TSL || OrderStopLoss() == 0)
            {
              if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue))
              return;
                  Print("Error setting Sell trailing stop: ", GetLastError());
            }
        }
      }
  }
}

Das Problem ist jetzt noch größer, als zuvor: Position 2 erreicht das Trail_Target [BUY = +9] (setzt jetzt den TP [+18]) und schließt
sofort danach Pos.1 und Pos. 2 bei eben diesen + 9 Punkten (abzüglich Spread), - ohne sichtlichen Grund.
Auch in der 1. Position wird nun gar nicht mehr getrailt !

Schade, eine ganze Woche Arbeit, ohne den gewünschten Erfolg. Ich habe zwar vieles dazugelernt und kann die gewollten
Schritte auch nchvollziehen, dennoch liegen ein oder mehrere Fehler vor !

In meinem ursrünglichen Code hatte wenigstens die Pos.1 tadellos funktioniert.
Ursprünglich entstand das o.a. Problem nur bei der Pos. 2, hatte ich (CloseAllOrder()" eingefügt.
Ließ ich "CloserAllOrder()" weg, funktionierte auch hier das Trailing hervorragend; - allerdings wurde die Pos. 1 dann nicht geschlossen.
Soweit zur Erinnerung.

Was nun ??? Große Trauer, - ich war soooo zuversichtlich !

LG. pt.

next user 19.03.18 17:11

Zitat:

Zitat von piptrade (Beitrag 40596)
Hier nochmals der vollständige Code:

Ich hoffe, du hast den Code auch WIRKLICH in die entsprechenden Funktionen gepackt! Dein geposteter Code liegt nähmlich (obere Hälfte) in "OnInit()"!

Zitat:

Zitat von piptrade (Beitrag 40596)
Das Problem ist jetzt noch größer, als zuvor: Position 2 erreicht das Trail_Target [BUY = +9] (setzt jetzt den TP [+18]) und schließt
sofort danach Pos.1 und Pos. 2 bei eben diesen + 9 Punkten (abzüglich Spread), - ohne sichtlichen Grund.
Auch in der 1. Position wird nun gar nicht mehr getrailt !

  • Hier musst du jetzt erstmal herausfinden, warum Order 2 geschlossen wird.
  • Denn erst wird Order 2 geschlossen, was dann die Bedingungen für's Schließen der Order 1 erfüllt.
  • Wie kommst du eigentlich darauf, nach der "OrderModify-Abfrage" ein "return" zu setzen? So bekommst du die
    Errormeldung in der nächsten Zeile erst garnicht!
  • Schau mal bitte in deinem Code und ermittle, WO genau die Order 2 (durch welchen Codeteil) geschlossen wird.
    Ich sehe nähmlich bei dem kleinen Ausschnitt keine Möglichkeit, sofern du es auch richtig implementiert hast!
  • Auch kenne ich deine anderen Funktionen nicht. Sofern du auch in denen etwas mit den Orders machst, kann ich ja
    schlecht herausfinden, wo der Fehler ist.

Falls du es nicht schaffst, den Zeitpunkt & Codestelle beim Schließen der 2 Order zu ermitteln, dann poste mal den ganzen,
relevanten Code und nicht nur Passagen. Dann kann ich auch viel wahrscheinlicher den Fehler sehen!

piptrade 19.03.18 20:35

Hallo next user,

lieb von Dir, dass Du "am Ball bleibst". Kann morgen früh in aller Ruhe Deine Hinweise durchgehen. In diesem
Zusammenhang werde ich auch versuchen einen Gesamtüberblick des EA zusammenzustellen, damit Fehlerstellen leichter erkennbar
werden.
Ich hoffe nur, wir (Du) finden den "Haken.

Bis dahin LG pt.

piptrade 20.03.18 13:32

So, da bin ich wieder !
... und das mit ersten Erkenntnissen :

Hallo, lieber next user,

habe mir jetzt nochmals die Zeit genommen, alles in Ruhe zu überprüfen.
Die erste Erkenntnis war nun, dass der von Dir gewählte Begriff "updateSL" (unter "void OnTick()"
die ganze Anglegenheit tatsächlich am besten trifft.
Dieses update ist ja wichtig, um a) die Positionen 1 + 2 ständig zu "scannen", b) zu registrieren, dass ggf. eine der beiden
Tickets geschlossen wurde und c) um dann nachträglich die Pos. 1 zu schließen.
Bis dahin ist in Punkto "Block 1" alles recht gut verständlich.
(Ohne den 2. "Block" "void updateSL(int ticket)" wird allerdings "updateSL" beim Kompellieren als error ausgewiesen.)

Somit muß dieses "updateSL" also in einem 2. "Block" = "void updateSL(int ticket)" nochmals aufgegriffen werden
und - siehe da, - das o.a. error verschwindet, da es jetzt erkannt wird.
Auch bis dahin ist alles halbwegs verständlich.

Nicht ganz verständlich hingegen ist, was der 2. "Block" bewirkt.
Theoretisch sind jetzt alle Orders geschlossen und es sollte (irgendwann) eine neue, erste Order, gem. Strategie-Konditionen,
eröffnet werden. So z.B. eine BUY-Pos.. Auch das ist noch OK.
Damit gibt es jetzt wieder ein Ticket in der History (wie eigentlich immer), ein zweites Ticket ist geöffnet. Dies wiederum
wird unter OrderSelect erkannt, was zum Schließen der Position führen müßte. Kaum wäre die neue 1. Pos. geöffnet, würde sie auch
schon wieder gechlossen werden ?
Wo ist hier der Gedankenfehler ? - oder ist der Gedanke ggf. gar nicht so falsch ?

Und ein zweiter Gedanke:
Angenommen, die o.a. 1. Pos. verbleibt im Markt, sie wird selektiert, es wird festgestellt BUY oder SELL, so würde
bei Erreichen des Trail_Targets der Trail_SL übergeben werden.
Weiterhin angenommen, die 1. Pos. erreicht ihr Trail_Target NICHT und rutscht statt dessen in die Verlustzone, ---> jetzt wird
gehedged und eine 2. Pos. zusätzlich geöffnet.

Somit gibt es jetzt 2 geöffnete Tickets, wobei nur die 2. Pos. den Trail_SL erhalten soll.
Da im Code aber nur nach Ticket bzw. Tickets und anschließend nur nach BUY bzw. SELL unterschieden wird, müßte doch wenigstens auch die "openOrders == 2" angesprochen werden ? - Oder ? Wie sonst kann der Trail_SL an die richtige Pos. übergeben werden ?

Erst einmal bis zu diesem Punkt. Vielleicht kannst Du meine ersten Gedanken nochmals prüfen und sollten sie Fehler aufweisen,
korrigieren.

LG. pt.

piptrade 21.03.18 09:43

Hallo, next user,

würde mich freuen, wenn Du auf meinen letzten comment antworten würdest. Haben wir die ganze Zeit ggf. eines der wichtigsten Dinge übersehen ?

Kann doch eigentlich nicht sein ! Und doch stehen die o.a. Argumente im Raum, um nochmals aufgegriffen zu werden !

Mit bangen Hoffen -
LG. pt.

next user 21.03.18 11:57

Zitat:

Zitat von piptrade (Beitrag 40621)
Hallo, next user,

würde mich freuen, wenn Du auf meinen letzten comment antworten würdest.

Bin nicht abgesprungen.
Hatte gestern nur keine Zeit, daher erst jetzt eine Antwort.

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

Zitat:

Zitat von piptrade (Beitrag 40611)
(Ohne den 2. "Block" "void updateSL(int ticket)" wird allerdings "updateSL" beim Kompellieren als error ausgewiesen.)

Was hast du denn jetzt schon wieder gemixt?
"void updateSL(int ticket)" ist die Funktion! "updateSL(...)" (MIT KLAMMERN) ist ein Funktionsaufruf. Wie eben im Code:
Code:

void updateSL(int ticket) // Funktion selbst
...
if(orderTicket1)
  updateSL(orderTicket1); // Funktionsaufruf

Also wo hast du plötzlich das lose "updateSL" her? Da gibts natürlich einen Error.

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

Zitat:

Zitat von piptrade (Beitrag 40611)
Somit muß dieses "updateSL" also in einem 2. "Block" = "void updateSL(int ticket)" nochmals aufgegriffen werden
und - siehe da, - das o.a. error verschwindet, da es jetzt erkannt wird.
Auch bis dahin ist alles halbwegs verständlich.

Ich verstehe das wiederum nicht.
"updateSL" ... "nochmals aufgegriffen werden" ... HÄ?
Poste mal bitte den Code von deinem MIX!

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

Zitat:

Zitat von piptrade (Beitrag 40611)
Nicht ganz verständlich hingegen ist, was der 2. "Block" bewirkt.

Nach den beiden Punkten zuvor, frage ich mich grad, was genau bei dir der zweite Block ist?

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

Zitat:

Zitat von piptrade (Beitrag 40611)
Theoretisch sind jetzt alle Orders geschlossen und es sollte (irgendwann) eine neue, erste Order, gem. Strategie-Konditionen,
eröffnet werden. So z.B. eine BUY-Pos.. Auch das ist noch OK.
Damit gibt es jetzt wieder ein Ticket in der History (wie eigentlich immer), ein zweites Ticket ist geöffnet. Dies wiederum
wird unter OrderSelect erkannt, was zum Schließen der Position führen müßte. Kaum wäre die neue 1. Pos. geöffnet, würde sie auch
schon wieder gechlossen werden ?
Wo ist hier der Gedankenfehler ? - oder ist der Gedanke ggf. gar nicht so falsch ?

Ich verstehe, was du meinst. Aber in meinem Code geht das nicht, somit sollte es auch nicht zu einer direkten Schließung kommen, denn:
  • Als erstes wird ja abgefragt ob
    Code:

    if(orderTicket1 && orderTicket2)
    beide Variablen ein Ticket beinhalten (ungleich 0 sind).
  • Dann wird abgefragt, ob die zweite Order geschlossen ist.
    Code:

    if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))
    Diese Abfrage wird ja aber erst DANN passiert, wenn die erste Abfrage "true" ergibt.
  • Ist die zweite Order (erster Durchgang) geschlossen, kommt ja folgender Code zum Einsatz:
    Code:

    if(OrderType() == OP_BUY)
    {
      if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
          Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
      else
          Print("BIN ZU !!!");
    }
    else if (OrderType() == OP_SELL)
    {
      if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
          Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
      else
          Print("BIN ZU !!!");
    }

    orderTicket1 = 0;
    orderTicket2 = 0;

    Neben dem Schließen der ersten Order (erster Durchgang) werden hier ja ebend auch die beiden Ordervariablen auf "0" gesetzt.
    Wenn du jetzt eine neue Order1 hast und "orderTicket1" mit deren Ticket fütterst, so ist "orderTicket2" ja aber immer noch "0",
    was ein Betreten dieses Codeabschnittes durch Punkt 1 aber verhindert. Somit kann die Order1 (zweiter Durchgang) NICHT gelöscht werden!

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

Zitat:

Zitat von piptrade (Beitrag 40611)
Und ein zweiter Gedanke:
Angenommen, die o.a. 1. Pos. verbleibt im Markt, sie wird selektiert, es wird festgestellt BUY oder SELL, so würde
bei Erreichen des Trail_Targets der Trail_SL übergeben werden.
Weiterhin angenommen, die 1. Pos. erreicht ihr Trail_Target NICHT und rutscht statt dessen in die Verlustzone, ---> jetzt wird
gehedged und eine 2. Pos. zusätzlich geöffnet.

Somit gibt es jetzt 2 geöffnete Tickets, wobei nur die 2. Pos. den Trail_SL erhalten soll.
Da im Code aber nur nach Ticket bzw. Tickets und anschließend nur nach BUY bzw. SELL unterschieden wird, müßte doch wenigstens auch die "openOrders == 2" angesprochen werden ? - Oder ? Wie sonst kann der Trail_SL an die richtige Pos. übergeben werden ?

Vielleicht habe ich dich falsch verstanden, aber du hast dazu doch ebend die beiden Ticker-Variablen, die individuell in
"updateSL" angesprochen werden.

piptrade 21.03.18 17:08

Hallo next user,

konnte erst jetzt im "Mail-Kästchen" nachsehen und so Deine Nachricht aufnehmen. DANKE.

Dennoch bin ich momentan so verwirrt, dass ich gar nicht mehr so richtig weiß, wo ich anfangen oder auch weitermachen soll.

Wenn Dein letzter comment richtig ist (... und davon gehe ich aus), sollte ich tatsächlich erst einmal einige Schritte zurückgehen und Deine Hinweise beachtend den Code rekonstruieren. Anschließend würde ich dann diesen Code mit allen relevanten Bestandteilen ins Forum stellen. Vielleicht lässt sich so der bestehende Fehler am ehesten finden.

Dennoch werde ich ein klein wenig Zeit dazu brauchen, um nicht die alten Fehler zu wiederholen. Deshalb "Sorry", wenn es ein bisschen dauert.

LG. pt.

next user 21.03.18 18:39

Zitat:

Zitat von piptrade (Beitrag 40631)
... Anschließend würde ich dann diesen Code mit allen relevanten Bestandteilen ins Forum stellen. Vielleicht lässt sich so der bestehende Fehler am ehesten finden.

Jap, das denke ich auch.

Zitat:

Zitat von piptrade (Beitrag 40631)
Dennoch werde ich ein klein wenig Zeit dazu brauchen, um nicht die alten Fehler zu wiederholen. Deshalb "Sorry", wenn es ein bisschen dauert.

Keine Eile. Mach dir nen Tee und schalt mal vielleicht für ne Runde ab. ;)

piptrade 22.03.18 10:14

Hallo next user,

das mit dem "Tee" und dem "Abschalten" war eine gute Idee. Und die Gesamtstruktur des EA darzustellen ev. auch; - denn es wurden noch 2, 3 Kleinigkeiten gefunden, die an einer "runden Sache" vorbeigingen.

Und "SO" sieht die Ges.-Struktur, einschl. der erarbeiteten Blöcke 1 + 2, jetzt aus:

Code:

//--- globale Deklarationen (extern bzw. intern) --------------------+
      int    orderTicket1 = 0;
      int    orderTicket2 = 0;
      double TSL = Trail_SL *100 *Point;
//===================================================================+
int  OnInit() { view graphic and calculat "AccountFreeMargin"
    }
//===================================================================+
int  DeInit() { Funktion fehlt noch !  <-------------------------------fehlt noch !
    }
//===================================================================+
void OnTick() {

//--- function for "AccountFreeMargin"
//--- Add. Conditions for TradeZoneTimer
                                               
//--- calculate open orders by current symbol --> and close by TP
      if (CalculateCurrentOrders(Symbol()) == 0) CheckForOpen();

//--- calculate open orders --> and opening a hedging position
      if (CalculateCurrentOrders(Symbol()) != 0) CheckHedgeOpen();
 
      CheckTakeProfit();                //  nicht notwendig (next user)!!!

//=========================================       
//--- open TrailStopLoss (CheckClose_Pos.1) - Block 1 - NEU (next user)
//=========================================
  if(orderTicket1)  updateSL(orderTicket1); 
  if(orderTicket2)  updateSL(orderTicket2);

  if(orderTicket1 && orderTicket2)  {
    if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))  {
        if(OrderSelect(orderTicket1,SELECT_BY_TICKET)) 
        {   
          if(OrderType() == OP_BUY)
          {
              if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
                  Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
              else    Print("BIN ZU !!!");
          }
          else if (OrderType() == OP_SELL)
          {
              if(!OrderClose(orderTicket1,OrderLots(),Ask,3))
                  Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
              else    Print("BIN ZU !!!");
          }
          orderTicket1 = 0;
          orderTicket2 = 0;
        }
      }
  }
//---
}      //  end "void OnTick()"

//===================================================================+
//--- open TrailStopLoss    Block 2  ----------------- NEU (next user)
//===================================================================+
void updateSL(int ticket)  {
  ResetLastError();

  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {
      if(OrderType() == OP_BUY  &&  (openOrders == 1  ||  openOrders == 2))
      {
        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  &&  (openOrders == 1  ||  openOrders == 2))
      {
        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());
            }
        }
      }
  }
}
//===================================================================+
int CalculateCurrentOrders(string symbol) { Calculate open positions
    }
//===================================================================+   
void CheckForOpen() { Check for openOrder Conditions
    }
//===================================================================+
double LotsOptimized() { MoneyManagement - Calculate lot size 
    }
//===================================================================+
void CheckTakeProfit()  { Check for TakeProfit Conditions
    }
//+==================================================================+ 
void CheckHedgeOpen() { Check for HedgeOrder Conditions                               
    }
//+==================================================================+
void CloseAllOrders() { AllOrdersClosed function                                           
}
//===================================================================+
//--- End -----------------------------------------------------------+

Sicher wird durch die o.a. Codedarstellung einiges deutlicher; - und vielleicht wird sie sogar als richtig befunden. Das wäre natürlich das HIGHLIGHT für den heutigen Tag !

Anbei möchte ich nochmals erwähnen: Toll, dass Du mich SO an der Hand nimmst, mein stetes "Aufbegehren" ohne zu Murren richtig stellst und dabei eine Ausdauer zeigst, für die man nur dankbar sein kann.
In diesem Zusammenhang bin ich immer noch davon überzeugt, dass wir (Du) es schaffen werden, das "Ding" korrekt zum Laufen zu bringen.

Also, nochmals danke und
LG. pt.

PS.: Sobald ich Dein "OK" bzw. letzte Änderungen vorliegen habe, werde ich den Original-Code nochmals überprüfen/angleichen. Dann sollten auch die nächsten Tests mit Erfolg verlaufen.

piptrade 22.03.18 11:01

Zitat:

Schau mal bitte in deinem Code und ermittle, WO genau die Order 2 (durch welchen Codeteil) geschlossen wird.
Ich sehe nähmlich bei dem kleinen Ausschnitt keine Möglichkeit, sofern du es auch richtig implementiert hast!
Auch kenne ich deine anderen Funktionen nicht. Sofern du auch in denen etwas mit den Orders machst, kann ich ja
schlecht herausfinden, wo der Fehler ist.
Ohhh - , - diesen Teil hatte ich noch vergessen.
Also der Nachtrag: Für die Pos. 2 wird die "CloseAllOrders()" nur noch in "void CheckTakeProft()" verwendet:

Code:

void CheckTakeProfit() {

  for (int i = OrdersTotal() - 1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) continue;
      if (OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol()) continue;

//--- TakeProfit for order type BUY ---------------------------------+     
//=================================
//--- Pos. 1 (FixLevel + ATR 1) ---
  if (OrderType() == OP_BUY  &&  openOrders == 1  &&  OrderTakeProfit()==0) {
      if (Bid >= OrderOpenPrice() + Trail_Target_1 * 100 * Point)
        {
        double TakeProfit_1  =  OrderOpenPrice() + Trail_Target_1 + (1.2 *SMA7_ATR5_1);
        bool OrderAngepasst  =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_1,0,Lime);
        }                                                                     
      return;
      }
//--- Pos. 2 (FixLevel + ATR 2) ---
  if (OrderType() == OP_BUY  &&  openOrders == 2  &&  OrderTakeProfit()==0) {
      if (Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point)
        {
        double TakeProfit_2  =  OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1;
        OrderAngepasst      =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_2,0,Lime);
      if (Bid >= TakeProfit_2)
        CloseAllOrders();
        }
      } 
//--- analog for SELL
  }

Ich hoffe, dass hilft ein wenig weiter ! ?

Kleiner Hinweis am Rande: dieses "CloseAllOrders()" unter"void CheckTakeProft()" könnte ggf. auch einen Mangel aufweisen, da in manchen GesamtCodeVarianten die Pos. 2 zwar eröffnet, dann aber sehr schnell am Trail_Target wieder geschlossen wurde. Man kann dann im Chart gerade noch sehen, dass TP und Trail_SL gesetzt werden und schon ist die Position einfach zu. (Auch in der History wurden dann weder TP noch SL eingetragen !) Vielleicht hilft auch das.

LG. pt.

next user 22.03.18 15:23

Schaue mir das nachher mal an, muss jetzt erstmal weg...

piptrade 22.03.18 16:05

Warte in gespannte Haltung - DANKE !

next user 23.03.18 06:00

Sorry,

wurde gestern doch etwas spät.
So, jetzt mal zu deinem Code:

Erstmal...
Zitat:

Zitat von piptrade (Beitrag 40639)
int DeInit() { Funktion fehlt noch ! <-------------------------------fehlt noch !
}

Wird bei dir hoffentlich "OnDeinit()" heißen ;)

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

Zitat:

Zitat von piptrade (Beitrag 40639)
CheckTakeProfit(); // nicht notwendig (next user)!!!

Hehe, so gaaaaanz entspricht das nicht der Wahrheit.
Meine Aussage bezog sich auf "CheckTakeProfit()", wie du sie HIER gepostet hast. Mit dem Inhalt dort IST sie ja komplett unnötig gewesen.
Der Inhalt der Funktion, wie du ihn jetzt gepostet hast, kam in dem verlinkten Post ja garnicht vor.

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

Da in dem Codeblock 1 ja die Order mit einer Meldung geschlossen wird, und du dies sicherlich erwähnt hättest, ist das Problem wohl
in "CheckTakeProfit()" oder deiner Funktion, welche die Orders öffnet, zu suchen.

Jetzt mal zu folgendem Code:
Code:

//--- Pos. 1 (FixLevel + ATR 1) ---
if(OrderType() == OP_BUY  &&  openOrders == 1  &&  OrderTakeProfit()==0)
{
  if(Bid >= OrderOpenPrice() + Trail_Target_1 * 100 * Point)
  {
      double TakeProfit_1  =  OrderOpenPrice() + Trail_Target_1 + (1.2 *SMA7_ATR5_1);
      bool OrderAngepasst  =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_1,0,Lime);
  }
  return;
}

//--- Pos. 2 (FixLevel + ATR 2) ---
if(OrderType() == OP_BUY  &&  openOrders == 2  &&  OrderTakeProfit()==0)
{
  if(Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point)
  {
      double TakeProfit_2  =  OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1;
      OrderAngepasst      =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_2,0,Lime);
     
      if(Bid >= TakeProfit_2)
        CloseAllOrders();
  }
}

  • Ein möglicher Fehler ist wohl deine Variable "openOrders". Die if's unterscheiden sich in der Abfrage ja nur bei dieser Variable.
    Du willst mit dieser Variable sicherlich zwischen erster und zweiter Order unterscheiden, richtig?
    Das Problem ist, das du sie in der Schleife nutzt. Das heißt, wenn die Variable "1" ist, bearbeitest du ALLE ORDERS mit dem
    ersten if-Block, wenn "2" dann entsprechend ALLE ORDERS mit dem zweiten if-Block. Das ist nicht so gedacht, oder?
  • Zweite mögliche Fehlerquelle sind die Zeilen
    Code:

    if(Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point)
    ...
    double TakeProfit_2  =  OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1;
    ...
    if(Bid >= TakeProfit_2)
      CloseAllOrders();

    Da ich den Wert von "SMA7_ATR5_1" nicht weiß, ist es schwer eine Aussage zu treffen.
    Aber wenn hier jetzt "Trail_Target_2 + SMA7_ATR5_1" KLEINER als "Trail_Target_2 * 100 * Point" wäre, so erfüllt es
    die Bedingung des zweiten if's und du rufst "CloseAllOrders()" auf.
  • Die Variable "OrderAngepasst" wird nicht weiter in der Funktion genutzt, ist aber nur in dieser existen, hoffe das weißt du.
  • Jetzt mal unabhängig der obigen Punkte, den Code könnte man noch etwas zusammenfügen...
    Code:

    void CheckTakeProfit()
    {
      for(int i=OrdersTotal()-1; i >= 0; i--)
      {
          if(!OrderSelect(i, SELECT_BY_POS)) continue;
          if(OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol()) continue;
         
          if(OrderType() == OP_BUY && OrderTakeProfit() == 0)
          {
            if(openOrders == 1)
            {
                if(Bid >= OrderOpenPrice() + Trail_Target_1 * 100 * Point)
                {
                  double TakeProfit_1  =  OrderOpenPrice() + Trail_Target_1 + (1.2 *SMA7_ATR5_1);
                  bool OrderAngepasst  =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_1,0,Lime);
                }
            }
            else if(openOrders == 2)
            {
                if(Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point)
                {
                  double TakeProfit_2  =  OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1;
                  OrderAngepasst      =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_2,0,Lime);
                 
                  if(Bid >= TakeProfit_2)
                      CloseAllOrders();
                }
            }
          }
      }
    }


In dem anderen Code habe ich jetzt beim kurzen Durchgehen keinen Fehler gesehen, der dein Problem begründen würde.
Also schau dir nochmal "CheckTakeProfit()", sowie ggf. die Funktion zum Öffnen der Orders, falls die Order SOFORT wieder
geschlossen wird, an.

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

Zitat:

Zitat von piptrade (Beitrag 40641)
... da in manchen GesamtCodeVarianten die Pos. 2 zwar eröffnet, dann aber sehr schnell am Trail_Target wieder geschlossen wurde. Man kann dann im Chart gerade noch sehen, dass TP und Trail_SL gesetzt werden und schon ist die Position einfach zu. (Auch in der History wurden dann weder TP noch SL eingetragen !) Vielleicht hilft auch das.

GesamtCodeVarianten? Testest du etwa mehrere Bestandteile getrennt?
---------------------------------------------------
Was du schreibst würde vom Ablauf her bedeuten:
  1. "CheckTakeProfit()" wird das erste mal aufgerufen => TP wird gesetzt (im Chart).
  2. "updateSL()" wird das erste mal aufgerufen => (Trail)SL wird gesetzt (im Chart).
  3. Beim nächsten Durchgang würde "CheckTakeProfit()" wegen "if(... OrderTakeProfit() == 0 ...)" nichts machen.
    Auch "updateSL()" würde nichts machen. Außerdem wird in "updateSL()" keine Order geschlossen.
  4. Und auch die andere Schließmöglichkeit (beim Block mit "if(orderTicket1 && orderTicket2) ...") kann es nicht sein.
    Zum einen hättest du dann eine Ausgabe
    Code:

    if(!OrderClose(orderTicket1,OrderLots(),Bid,3))
      Print("Order konnte nicht geschlossen werden, weil: ", GetLastError());
    else    Print("BIN ZU !!!");

    erhalten, zum anderen würde dann ja die Order 1 geschlossen werden, und nicht Order 2.

Logisch betrachtet kann die Order dann NICHT in Block 1 oder "CheckTakeProfit()" geschlossen werden, wenn wirklich
TP UND SL gesetzt werden. Meine Vermutung:
  • Deine Beschreibung passt IDEAL zu folgendem Codeabschnitt
    Code:

    if(Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point)
    {
      double TakeProfit_2  =  OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1;
      OrderAngepasst      =  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_2,0,Lime);
     
      if(Bid >= TakeProfit_2)
          CloseAllOrders();
    }

    Erst wird TP durch "OrderModify()" gesetzt (was du im Chart gesehen hast?), dann aber durch erfüllter Bedingung durch "CloseAllOrders()"
    geschlossen. Dem widerspricht aber, das "updateSL()" NACH "CheckTakeProfit()" aufgerufen wird. Dann dürftest du
    aber KEINEN SL im Chart sehen, wenn wirklich in "CheckTakeProfit()" geschlossen wurde.
  • Die zweite Stelle, an der geschlossen wird, ist
    Code:

    if(orderTicket1 && orderTicket2)
    ...

    Selbst wenn wir jetzt mal außer Acht lassen, das hier ebend nur die Order 1 und nicht Order 2 geschlossen wird,
    könnte es trotzdem nicht daran liegen, sofern du die Variablen "orderTicket1 / 2" nicht fehlerhaft nutzt (bei Ordereröffnung z.B.).
  • Bist du dir mit dem Setzen von TP UND SL auch wirklich sicher? Dann ist die Frage, was es mit den
    beiden fehlenden Werten in der Historie auf sich hat.

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


Am besten, du setzt an allen relevanten Stellen Ausgaben ein, um GENAU zu erfahren, was der Auslöser fürs Schließen ist.

piptrade 23.03.18 18:35

Hallo, next user,

DANKE, DANKE, DANKE ! - das ist schon fast zuviel des Guten ! Dennoch werde ich Stück für Stück jedem Hinweis nachgehen:

1. Ok. - "OnDeInit()" = erledigt.
===
2. "CheckTakeProfit()" - alleinig, ist natürlich unnötig. Ich ging davon aus, dass Du aus dieser
1-zeiligen Erwähnung (unter "void OnTick()") auch eine später im Code enthaltenen Funktion ableitest.
"CheckForOpen()" bzw. "CheckHedgeOpen()" werden in diesen Bereich ja auch angeführt, - die zugehörigen
Funktionsabläufe aber ebenfalls nicht gepostet.
====
Zitat:

Da in dem Codeblock 1 ja die Order mit einer Meldung geschlossen wird, und du dies sicherlich erwähnt hättest, ist das Problem wohl
in "CheckTakeProfit()" oder deiner Funktion, welche die Orders öffnet, zu suchen.
Die Funktion "CheckTakeProft()" liegt Dir vor und Postionseröffnungen finden nur in "void CheckForOpen()"
Code:

res = OrderSend(Symbol(), OP_SELL, LotsOptimized(), Bid, 3, 0, 0, "", MagicNumber, 0, Red);
      return;

und im "void CheckHedgeOpen()" (hier Pos.2):
Code:

if (OrderType() == OP_BUY  &&  openOrders  == 2) {
        if (Close[0] < OrderOpenPrice() - HedgeTarget_1 * 100 * Point) {  //  6 Pkt.
            lot = LotsOptimized();
            Print("SELL", "  ", AccountFreeMarginCheck(Symbol(), OP_SELL, lot));
        if (AccountFreeMarginCheck(Symbol(), OP_SELL, lot) <= 0) return;
            res = OrderSend(Symbol(), OP_SELL, lot, Bid, 3, 0, 0, "", MagicNumber, 0, Red);    //  öffne Pos. 3
        }
        return;
      }

statt.
Sowohl das Öffnen mittels Hedging oder auch das orderOpen (nach Strategie) haben bisher keinerlei
Probleme bereitet und funktionieren einwandfrei ! Daran sollte es somit nicht liegen.
===
Zitat:

Ein möglicher Fehler ist wohl deine Variable "openOrders". Die if's unterscheiden sich in der Abfrage ja nur bei dieser Variable.
Du willst mit dieser Variable sicherlich zwischen erster und zweiter Order unterscheiden, richtig?
Das Problem ist, das du sie in der Schleife nutzt. Das heißt, wenn die Variable "1" ist, bearbeitest du ALLE ORDERS mit dem
ersten if-Block, wenn "2" dann entsprechend ALLE ORDERS mit dem zweiten if-Block. Das ist nicht so gedacht, oder?
Richtig, es soll zwischen "openOrders == 1" und "openOrders == 2" unterschieden werden. So sind hier z.B. die Targets
verschieden und auch die "SMA7_ATR5_1"- Summanden unterscheiden sich. Somit sollte es schon richtig sein, wenn unter
"openOrders() == 1" etwas anderes geschieht, als in "openOrders() == 2".
===
Zitat:

Zweite mögliche Fehlerquelle sind die Zeilen
Code:

if(Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point)
...
double TakeProfit_2  =  OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1;
...
if(Bid >= TakeProfit_2)
  CloseAllOrders();

"SMA7_ATR5_1" ist der letzte geschlossene ATR-Wert mit der Periode 5, welcher mit einem SMA der Periode 7 geglättet
wird. Damit werden keine starren, sondern flexible Ziele für die TPs auslöst.

Zitat:

Aber wenn hier jetzt "Trail_Target_2 + SMA7_ATR5_1" KLEINER als "Trail_Target_2 * 100 * Point" wäre, so erfüllt es
die Bedingung des zweiten if's und du rufst "CloseAllOrders()" auf.
NEIN! "Trail_Target_2 + SMA7_ATR5_1" kann doch niemals kleiner sein, als "Trail_Target_2" !!!

... wenn Bid das Target bei z.B. + 9 Punkten überschreitet // soll "TakeProfit_2" = Target + SMA_ATR als TP gesetzt
werden. Und erst, wenn dann dieser "TakeProfit_2" durch Bid überschritten wird, - sollen alle Order gelöscht werden.
Hier scheint der Algoritmus richtig zu sein, denn "if(Bid >= TakeProfit_2)" wird richtig erkannt und CloeAllOrders() ausgelöst.
Soweit zum TP-Bereich.

Im Bereich des Trail_SL hingegen ist es etwas anders:
Hier werden durch die ersten "ifs" ebenfalls Konditionen für das Nachziehen des SL vorgegeben, dann an "OrderStopLoss()" übergeben, - welches stetig aktualisiert wird.
Hänge ich ein separates, späteres "if" an, welches diese "OrderStopLoss()" aufgreift und nur bei Unterschreitung mittels Bid dieses "CloseAllOrdes()" ausgelösen soll, - so scheint hier "OrderStopLoss()" gar nicht erkannt zu werden. Könnte das so sein? Was wäre hier zu tun, damit diese "OrderStopLoss()" erkannt wird und dann das Schließen aller "openOrder" erfolgt ? (ggf. neben Deiner Tiket-update-Variante)

Wie ich schon zu Beginn dieses Foren-Beitrags erwähnte, bringt gerade das HIER (unter Trail_SL) angehängte "CloseAllOrders()" alles durcheinander !
===
Zitat:

Die Variable "OrderAngepasst" wird nicht weiter in der Funktion genutzt, ist aber nur in dieser existent, hoffe das weißt du.
Ja.
===
Zitat:

Jetzt mal unabhängig der obigen Punkte, den Code könnte man noch etwas zusammenfügen...
Diese Änderg. finde ich recht gut und habe sie dementsprechend übernommen.
===

So weit erst einmal zu den wesentlichen Dingen. Im Weiteren werden hauptsächlich Fehlervermutungen geäußert, welchen ich noch heute Abend in aller Ruhe nachgehen werde. Bis hierher erst einmal wieder ein "dickes Lob" und das zugehörige DANKESCHÖN"!

Anbei eine für mich als Laien recht wichtige Frage:
Zitat:

Am besten, du setzt an allen relevanten Stellen Ausgaben ein, um GENAU zu erfahren, was der Auslöser fürs Schließen ist.
Das Einsetzen der Ausgaben (mittels Print) kenne ich, wo aber kann ich diese Ausgaben lesen/ablesen ?

Vielleicht kannst Du mir gerade die letzte Frage schon `mal vorab und kurzfristig beantworten.

Ansonsten werde ich ein Momentchen brauchen, um all Deinen Statemets nachzugehen. Bin ich dann endlich damit "durch",
melde ich mich natürlich umgehend !

Bis dahin mit ganz LG. pt.


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