Support_Resistance_Alert

Author: Copyright 2022, D4rk Ryd3r
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the highest prices of each barSeries array that contains the lowest prices of each barSeries array that contains the lowest prices of each bar
0 Views
0 Downloads
0 Favorites
Support_Resistance_Alert
//+------------------------------------------------------------------+
//|                                     Support_Resistance_Alert.mq5 |
//|                                       Copyright 2022, D4rk Ryd3r |
//|                                    https://twitter.com/DarkRyd3r |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, D4rk Ryd3r"
#property link      "https://twitter.com/DarkRyd3r"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
// Alert Methods
input bool popup_alerts = true; // Enable PopUp Alerts
input bool send_push = false; // Enable Push Notification
input color InpColorSupport = clrLimeGreen; // Support Color
input color InpColorResistance = clrCrimson; // Resistance Color
input ENUM_LINE_STYLE InpSupportStyle = STYLE_SOLID; // Support Line Style
input ENUM_LINE_STYLE InpResistanceStyle = STYLE_SOLID; // Resistance Line Style
input int SupportWidth = 3; // Support Width
input int ResistanceWidth = 3; // Resistance Width

MqlTick m_tick;
string now;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
   EventSetTimer(1);
   if(!SymbolInfoTick(Symbol(),m_tick))
      return(INIT_SUCCEEDED);
   if(m_tick.bid==0.0)
      return(INIT_SUCCEEDED);
   HLineCreate(0,"Resistance",0,m_tick.bid+50*Point(),InpColorResistance,InpResistanceStyle,ResistanceWidth);
   HLineCreate(0,"Support",0,m_tick.bid-50*Point(),InpColorSupport,InpSupportStyle,SupportWidth);
//---
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//--- destroy timer
   EventKillTimer();
//---
   HLineDelete(0,"Resistance");
   HLineDelete(0,"Support");
//---

}
//+------------------------------------------------------------------+
//| 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[]) {

      return(rates_total);
   }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer() {
//---
   now=TimeToString(TimeLocal(),TIME_SECONDS);
   double High = iHigh(Symbol(),PERIOD_M1,0);
   double Low = iLow(Symbol(),PERIOD_M1,0);
   if(ObjectFind(0,"Resistance")<0)
      HLineCreate(0,"Resistance",0,m_tick.bid+50*Point(),InpColorResistance,InpResistanceStyle,ResistanceWidth);
   if(ObjectFind(0,"Support")<0)
      HLineCreate(0,"Support",0,m_tick.bid-50*Point(),InpColorSupport,InpSupportStyle,SupportWidth);

   if(High>=ObjectGetDouble(0,"Resistance",OBJPROP_PRICE,0) && Low<=ObjectGetDouble(0,"Resistance",OBJPROP_PRICE,0)) {
      DoAlert(Symbol() +" Resistance touched at "+ DoubleToString(m_tick.bid,(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS)) + " " + now);
      HLineDelete(0,"Resistance");
   }
   if(High>=ObjectGetDouble(0,"Support",OBJPROP_PRICE,0) && Low<=ObjectGetDouble(0,"Support",OBJPROP_PRICE,0)) {
      DoAlert(Symbol() +" Support touched at "+ DoubleToString(m_tick.bid,(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS)) + " " + now);
      HLineDelete(0,"Support");
   }
//---
}
//+------------------------------------------------------------------+
//| Create the horizontal line                                       |
//+------------------------------------------------------------------+
bool HLineCreate(const long            chart_ID=0,        // chart's ID
                 const string          name="HLine",      // line name
                 const int             sub_window=0,      // subwindow index
                 double                price=0,           // line price
                 const color           clr=clrRed,        // line color
                 const ENUM_LINE_STYLE style=STYLE_DASHDOTDOT,// line style
                 const int             width=1,           // line width
                 const bool            back=false,        // in the background
                 const bool            selection=true,    // highlight to move
                 const bool            hidden=true,       // hidden in the object list
                 const long            z_order=0) {       // priority for mouse click
//--- if the price is not set, set it at the current Bid price level
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- reset the error value
   ResetLastError();
//--- create a horizontal line
   if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price)) {
      Print(__FUNCTION__,
            ": failed to create a horizontal line! Error code = ",GetLastError());
      return(false);
   }
//--- set line color
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- set line display style
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- set line width
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- display in the foreground (false) or background (true)
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- enable (true) or disable (false) the mode of moving the line by mouse
//--- when creating a graphical object using ObjectCreate function, the object cannot be
//--- highlighted and moved by default. Inside this method, selection parameter
//--- is true by default making it possible to highlight and move the object
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- hide (true) or display (false) graphical object name in the object list
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- set the priority for receiving the event of a mouse click in the chart
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- successful execution
   return(true);
}

//+------------------------------------------------------------------+
//| Delete a horizontal line                                         |
//+------------------------------------------------------------------+
bool HLineDelete(const long   chart_ID=0,   // chart's ID
                 const string name="HLine") { // line name
//--- reset the error value
   ResetLastError();
//--- delete a horizontal line
   if(!ObjectDelete(chart_ID,name)) {
      Print(__FUNCTION__,
            ": failed to delete a horizontal line! Error code = ",GetLastError());
      return(false);
   }
//--- successful execution
   return(true);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void  DoAlert(string text) {
   if (popup_alerts==true)  Alert (text);
//if (Sound==true )  PlaySound (filename);
   if (send_push==true)  SendNotification(text);
}


//+------------------------------------------------------------------+

Comments