ADX CrossingAlertEmail
Download scriptThis script is designed as a technical analysis tool for the MetaTrader trading platform. Its primary purpose is to monitor specific momentum movements in the market and provide visual markers and real-time notifications when certain price trends shift.
Core Logic and Functionality
Market Trend Detection The script utilizes a common technical indicator known as the ADX (Average Directional Index), which is broken down into two specific components: the Plus DI (which tracks upward momentum) and the Minus DI (which tracks downward momentum).
The logic focuses on "crossings" between these two components. When the upward momentum line moves below the downward momentum line, it suggests a shift toward a bearish trend. Conversely, when the upward momentum line moves above the downward momentum line, it suggests a shift toward a bullish trend.
Visual Signaling To help traders identify these moments visually on their charts:
- Buy Signals: When the script detects an upward momentum crossover, it places a specific visual marker (a lime-colored arrow) below the price candle.
- Sell Signals: When the script detects a downward momentum crossover, it places a corresponding visual marker (a red-colored arrow) above the price candle.
Automated Alerts Beyond just providing visual markers, the script is equipped with an automated notification system to ensure traders don't miss significant market movements:
- Sound Alerts: The tool can trigger an audible alarm on your computer the moment a crossover occurs.
- Email Notifications: If enabled, the script can automatically send an email containing the specific price details (Ask and Bid prices), the current time, and the currency pair being traded.
Smart Filtering To prevent the system from overwhelming the user with repetitive notifications, it includes built-in "memory." It tracks whether a signal has already been sent for a specific period and ensures that alerts are only triggered when a genuine change in trend occurs, rather than repeating the same alert multiple times during the same market movement.
//+------------------------------------------------------------------+
//| ADX Crossing.mq4
//| Amir
//| Modified to give alert and send email by MrPip
//+------------------------------------------------------------------+
#property copyright "Author - Amir"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
//---- input parameters
extern int ADXbars=14;
extern int CountBars=350;
extern bool SoundON=true;
extern bool EmailON=false;
//---- buffers
double val1[];
double val2[];
int flagval1 = 0;
int flagval2 = 0;
double b4plusdi,nowplusdi,b4minusdi,nowminusdi;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
IndicatorBuffers(2);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,108);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,108);
SetIndexBuffer(0,val1);
SetIndexBuffer(1,val2);
GlobalVariableSet("AlertTime"+Symbol()+Period(),CurTime());
GlobalVariableSet("SignalType"+Symbol()+Period(),OP_SELLSTOP);
// GlobalVariableSet("LastAlert"+Symbol()+Period(),0);
//----
return(0);
}
int deinit()
{
GlobalVariableDel("AlertTime"+Symbol()+Period());
GlobalVariableDel("SignalType"+Symbol()+Period());
// GlobalVariableDel("LastAlert"+Symbol()+Period());
return(0);
}
//+------------------------------------------------------------------+
//| ADX Crossing |
//+------------------------------------------------------------------+
int start()
{
double tmp=0;
if (CountBars>=Bars) CountBars=Bars;
if (CountBars>=1000) CountBars=950;
SetIndexDrawBegin(0,Bars-CountBars + 12);
SetIndexDrawBegin(1,Bars-CountBars + 12);
int i,shift,counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- initial zero
if(counted_bars<1)
{
for(i=1;i<=CountBars;i++) val1[CountBars-i]=0.0;
for(i=1;i<=CountBars;i++) val2[CountBars-i]=0.0;
}
for (shift = CountBars; shift>=0; shift--)
{
b4plusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_PLUSDI,shift-1);
nowplusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_PLUSDI,shift);
b4minusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_MINUSDI,shift-1);
nowminusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_MINUSDI,shift);
if (b4plusdi>b4minusdi && nowplusdi<nowminusdi)
{
if (shift == 1 && flagval1==0){ flagval1=1; flagval2=0; }
val1[shift]=Low[shift]-5*Point;
}
if (b4plusdi<b4minusdi && nowplusdi>nowminusdi)
{
if (shift == 1 && flagval2==0) { flagval2=1; flagval1=0; }
val2[shift]=High[shift]+5*Point;
}
}
if (flagval1==1 && CurTime() > GlobalVariableGet("AlertTime"+Symbol()+Period()) && GlobalVariableGet("SignalType"+Symbol()+Period())!=OP_BUY)
{
// Print("Last Alert before BUY = ",GlobalVariableGet("LastAlert"+Symbol()+Period()));
// if (GlobalVariableGet("LastAlert"+Symbol()+Period()) < 0.5)
// {
if (SoundON) Alert("BUY signal at Ask=",Ask,", Bid=",Bid,", Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime())," Symbol=",Symbol()," Period=",Period());
if (EmailON) SendMail("BUY signal alert","BUY signal at Ask="+DoubleToStr(Ask,4)+", Bid="+DoubleToStr(Bid,4)+", Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
// }
tmp = CurTime() + (Period()-MathMod(Minute(),Period()))*60;
GlobalVariableSet("AlertTime"+Symbol()+Period(),tmp);
GlobalVariableSet("SignalType"+Symbol()+Period(),OP_SELL);
// GlobalVariableSet("LastAlert"+Symbol()+Period(),1);
}
if (flagval2==1 && CurTime() > GlobalVariableGet("AlertTime"+Symbol()+Period()) && GlobalVariableGet("SignalType"+Symbol()+Period())!=OP_SELL)
{
// Print("Last Alert before SELL = ",GlobalVariableGet("LastAlert"+Symbol()+Period()));
// if (GlobalVariableGet("LastAlert"+Symbol()+Period()) > -0.5)
// {
if (SoundON) Alert("SELL signal at Ask=",Ask,", Bid=",Bid,", Date=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime())," Symbol=",Symbol()," Period=",Period());
if (EmailON) SendMail("SELL signal alert","SELL signal at Ask="+DoubleToStr(Ask,4)+", Bid="+DoubleToStr(Bid,4)+", Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
// }
tmp = CurTime() + (Period()-MathMod(Minute(),Period()))*60;
GlobalVariableSet("AlertTime"+Symbol()+Period(),tmp);
GlobalVariableSet("SignalType"+Symbol()+Period(),OP_BUY);
// GlobalVariableSet("LastAlert"+Symbol()+Period(),-1);
}
return(0);
}
//+------------------------------------------------------------------+
Comments