forked from LengKundee/NUNA
163 lines
7.5 KiB
MQL5
163 lines
7.5 KiB
MQL5
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| 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);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//+------------------------------------------------------------------+
|