Einzelnen Beitrag anzeigen
  #39 (permalink)  
Alt 23.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

Sorry,

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

Erstmal...
Zitat:
Zitat von piptrade Beitrag anzeigen
int DeInit() { Funktion fehlt noch ! <-------------------------------fehlt noch !
}
Wird bei dir hoffentlich "OnDeinit()" heißen

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

Zitat:
Zitat von piptrade Beitrag anzeigen
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 anzeigen
... 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.