Im in Need of Help with this Function

 

Hi,

Im writing a function for an EA that upon change of trend it will sum all the opened trades and open an order in the opposit direction with a new magic number. This order will only close when the trend changes again. For some reason it is opening multiple orders with the right amount of lots(the sum). What am i doing wrong?

Here is the function:

void WatchDog() {
   
   double WatchDogLotsBuy = 0;
   double WatchDogLotsSell = 0;
   int OpenBuyOrders = 0;
   int OpenSellOrders = 0;

   if ((IRSI > HighRSILevel) && (XO > 0)) { // BUY ONLY 
      // Opening Watchdog Orders   
      for (int e=0; e<OrdersTotal(); e++) {
         if ( OrderSelect(e,SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){  
            if ((OrderComment() == "WatchDogBuy") || (OrderComment() == "WatchDogSell")) break; 
            if(OrderType()==OP_SELL){
               WatchDogLotsSell = OrderLots() + WatchDogLotsSell;
            }   
         //OpenBuyOrders = 1;
         }
      }
      if ( WatchDogLotsSell > 0){
         WatchDogLotsSell = NormalizeDouble(WatchDogLotsSell,LotDigits);
         OrderSend(Symbol(), OP_BUY, WatchDogLotsSell , Ask, SLIPPAGE(), 0, 0, "WatchDogBuy", Magic+8, 0, CLR_NONE);
         Print("Request to Open BUY Watchdog Order w/ " , DoubleToStr(WatchDogLotsSell,LotDigits) , " Lots" ); 
      }
   }
   
   
   if ((IRSI < LowRSILevel) && (XO < 0)) {  // SELL ONLY 
      // Opening Watchdog Orders   
      for (int s=0; s<OrdersTotal(); s++) {
         if ( OrderSelect(s,SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){  
            if ((OrderComment() == "WatchDogBuy") || (OrderComment() == "WatchDogSell")) break; 
            if(OrderType()==OP_BUY){
               WatchDogLotsBuy = OrderLots() + WatchDogLotsBuy;
            }   
         //OpenSellOrders = 1;   
         }
      }
      if ( WatchDogLotsBuy > 0){
         WatchDogLotsBuy = NormalizeDouble(WatchDogLotsBuy,LotDigits);
         OrderSend(Symbol(), OP_SELL, WatchDogLotsBuy , Bid, SLIPPAGE(), 0, 0, "WatchDogSell", Magic+8, 0, CLR_NONE);
         Print("Request to Open SELL Watchdog Order w/ " , DoubleToStr(WatchDogLotsBuy,LotDigits) , " Lots" ); 
      }
   }   
   // END Opening Watchdog Orders   
   
   // CLOSING Watchdog Orders   // DO IT BY TICKET NUMBER
   for (int c=0; c<OrdersTotal(); c++) {
      if ( OrderSelect(c,SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic+8)) {  
         
         if((OrderType()==OP_BUY) && ((IRSI < LowRSILevel) && (XO < 0)) && (OrderComment() == "WatchDogBuy")) {   // CLOSING BUY ORDERS
            OrderClose(OrderTicket(),OrderLots(),Bid,SLIPPAGE(),CLR_NONE);
            Print("Request to Close BUY Watchdog Order" ); 
         }
         
         if((OrderType()==OP_SELL) && ((IRSI > HighRSILevel) && (XO > 0)) && (OrderComment() == "WatchDogSell")) {   // CLOSING SELL ORDERS
            OrderClose(OrderTicket(),OrderLots(),Ask,SLIPPAGE(),CLR_NONE);   
            Print("Request to Close SELL Watchdog Order" ); 
         }
       }
   }
      
   // END CLOSING Watchdog ORDERS
}

 

I think that your code doesn't work the way that you expect because you are assuming that, if the order exists, the first order selected will have the WatchDogBuy" or WatchDogSell" comment.

If that is not the case, then WatchDogLotsSell will be added to, until the commented trade is selected

Maybe change

if ((OrderComment() == "WatchDogBuy") || (OrderComment() == "WatchDogSell")) break; 

to

if ((OrderComment() == "WatchDogBuy") || (OrderComment() == "WatchDogSell")) 
   {
   WatchDogLotsSell = 0;
   break;
   }
 

Also, although I have never seen this happen, there is a risk that the broker may change part of the comment, so can make it risky when you use OrderComment to identify a trade.

Why not use a different magic number instead?

Reason: