MA creating multiple tradings

 

Hello,

im pretty new in creating signals. I have to backtesting strategies for multiple commodities..

First i wanted to start with simple MA crossover but problem is that MT4 is creating me multiple trades insead of one i want at cross of MAs.

can you please fix this for me. I just want one trade opened at cross (when the conditions are met) and closed at opposite cross of MAs. Now its making multiple trades during fast MA is under slow MA and opposite (depends on buy or sell), in another words every  single following price when conditions are met its trigering new trades.

 For now i dont care about SL and TP i just need to fix this. Cross = Open one trade ---> Opposite cross = Close that trade. 

thank you for help and time.  

int start()
{
  double MyPoint=Point;
  if(Digits==3 || Digits==5) MyPoint=Point*10;
  
  double TheStopLoss=0;
  double TheTakeProfit=0;
  if( TotalOrdersCount()==0 ) 
  {
     int result=0;
     if((iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,0)>iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0))) // Here is your open buy rule
     {
        result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"EA Generator www.ForexEAdvisor.com",MagicNumber,0,Blue);
        if(result>0)
        {
         TheStopLoss=0;
         TheTakeProfit=0;
         if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;
         if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;
         OrderSelect(result,SELECT_BY_TICKET);
         OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
     }
     if((iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0)>iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,0))) // Here is your open Sell rule
     {
        result=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"EA Generator www.ForexEAdvisor.com",MagicNumber,0,Red);
        if(result>0)
        {
         TheStopLoss=0;
         TheTakeProfit=0;
         if(TakeProfit>0) TheTakeProfit=Bid-TakeProfit*MyPoint;
         if(StopLoss>0) TheStopLoss=Bid+StopLoss*MyPoint;
         OrderSelect(result,SELECT_BY_TICKET);
         OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
     }
  }
  
  for(int cnt=0;cnt<OrdersTotal();cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol() &&
         OrderMagicNumber()==MagicNumber 
         )  
        {
         if(OrderType()==OP_BUY)  
           {
              if((iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,0)<iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0))) //here is your close buy rule
              {
                   OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
              }
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-MyPoint*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
                if((iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,0)<iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0))) // here is your close sell rule
                {
                   OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
                }
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
}

int TotalOrdersCount()
{
  int result=0;
  for(int i=0;i<OrdersTotal();i++)
  {
     OrderSelect(i,SELECT_BY_POS ,MODE_TRADES);
     if (OrderMagicNumber()==MagicNumber) result++;

   }
  return (result);
}
 
Use loop to count opened trades and thus put limits on how much to open the trades.
 

Hey,

as i said im pretty new in this, can you specified where i can put limits? as i said i want just one trade per trade signal, if u ran this script you can see, its opening trade at every new close price if the conditions are met.

 

thanks  

 

This forum is mainly about coders helping coders.

You will find people very helpful when you post your own efforts at coding.

Not many are prepared to correct code created by an EA builder 

 
Influenza: can you specified where i can put limits?
Move your trailing stop code up above your signal code.
Reason: