AIME_5820_Crossover_Alert
Download scriptThis script is a specialized technical analysis tool designed for the MetaTrader trading platform. Its primary purpose is to monitor price movements and provide real-time visual and audible notifications when specific trend-shifting conditions occur.
Core Logic Overview
The script operates by tracking three different "Exponential Moving Averages" (EMAs). These averages smooth out price data to help identify the current momentum of the market. While it tracks three different periods, its primary logic focuses on the interaction between two specific fast-moving averages: one based on a 5-period timeframe and another based on an 8-period timeframe.
How the Analysis Works
The script constantly scans each price bar for a "crossover" event. Here is the breakdown of what it looks for:
- Buy Signals (Bullish Momentum): The tool looks for the moment the 5-period average moves from below the 8-period average to above it. When this happens, it identifies a potential upward shift in momentum.
- Sell Signals (Bearish Momentum): Conversely, it looks for the moment the 5-period average moves from above the 8-period average to below it, identifying a potential downward shift in momentum.
Visual and Audible Notifications
To ensure traders do not miss these movements, the script performs several actions simultaneously when a crossover is detected:
- On-Chart Markers: It automatically places visual arrows on your trading chart. A "Buy" arrow appears below the price candle, and a "Sell" arrow appears above it. The distance of these arrows from the price is dynamically calculated based on the recent volatility of the market to ensure they are always clearly visible.
- Real-Time Alerts: If the user has enabled sound notifications, the script will trigger an audible popup alert providing the current Ask and Bid prices, the exact time, and the specific currency symbol being traded.
- Email Notifications: The script can be configured to send an immediate email alert to the user's registered device, containing all relevant trade data (Price, Time, Symbol, and Timeframe) so the trader can stay informed even when away from their desk.
Smart Filtering
To prevent the system from sending constant, repetitive alerts during a single trend, the script includes a "flag" logic. This ensures that it only notifies you of the initial crossover event rather than spamming alerts on every subsequent bar as long as the trend continues.
//compile//
//+------------------------------------------------------------------+
//| EMA_58_Crossover_Alert.mq4 |
//| Copyright © 2006, Robert Hill |
//| |
//| Written Robert Hill for use with AIME for the EMA 5/8 cross to |
//| draw arrows and popup alert or send email |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Robert Hill"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 LawnGreen
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Aqua
#property indicator_color5 Yellow
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2
extern bool SoundON=true;
extern bool EmailON=false;
double CrossUp[];
double CrossDown[];
double Ema5[];
double Ema8[];
double Ema20[];
int flagval1 = 0;
int flagval2 = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0, DRAW_ARROW, EMPTY);
SetIndexArrow(0, 233);
SetIndexBuffer(0, CrossUp);
SetIndexStyle(1, DRAW_ARROW, EMPTY);
SetIndexArrow(1, 234);
SetIndexBuffer(1, CrossDown);
SetIndexStyle(2, DRAW_LINE, STYLE_SOLID);
SetIndexBuffer(2, Ema5);
SetIndexStyle(3, DRAW_LINE, STYLE_SOLID);
SetIndexBuffer(3, Ema8);
SetIndexStyle(4, DRAW_LINE, STYLE_SOLID);
SetIndexBuffer(4, Ema20);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
int limit, i, counter;
double tmp=0;
double fastMAnow, slowMAnow, fastMAprevious, slowMAprevious;
double Range, AvgRange;
int counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(i = 1; i <= limit; i++) {
counter=i;
Range=0;
AvgRange=0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
}
Range=AvgRange/10;
fastMAnow = iMA(NULL, 0, 5, -1, MODE_EMA, PRICE_CLOSE, i);
fastMAprevious = iMA(NULL, 0, 5, -1, MODE_EMA, PRICE_CLOSE, i+1);
slowMAnow = iMA(NULL, 0, 8, 0, MODE_EMA, PRICE_OPEN, i);
slowMAprevious = iMA(NULL, 0, 8, 0, MODE_EMA, PRICE_OPEN, i+1);
Ema20[i] = iMA(NULL, 0, 20, 0, MODE_EMA, PRICE_CLOSE, i);
Ema5[i] = fastMAnow;
Ema8[i] = slowMAnow;
CrossUp[i] = 0;
CrossDown[i] = 0;
if ((fastMAnow > slowMAnow) && (fastMAprevious < slowMAprevious))
{
if (i == 1 && flagval1==0)
{
flagval1=1;
flagval2=0;
if (SoundON) Alert("BUY signal at Ask=",Ask,"\n Bid=",Bid,"\n Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n 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());
}
CrossUp[i] = Low[i] - Range*0.75;
}
else if ((fastMAnow < slowMAnow) && (fastMAprevious > slowMAprevious))
{
if (i == 1 && flagval2==0)
{
flagval2=1;
flagval1=0;
if (SoundON) Alert("SELL signal at Ask=",Ask,"\n Bid=",Bid,"\n Date=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n 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());
}
CrossDown[i] = High[i] + Range*0.75;
}
}
return(0);
}
Comments