Einzelnen Beitrag anzeigen
  #4 (permalink)  
Alt 14.08.20
Michael_ Michael_ ist offline
Mitglied
 
Registriert seit: Jun 2020
Beiträge: 41
Michael_ befindet sich auf einem aufstrebenden Ast
Standard

Hallo zusammen,

es ist so, dass bei einem Signal (machen wir als Beispiel Long) immer 2 Positionen eröffnet werden. Also "LongOrder1" und "LongOrder2". Da wird zusammen 1% riskiert (also z.B. 0,7% für LongOrder1 und 0,3% für LongOrder2).

Es ist aber auch möglich, dass sich ein weiteres Long-Signal nach z.B. 5 Stunden ergibt. Dann soll der EA weitere 2 Long-Orders setzen (wieder mit 1% Risiko), allerdings mit anderem SL (klar, da der Kaufkurs auch ein anderer ist).

Beispiel-Code ist folgender:

Code:
if(LongSignal == true)
   {
         //Positionsgröße berechnen
         double SL_Euro = AccountBalance()*SL_Prozent/100;                                   

         //SL in Punkten und als Absolutwert definieren:
         double SL_Long_Punkte = 50;            //Beispiel 50 Punkte als SL im DAX30
         double SL_Long = MarketInfo(Symbol(),MODE_ASK) - SL_Long_Punkte; 

         //Positionsgröße berechnen (Lot-Size) + Aufteilung Lot-Size auf 2 Positionen:
         double LotSize_Long = MathFloor(SL_Euro/SL_Long_Punkte);
         double LotSize_Long1 = MathRound(LotSize_Long*Position1_Prozent/100);         //Lot-Size Position1 für Long-Position; bei z.B. 0.3 Lots = 0.2 Lots
         double LotSize_Long2 = MathRound(LotSize_Long - LotSize_Long1);             //Lot-Size Position2 für Long-Position; bei z.B. 0.3 Lots = 0.1 Lots

         //Take-Profit in Punkten berechnen (2 Positionen):      
         double TP_Long1_Punkte = MathRound(SL_Long_Punkte * TP_Prozent1);
         double TP_Long2_Punkte = MathRound(SL_Long_Punkte * TP_Prozent2);           
         double TP_Long1 = TP_Long1_Punkte + MarketInfo(Symbol(),MODE_BID) + MarketInfo(Symbol(),MODE_SPREAD)*Point;                          //Absoluter TP für Long-Order 1
         double TP_Long2 = TP_Long2_Punkte + MarketInfo(Symbol(),MODE_BID) + MarketInfo(Symbol(),MODE_SPREAD)*Point;                          //Absoluter TP für Long-Order 2


         //Long-Order1 eröffnen
         while(LongOrder1<=0)                 
            {
               LongOrder1 = OrderSend(Symbol(),OP_BUY,LotSize_Long1,Ask,10,0,0,"LONG Position 1",MagicNummer,0,Green);
               if(LongOrder1<0) 
                  { 
                     Print("OrderSend LongOrder1 failed with error #",GetLastError()); 
                  } 
               else 
                  Print("OrderSend LongOrder1 placed successfully"); 
            }

          //Long-Order2 eröffnen
          while(LongOrder2<=0)                 
            {
               LongOrder2 = OrderSend(Symbol(),OP_BUY,LotSize_Long2,Ask,10,0,0,"LONG Position 2",MagicNummer,0,Green);
               if(LongOrder2<0) 
                  { 
                     Print("OrderSend LongOrder2 failed with error #",GetLastError()); 
                  } 
               else 
                  Print("OrderSend LongOrder2 placed successfully"); 
            }

//SL Long Positionen setzen
if(OrderSelect(LongOrder1,SELECT_BY_TICKET)==true)                      
      {
         if(OrderCloseTime()==0 && OrderStopLoss()==0)                     
            {
               bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL_Long,Digits()),OrderTakeProfit(),0,Yellow); 
            } 
      }
   
   if(OrderSelect(LongOrder2,SELECT_BY_TICKET)==true)                       
      {
         if(OrderCloseTime()==0 && OrderStopLoss()==0)                     
            {
               bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL_Long,Digits()),OrderTakeProfit(),0,Yellow); 
            } 
      }


//TP Long Positionen setzen
   if(OrderSelect(LongOrder1,SELECT_BY_TICKET)==true)                       
      {
         if(OrderCloseTime()==0 && OrderTakeProfit()==0)                   
            {
               bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TP_Long1,0,Orange);
            } 
      }
   
   if(OrderSelect(LongOrder2,SELECT_BY_TICKET)==true)                       
      {
         if(OrderCloseTime()==0 && OrderTakeProfit()==0)
            {
               bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TP_Long2,0,Orange);
            } 
      }
}
Danach folgt noch ein Code für einen Trailing Stop, der mit folgender Funktion aufgerufen wird:

Code:
if(OrderSelect(LongOrder1,SELECT_BY_TICKET)==true && OrderCloseTime() == 0)
   {
...
   }


if(OrderSelect(LongOrder2,SELECT_BY_TICKET)==true && OrderCloseTime() == 0)
   {
...
   }

Wie ihr seht, definiere ich immer klar die "LongOrder1" und "LongOrder2" für alle Funktionen. Die obige SL und TP-Berechnung sollte global möglich sein, die OrderSend-Funktion müsste aber irgendwie angepasst werden (damit nicht wieder "LongOrder1" und "LongOrder2" definiert wird, sondern "LongOrder3" und "LongOrder4"), ebenfalls die Trailing Stop Funktion.

Das geht ganz sicher, ich weiß nur leider nicht wie es genau geht und dabei auch am effizientesten ist.

Danke gleich für eure Hilfe!

Lieben Gruß,
Michael