Einzelnen Beitrag anzeigen
  #23 (permalink)  
Alt 16.03.18
piptrade piptrade ist offline
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

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.