EMA crossing - unlogicly opend position

 
Hello, After back test my EMA crossing EA I noticed that some trades where opend on a long position but they should be short and contra. It is most probably becouse the EMAs has just touched not crossed. Can somebody please help me to solve this problem?
Thank you Punta.

Here are my trading conditions:

// check for long position (BUY) possibility
if(MaPreviousMid<MaPreviousLong && MaCurrentMid>MaCurrentLong)
// should it be closed?
if((MaPreviousMid>=MaPreviousLong && MaCurrentMid<=MaCurrentLong)
||(MaCurrentMid==MaCurrentLong))

// check for short position (SELL) possibility
if(MaPreviousMid>MaPreviousLong && MaCurrentMid<MaCurrentLong)
// should it be closed?
if((MaPreviousMid<=MaPreviousLong && MaCurrentMid>=MaCurrentLong)
||(MaCurrentMid==MaCurrentLong))



//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

extern double TakeProfit = 1000;
extern double Lots = 0.1;
extern double TrailingStop = 500;
extern double Slip = 0.0002;


extern double StopLoss = 0.002;
extern double MATrendPeriodMid=73;
extern double MATrendPeriodLong= 115;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
 
   double 
   MaCurrentMid, MaPreviousMid, MaPreviousMid2, MaPreviousMid4, MaPreviousMid6, MaPreviousMid8 ,MaPreviousMid10,
   MaPreviousMid12,MaPreviousMid18,MaPreviousMid24,MaPreviousMid30,MaPreviousMid36,MaPreviousMid50, 
   
   MaCurrentLong, MaPreviousLong, MaPreviousLong2,MaPreviousLong4,MaPreviousLong6,MaPreviousLong8,MaPreviousLong10, 
   MaPreviousLong12, MaPreviousLong18, MaPreviousLong24, MaPreviousLong30,MaPreviousLong36,MaPreviousLong50, stoplevel;
   
   int cnt, ticket, total;
 
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
   if(Bars<100)
     { 
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
// to simplify the coding and speed up access
// data are put into internal variables

   

   
   
   MaCurrentMid=iMA(NULL,0,MATrendPeriodMid,0,MODE_EMA,PRICE_CLOSE,0);
   MaPreviousMid=iMA(NULL,0,MATrendPeriodMid,0,MODE_EMA,PRICE_CLOSE,1);

    
   MaCurrentLong=iMA(NULL,0,MATrendPeriodLong,0,MODE_EMA,PRICE_CLOSE,0);
   MaPreviousLong=iMA(NULL,0,MATrendPeriodLong,0,MODE_EMA,PRICE_CLOSE,1);
 

   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      
      if(MaPreviousMid<MaPreviousLong && MaCurrentMid>MaCurrentLong) //mid protne long
      
      
        
         {ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         if(ticket>0)
                    {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
              }
               
      // check for short position (SELL) possibility
      
    if(MaPreviousMid>MaPreviousLong && MaCurrentMid<MaCurrentLong)
       
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
      }
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
     
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
           
            if((MaPreviousMid>=MaPreviousLong && MaCurrentMid<=MaCurrentLong)
               ||(MaCurrentMid==MaCurrentLong))
         // ||(Bid-OrderOpenPrice()<(StopLoss)))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
            // check for trailing stop
        
           if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0); 
                    }  
                 }    
              }  
           }
         else // go to short position
           {
            // should it be closed?
         
         if((MaPreviousMid<=MaPreviousLong && MaCurrentMid>=MaCurrentLong)
            ||(MaCurrentMid==MaCurrentLong))
     //  ||((OrderOpenPrice()-Ask)<(StopLoss,)))
  
           
                   {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for trailing stop
           
                  
            
            
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }

// the end.
 
you use shift 0 that's why

try this
MaCurrentMid=iMA(NULL,0,MATrendPeriodMid,0,MODE_EMA,PRICE_CLOSE,1);
MaPreviousMid=iMA(NULL,0,MATrendPeriodMid,0,MODE_EMA,PRICE_CLOSE,2);

MaCurrentLong=iMA(NULL,0,MATrendPeriodLong,0,MODE_EMA,PRICE_CLOSE,1);
MaPreviousLong=iMA(NULL,0,MATrendPeriodLong,0,MODE_EMA,PRICE_CLOSE,2);
 
doshur:
you use shift 0 that's why

try this
MaCurrentMid=iMA(NULL,0,MATrendPeriodMid,0,MODE_EMA,PRICE_CLOSE,1);
MaPreviousMid=iMA(NULL,0,MATrendPeriodMid,0,MODE_EMA,PRICE_CLOSE,2);

MaCurrentLong=iMA(NULL,0,MATrendPeriodLong,0,MODE_EMA,PRICE_CLOSE,1);
MaPreviousLong=iMA(NULL,0,MATrendPeriodLong,0,MODE_EMA,PRICE_CLOSE,2);



Thanks a lot for a fast answer.It is now working as I want. Im newby and is many things that I need to learn.
 
Punta wrote >>


Thanks a lot for a fast answer.It is now working as I want. Im newby and is many things that I need to learn.


then look and learn about the shift :-)
0 is always the current bar, and the price change until the bar is finished / closed
1 is the last closed bar before
2 is again 1 before .. etc :-)
 
I see you are quite interested in a moving average crossover system

you can see my stuff here

http://www.facebook.com/group.php?gid=203994363361
https://www.forex-tsd.com/expert-advisors-metatrader-4/24496-rangerfx.html
 
EADeveloper:


then look and learn about the shift :-)
0 is always the current bar, and the price change until the bar is finished / closed
1 is the last closed bar before
2 is again 1 before .. etc :-)


Ok no more zero shifts :) I didnt wanted to use becouse I thougt that it could slow EAs reactions.
Reason: