//+------------------------------------------------------------------+
//|                                            MACrossEarlyAlert.mq4 |
//|                                                    Mariano Silva |
//|                                        ms_bfree@yahoo.com.mx     |
//+------------------------------------------------------------------+
#property copyright "Mariano Silva"
#property link      ""

#property indicator_chart_window
//---- input parameters
extern int       FastMAPeriod=3;
extern string    Type="0-SMA, 1-EMA";
extern int       FastMAType=1;
extern int       SlowMAPeriod=34;
extern int       SlowMAType=0;
extern int       EarlyPips=10;
extern int       ResetAlert=20;
extern color     LineColor=Orange;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
  string LineName;
//----
   LineName=StringConcatenate(FastMAPeriod,"/",SlowMAPeriod," MA Cross");
   ObjectDelete(LineName);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//   int    counted_bars=IndicatorCounted();

   double FastMALastBar, SlowMALastBar, PriceToCross, Cross, FastMATest, SlowMATest;
   bool  AlertEnabled=true;
   string LineName=StringConcatenate(FastMAPeriod,"/",SlowMAPeriod," MA Cross");
   
//   LineName=StringConcatenate(FastMAPeriod,"/",SlowMAPeriod," MA Cross");
   
//----
  
   if(NewBar())
   {
      FastMALastBar=iMA(NULL,0,FastMAPeriod,0,FastMAType,PRICE_CLOSE,1);
      SlowMALastBar=iMA(NULL,0,SlowMAPeriod,0,SlowMAType,PRICE_CLOSE,1);
      PriceToCross=Open[0]; 
      Cross=FastMALastBar-SlowMALastBar;

  
      if(Cross>0.0)
         { 
         while(Cross>0.0)
            {
            PriceToCross=PriceToCross-Point;
            FastMATest=CalcMA(FastMAPeriod,FastMAType,PriceToCross,FastMALastBar);
            SlowMATest=CalcMA(SlowMAPeriod,SlowMAType,PriceToCross,SlowMALastBar);
            Cross=FastMATest-SlowMATest;
            }
         } 
      else
         {
         while(Cross<0.0)
            {
            PriceToCross=PriceToCross+Point;
            FastMATest=CalcMA(FastMAPeriod,FastMAType,PriceToCross,FastMALastBar);
            SlowMATest=CalcMA(SlowMAPeriod,SlowMAType,PriceToCross,SlowMALastBar);
            Cross=FastMATest-SlowMATest;
            }
         }
   
   
      ObjectDelete(LineName);
      drawLine(PriceToCross,LineName,LineColor,0);
   
   }
  
   if(AlertEnabled)
      {
      if(MathAbs(Close[0]-PriceToCross)<=EarlyPips*Point)
         {
         Alert("Close to ",FastMAPeriod,"/",SlowMAPeriod," MA Cross on ",Symbol()," ",Period());
         AlertEnabled=false;
         }    
      }
   else
      {
      if(MathAbs(Close[0]-PriceToCross)>=ResetAlert*Point)
         {
         AlertEnabled=true;
         }      
      }   
     


  
   
//----
   return(0);
  }
//+------------------------------------------------------------------+


double CalcMA(int MAPeriod, int MAType, double PriceTest, double LastMA)
   {
   double MA, pr;   
   
   switch(MAType)
      {
      case 0:   
         {
         MA=((LastMA*MAPeriod)-Close[MAPeriod]+PriceTest)/MAPeriod;
         break;
         }
      case 1:
         {
         pr=2.0/(MAPeriod+1);
         MA=PriceTest*pr+LastMA*(1-pr);
         break;
         }
      }   

   return(MA);
   }  
   
void drawLine(double lvl,string name, color Col,int type)
{
            ObjectCreate(name, OBJ_HLINE, 0, Time[0], lvl);//,Time[0],lvl);
            
            if(type == 1)
            ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
            else
            ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);
            
            ObjectSet(name, OBJPROP_COLOR, Col);
            ObjectSet(name,OBJPROP_WIDTH,1);
            
         return;   
}               


bool NewBar()
   {   
	static datetime lastbar;
   	datetime curbar = Time[0];
   	if(lastbar!=curbar)   
		{      
		lastbar=curbar;
	      	return (true);   
		}   
	else   
		{      
		return(false);   
		}
   } 