HILFE unexpected End of Program / unbalanced parentheses

 

Guten Tag,

Ich benötige Hilfe bei meinem EA.

Ich habe vor kurzem versucht einen Trailing Stop welcher mir hier im Forum zur Verfügung gestellt wurde in meinen Code ein zu arbeiten, nun bekomme ich beim kompilieren meines Codes die Fehler unexpected End of Program / unbalanced parentheses.

Es wäre schön wenn mir jemand helfen könnte.

Anbei mein Code und die Fehlermeldung

#property copyright "Copyright 2018"
#property link      ""
#property version   "1.00"

#include <Trade/Trade.mqh>  

input double Cfd = 0.10;
input double TrailingStop = 10;

input int SLPoints = 300;
input int TPPoints = 300;

input int MASignalPerioden = 20;
input int MABasisPerioden = 40;

input int ATRPeriode = 8;
input int ATRMin = 10;
input int ATRMax = 50;

input string Kommentar = "";

CTrade trade;
bool isLongTrade, isShortTrade;

int OnInit(){
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason){
 
  }

void OnTick(){
   
   double myMovingAverageArray1[],myMovingAverageArray2[];
   int movingAverageDefenition1 = iMA (_Symbol,_Period,MASignalPerioden,0,MODE_SMA,PRICE_CLOSE);
   int movingAverageDefenition2 = iMA (_Symbol,_Period,MABasisPerioden,0,MODE_SMA,PRICE_CLOSE);
   ArraySetAsSeries(myMovingAverageArray1,true);
   ArraySetAsSeries(myMovingAverageArray2,true);
   CopyBuffer(movingAverageDefenition1,0,0,3,myMovingAverageArray1);
   CopyBuffer(movingAverageDefenition2,0,0,3,myMovingAverageArray2);
   
   
   
   if (
      (myMovingAverageArray1[0]<myMovingAverageArray2[0])
    &&(myMovingAverageArray1[1]>myMovingAverageArray2[1])
      )
        {
         if(isLongTrade){
         trade.PositionClose(_Symbol);
         isLongTrade = false;
         }
         if (!isShortTrade) isShortTrade = executeShort();
        }
    
   else if (
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
    &&(myMovingAverageArray1[1]<myMovingAverageArray2[1])
      )
         {
         if(isShortTrade){
         trade.PositionClose(_Symbol);
         isShortTrade = false;
   }         
   
      if (!isLongTrade) isLongTrade = executeLong();
         }    
 
 
 bool executeShort(){
 
   double atr[] = {0};
   int atrHandle = iATR(_Symbol,PERIOD_CURRENT,ATRPeriode);
   CopyBuffer(atrHandle,0,0,1,atr);
   if(atr[0] <= ATRMin) return 1;
   if(atr[0] >= ATRMax) return 1;
 
   double entry = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   
   double sl = entry + SLPoints * _Point;
   
   double tp = entry - TPPoints * _Point;
 
   bool res;
   res = trade.Sell(Cfd,_Symbol,entry,sl,tp,Kommentar);
   return res;
 }
 
 bool executeLong(){
 
   double atr[] = {0};
   int atrHandle = iATR(_Symbol,PERIOD_CURRENT,ATRPeriode);
   CopyBuffer(atrHandle,0,0,1,atr);
   if(atr[0] <= ATRMin) return 1;
   if(atr[0] >= ATRMax) return 1;
 
   double entry = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   
   double sl = entry - SLPoints * _Point;
   
   double tp = entry + TPPoints * _Point;
 
   bool res;
   res = trade.Buy(Cfd,_Symbol,entry,sl,tp,Kommentar);
   return res;
 }
 
 void ChangePosition() 
 
 double StopLossTemp;
 
 {  
 
 if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            if( PositionGetDouble(POSITION_PRICE_CURRENT) > PositionGetDouble(POSITION_SL)+TrailingStop ) {
               StopLossTemp = PositionGetDouble(POSITION_PRICE_CURRENT) - PositionGetDouble(POSITION_SL)+TrailingStop;
               ChangePosition(PositionGetDouble(POSITION_SL)+TrailingStop);
            }
         } 
 
    else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            if( PositionGetDouble(POSITION_PRICE_CURRENT) < PositionGetDouble(POSITION_SL)-TrailingStop ) {
               StopLossTemp = PositionGetDouble(POSITION_PRICE_CURRENT) + PositionGetDouble(POSITION_SL)-TrailingStop;
               ChangePosition(PositionGetDouble(POSITION_SL)-TrailingStop);
            }
         }
       }


Fehler

 

Hallo,


ich sehe hier keinen Trailingstop. Ich vermute das dieser durch die 

void ChangePosition() 
 
 double StopLossTemp;
 
 {  
 
 if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            if( PositionGetDouble(POSITION_PRICE_CURRENT) > PositionGetDouble(POSITION_SL)+TrailingStop ) {
               StopLossTemp = PositionGetDouble(POSITION_PRICE_CURRENT) - PositionGetDouble(POSITION_SL)+TrailingStop;
               ChangePosition(PositionGetDouble(POSITION_SL)+TrailingStop);
            }
         } 
 
    else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            if( PositionGetDouble(POSITION_PRICE_CURRENT) < PositionGetDouble(POSITION_SL)-TrailingStop ) {
               StopLossTemp = PositionGetDouble(POSITION_PRICE_CURRENT) + PositionGetDouble(POSITION_SL)-TrailingStop;
               ChangePosition(PositionGetDouble(POSITION_SL)-TrailingStop);
            }
         }
       }

ausgeführt werden soll. Hie wird aber nur abgefragt ob die Position Buy oder Sell ist. Das alleine funktioniert schon nicht, weil du zuerst die Position selektieren musst und diese dann auszuwählen.


des weiteren besteht ein Unterschied ob du MT5 im Netting oder im Hedge Modus betreibst


Hier der Code den ich verwende für Trailingstop. Dieser wird dann in der OnTick aufgerufen


void TrailingStopExpert(const string symbol,const ulong magicnumber,const int trailingstop) //ist eigentlich eine Position Modify funktion, nur eben für den Hedge mode
  {

   MqlTradeRequest request;
   MqlTradeResult  result;

   MqlTick tick;
   if(!SymbolInfoTick(Symbol(),tick)) GetLastError();

   int total=PositionsTotal(); // Anzahl offener Positionen   
//--- in allen offenen Positionen suchen

   if(PositionSelect(_Symbol)==true)
     {
      for(int i=0; i<total; i++)
        {
         //--- Parameter der Order
         PositionSelect(_Symbol);
         ulong  position_ticket=PositionGetTicket(i);// das Ticket der Position
         string position_symbol=PositionGetString(POSITION_SYMBOL); // Symbol 
         ulong  magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber der Position
                                                          //

         // Print(PositionGetInteger(POSITION_TYPE));
         // Print("TS: ", tick.bid+trailingstop*_Point," Pos SL: ", PositionGetDouble(POSITION_SL)," MN: ", magicnumber);
         if(position_symbol==symbol && 
            magic==magicnumber && 
            PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL && 
            (tick.bid+trailingstop*_Point)<PositionGetDouble(POSITION_SL)
            )
           {
           // Print(PositionGetDouble(POSITION_SL));
            ZeroMemory(request);
            ZeroMemory(result);
            //--- Parameter der Transaktion setzen
            request.action=TRADE_ACTION_SLTP; // Typ der Transaktion
            request.position = position_ticket;   // das Ticket der Position
            request.symbol = position_symbol;     // Symbol 
            request.sl=(tick.bid+trailingstop*_Point);                // Stop Loss der Position
            request.tp=PositionGetDouble(POSITION_TP);                // Take Profit der Position
            request.magic=magicnumber;         // MagicNumber der Position

            //Print(tick.bid+trailingstop*_Point," ",PositionGetDouble(POSITION_SL));
            //Print("Trailing Done Short");
            if(!OrderSend(request,result))
               PrintFormat("OrderSend error %d",GetLastError());  // wenn die Anfrage konnte nicht gesendet werden, den Fehlercode anzeigen
            //--- Details zur Transaktion   
            //PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
           }

         if(position_symbol==symbol && 
            magic==magicnumber && 
            PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY && 
            (tick.ask-trailingstop*_Point)>PositionGetDouble(POSITION_SL)
            )
           {
            //Print(PositionGetDouble(POSITION_SL));
            ZeroMemory(request);
            ZeroMemory(result);
            //--- Parameter der Transaktion setzen
            request.action=TRADE_ACTION_SLTP; // Typ der Transaktion
            request.position = position_ticket;   // das Ticket der Position
            request.symbol = position_symbol;     // Symbol 
            request.sl=tick.ask-trailingstop*_Point;                // Stop Loss der Position
            request.tp=PositionGetDouble(POSITION_TP);                // Take Profit der Position
            request.magic=magicnumber;         // MagicNumber der Position

            //Print(tick.bid-trailingstop*_Point," ",PositionGetDouble(POSITION_SL));
            //Print("Trailing Done Long");
            if(!OrderSend(request,result))
               PrintFormat("OrderSend error %d",GetLastError());  // wenn die Anfrage konnte nicht gesendet werden, den Fehlercode anzeigen
            //--- Details zur Transaktion   
            //PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
           }
         //Print("Trailing Done");
        }
     }
  }
 

Vielen Dank für den Code!

Ich habe ihn anstelle des alten Codes eingefügt, keine Probleme beim kompilieren.

Wie wird hier die Größe des Trailing Stops, also der Abstand der zum aktuellen Kurs besteht festgelegt?