//+------------------------------------------------------------------+
//|                             Any_Timeframe_Usmanshafeen_Alert.mq4 |
//|                                         Copyright @ BestTraderEv |
//|                        https://www.forexfactory.com/besttraderev |
//+------------------------------------------------------------------+
#property copyright "Copyright @ BestTraderEv"
#property link      "https://www.forexfactory.com/besttraderev"
#property version   "1.00"
#property strict
#property indicator_chart_window

input bool            alertsMessage    = true;            // Alerts should show pop-up message
input bool            alertsPushNotif  = false;           // Alerts should send push notification
input int             MAPeriod         = 10;              // Period of Moving Average
input ENUM_MA_METHOD  MAMethod         = MODE_EMA;        // Method of Moving Average
input ENUM_APPLIED_PRICE MAPrice       = PRICE_CLOSE;     // Price of Moving Average
input bool            PlotArrow        = false;
input int             BuyArrCode       = 241;
input color           BuyArrowClr      = clrLime; 
input int             SellArrCode      = 242;
input color           SellArrowClr     = clrRed;
input int             ArrowSize        = 3;

string BuyArrName = "ATUA_Buy_Arrow_";
string SellArrName = "ATUA_Sell_Arrow_";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
                 if(PlotArrow)
                  {
                 ObjectCreate(ChartID(),BuyArrName,OBJ_ARROW,0,0,0);
                 ObjectSetInteger(ChartID(),BuyArrName,OBJPROP_ARROWCODE,BuyArrCode);
                 ObjectSetInteger(ChartID(),BuyArrName,OBJPROP_COLOR,BuyArrowClr);
                 ObjectSetInteger(ChartID(),BuyArrName,OBJPROP_WIDTH,ArrowSize);
                 ObjectSetInteger(ChartID(),BuyArrName,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
                 
                 ObjectCreate(ChartID(),SellArrName,OBJ_ARROW,0,0,0);
                 ObjectSetInteger(ChartID(),SellArrName,OBJPROP_ARROWCODE,SellArrCode);
                 ObjectSetInteger(ChartID(),SellArrName,OBJPROP_COLOR,SellArrowClr);
                 ObjectSetInteger(ChartID(),SellArrName,OBJPROP_WIDTH,ArrowSize);
                 ObjectSetInteger(ChartID(),SellArrName,OBJPROP_ANCHOR,ANCHOR_TOP);
                  }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
                double Ema = iMA(_Symbol,PERIOD_CURRENT,MAPeriod,0,MAMethod,MAPrice,1);
                
               if(IsNewBar(PERIOD_CURRENT))
                { 
                if(Bid>Ema&&
                   iClose(_Symbol,PERIOD_CURRENT,2)<iOpen(_Symbol,PERIOD_CURRENT,2)&&
                   iClose(_Symbol,PERIOD_CURRENT,1)>iOpen(_Symbol,PERIOD_CURRENT,1)&&
                   iLow(_Symbol,PERIOD_CURRENT,1)<iLow(_Symbol,PERIOD_CURRENT,2)&&
                   iClose(_Symbol,PERIOD_CURRENT,1)>iClose(_Symbol,PERIOD_CURRENT,2))
                 {
                 if(alertsMessage)
                 Alert(_Symbol+" "+Tf_as_string(PERIOD_CURRENT)+" Usmanshafeen_Alert Buy setup!");
                 if(alertsPushNotif)
                 SendNotification(_Symbol+" "+Tf_as_string(PERIOD_CURRENT)+" Usmanshafeen_Alert Buy setup!");
                 ObjectSetDouble(ChartID(),BuyArrName,OBJPROP_PRICE,iClose(_Symbol,PERIOD_CURRENT,1));
                 ObjectSetInteger(ChartID(),BuyArrName,OBJPROP_TIME,iTime(_Symbol,PERIOD_CURRENT,1));
                 }
                else
                if(Ask<Ema&&
                   iClose(_Symbol,PERIOD_CURRENT,2)>iOpen(_Symbol,PERIOD_CURRENT,2)&&
                   iClose(_Symbol,PERIOD_CURRENT,1)<iOpen(_Symbol,PERIOD_CURRENT,1)&&
                   iHigh(_Symbol,PERIOD_CURRENT,1)>iHigh(_Symbol,PERIOD_CURRENT,2)&&
                   iClose(_Symbol,PERIOD_CURRENT,1)<iClose(_Symbol,PERIOD_CURRENT,2))
                 {
                 if(alertsMessage)
                 Alert(_Symbol+" "+Tf_as_string(PERIOD_CURRENT)+" Usmanshafeen_Alert Sell setup!");
                 if(alertsPushNotif)
                 SendNotification(_Symbol+" "+Tf_as_string(PERIOD_CURRENT)+" Usmanshafeen_Alert Sell setup!");
                 ObjectSetDouble(ChartID(),SellArrName,OBJPROP_PRICE,iClose(_Symbol,PERIOD_CURRENT,1));
                 ObjectSetInteger(ChartID(),SellArrName,OBJPROP_TIME,iTime(_Symbol,PERIOD_CURRENT,1));
                 }
                }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
bool IsNewBar(ENUM_TIMEFRAMES per)
{ 
  static datetime Trend_Candle_prevTime1 = -1;
  
  if(Trend_Candle_prevTime1 != iTime(_Symbol,per,6))
  { 
   Trend_Candle_prevTime1 = iTime(_Symbol,per,6); 
       
   return(true);  
  } 

  return(false); 
}
//+------------------------------------------------------------------+
string   Tf_as_string(ENUM_TIMEFRAMES period){
   if(period == PERIOD_CURRENT)  period   = (ENUM_TIMEFRAMES) _Period;
   string   period_xxx  = EnumToString(period);                // PERIOD_XXX
   return StringSubstr(period_xxx, 7);                         // XXX
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
 ObjectDelete(ChartID(),BuyArrName);
 ObjectDelete(ChartID(),SellArrName);
 }
//+------------------------------------------------------------------+
