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

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

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?

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

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!