Einzelnen Beitrag anzeigen
  #20 (permalink)  
Alt 15.03.18
next user next user ist offline
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

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

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

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

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

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

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

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

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

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

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

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

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

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