//+------------------------------------------------------------------+
//|                                            Yang_Trader_Alert.mq4 |
//|                                        Modified by Explosionkibo |
//+------------------------------------------------------------------+
#property copyright "Modified by XplosionKibo @ FF"
#property indicator_separate_window
#property indicator_buffers 1

extern int                 TimeWindow           = 34;
extern int                 Sensitivity          = 5;
extern ENUM_MA_METHOD      Ma_Method            = MODE_EMA;
extern color               Line_Color           = clrRoyalBlue;
extern ENUM_LINE_STYLE     Line_Style           = STYLE_SOLID;
extern int                 Line_Thickness       = 0; 
extern double              OB_Level             = 50;
extern double              OS_Level             = 50;
extern double              RG_Level1            = 50;
extern double              RG_Level2            = 50;
extern ENUM_LINE_STYLE     Level_Style          = STYLE_DOT;
extern color               Level_Color          = clrDarkSlateGray;
extern int                 Level_Thickness      = 0;
extern bool                Alert_Entering_OB    = false;
extern bool                Alert_Exiting_OB     = false;
extern bool                Alert_Entering_OS    = false;
extern bool                Alert_Exiting_OS     = false;
extern bool                Alert_Entering_RG    = true;
extern bool                Alert_Exiting_RG     = true;
extern int                 Alert_Shift          = 1;
extern bool                Message_Alerts       = true;
extern bool                Send_Email           = true;
extern bool                Audible_Alerts       = true;
extern bool                Push_Notifications   = true;
extern string              Sound_File           = "alert.wav";

datetime time_alert;
double   buf[];
double   buf2[];

void myAlert(string type, string message)
   {
   int handle;
   if(type == "print")
   Print(message);
   else if(type == "error")
   {Print(type+" | Yang_Trader_Alert @ "+Symbol()+","+IntegerToString(Period())+" | "+message);}
   else if(type == "indicator")
         {
   Print(type+" | Yang_Trader_Alert @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
   if(Audible_Alerts) PlaySound(Sound_File);
   if(Message_Alerts) Alert(type+" | Yang_Trader_Alert @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
   if(Send_Email) SendMail("Yang_Trader_Alert", type+" | Yang_Trader_Alert @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
   handle = FileOpen("Yang_Trader_Alert.txt", FILE_TXT|FILE_READ|FILE_WRITE|FILE_SHARE_READ|FILE_SHARE_WRITE, ';');
   if(handle != INVALID_HANDLE)
      {
   FileSeek(handle, 0, SEEK_END);
   FileWrite(handle, type+" | Yang_Trader_Alert @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
   FileClose(handle);
      }
   if(Push_Notifications) SendNotification(type+" | Yang_Trader_Alert @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
         }
   }

int init()
  {
   SetIndexBuffer(0,buf);
   ArraySetAsSeries(buf,true);
   SetIndexStyle(0,DRAW_LINE,Line_Style,Line_Thickness,Line_Color);
   IndicatorShortName("("+IntegerToString(TimeWindow,1)+","+IntegerToString(Sensitivity,1)+") "+"Yang_Trader_Alert");
   SetLevelValue(0, OB_Level);
   SetLevelValue(1, OS_Level);
   SetLevelValue(2, RG_Level1);
   SetLevelValue(3, RG_Level2);
   SetLevelStyle(Level_Style,Level_Thickness,Level_Color);
   return(0);
  }

int start()
  {
   int limit=Bars;

   ArrayResize(buf2,limit); 
   ArraySetAsSeries(buf2,true);
   for(int i=0; i<limit; i++)
    {
    double HHV=High[iHighest(NULL,0,MODE_HIGH,TimeWindow,i)];
    double LLV=Low[iLowest(NULL,0,MODE_LOW,TimeWindow,i)]; 
    buf2[i]=100*(Close[i]-LLV)/(HHV-LLV);
    }
   ArrayResize(buf,limit); 
   ArraySetAsSeries(buf,true);
   for(i=0; i<limit; i++) 
   buf[i]=iMAOnArray(buf2,limit,Sensitivity,0,Ma_Method,i);  
   
    
   for (i=Bars; i>=0; i--)
   {
   if(buf[i+Alert_Shift]>OB_Level && buf[i+1+Alert_Shift]<=OB_Level && Alert_Entering_OB==true)
   {if(i==0 && Time[0]!=time_alert) { myAlert("indicator", "Entering_OB"); time_alert=Time[0];}}
   if(buf[i+Alert_Shift]<OB_Level && buf[i+1+Alert_Shift]>=OB_Level && Alert_Exiting_OB==true)
   {if(i==0 && Time[0]!=time_alert) { myAlert("indicator", "Exiting_OB"); time_alert=Time[0];}}
  
   if(buf[i+Alert_Shift]<OS_Level && buf[i+1+Alert_Shift]>=OS_Level && Alert_Entering_OS==true)
   {if(i==0 && Time[0]!=time_alert) { myAlert("indicator", "Entering_OS"); time_alert=Time[0];}}
   if(buf[i+Alert_Shift]>OS_Level && buf[i+1+Alert_Shift]<=OS_Level && Alert_Exiting_OS==true)
   {if(i==0 && Time[0]!=time_alert) { myAlert("indicator", "Exiting_OS"); time_alert=Time[0];}}
  
   if(buf[i+Alert_Shift]<RG_Level1 && buf[i+1+Alert_Shift]>=RG_Level1 && Alert_Entering_RG==true)
   {if(i==0 && Time[0]!=time_alert) { myAlert("indicator", "Sell"); time_alert=Time[0];}}
   if(buf[i+Alert_Shift]>RG_Level2 && buf[i+1+Alert_Shift]<=RG_Level2 && Alert_Entering_RG==true)
   {if(i==0 && Time[0]!=time_alert) { myAlert("indicator", "Buy"); time_alert=Time[0];}}
   
   if(buf[i+Alert_Shift]>RG_Level1 && buf[i+1+Alert_Shift]<=RG_Level1 && Alert_Exiting_RG==true)
   {if(i==0 && Time[0]!=time_alert) { myAlert("indicator", "Buy"); time_alert=Time[0];}}
   if(buf[i+Alert_Shift]<RG_Level2 && buf[i+1+Alert_Shift]>=RG_Level2 && Alert_Exiting_RG==true)
   {if(i==0 && Time[0]!=time_alert) { myAlert("indicator", "Sell"); time_alert=Time[0];}}
      
   }
   
   return(0);
   }