MA_Crossover_Signal_With_wav_v2
Download scriptThis tool is designed to simplify technical analysis by automatically identifying "crossover" points between two different moving averages on a trading chart. While traders often use moving averages to smooth out price fluctuations and see trends, these lines can sometimes become cluttered or difficult to read—especially when looking at very short timeframes or when zooming in on specific price action. This script solves that problem by highlighting the exact moment one average crosses over another.
How it Works
The logic operates by monitoring two distinct moving averages: a "Faster" one (which reacts quickly to price changes) and a "Slower" one (which represents the broader trend). The tool continuously calculates the values of both lines at three specific points in time: the current candle, the previous candle, and the candle following the current point.
By comparing these three points, the script looks for a specific sequence that confirms a crossover has occurred:
- Buy Signals: It detects when the Faster moving average was previously below the Slower one but has now moved above it. When this specific "upward" crossing is confirmed, the tool places a visual marker (an arrow) below the price candle.
- Sell Signals: Conversely, it identifies when the Faster moving average was previously above the Slower one but has now dropped below it. When this "downward" crossing is confirmed, the tool places a visual marker above the price candle.
Key Features for Traders
- Visual Clarity: Instead of forcing you to squint at two overlapping lines to see where they meet, the script places clear symbols on your chart. This allows you to remove the moving average lines entirely if you prefer a cleaner workspace, while still receiving the data from their crossovers.
- Dynamic Positioning: The script calculates the "Range" (the volatility) of the recent price candles to ensure that the markers are placed at a professional distance away from the bars, preventing them from overlapping with the price action.
- Real-Time Notifications: To ensure you don't miss a move while away from your screen, the logic includes an automated alert system. When a crossover occurs, the script triggers both an audible sound notification and a pop-up alert on your platform, identifying whether it is a "Buy" or "Sell" signal based on the direction of the cross.
- Smart Alerting: The logic includes a built-in check to ensure that you only receive one alert per candle. This prevents the system from sending multiple repetitive notifications for the same crossover event as the price fluctuates.
//+------------------------------------------------------------------+
//| EMA-Crossover_Signal.mq4 |
//| Copyright © 2005, Jason Robinson (jnrtrading) |
//| http://www.jnrtading.co.uk |
//+------------------------------------------------------------------+
/*
+------------------------------------------------------------------+
| Allows you to enter two ema periods and it will then show you at |
| Which point they crossed over. It is more usful on the shorter |
| periods that get obscured by the bars / candlesticks and when |
| the zoom level is out. Also allows you then to remove the emas |
| from the chart. (emas are initially set at 5 and 6) |
+------------------------------------------------------------------+
*/
#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)"
#property link "http://www.jnrtrading.co.uk"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
double CrossUp[];
double CrossDown[];
extern int FasterMode = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int FasterMA = 5;
extern int SlowerMode = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int SlowerMA = 7;
double alertTag;
//+------------------------------------------------------------------+
//| 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);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
int limit, i, counter;
double fasterMAnow, slowerMAnow, fasterMAprevious, slowerMAprevious,
fasterMAafter, slowerMAafter;
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 = 0; 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;
fasterMAnow = iMA(NULL, 0, FasterMA, 0, FasterMode, PRICE_CLOSE,
i);
fasterMAprevious = iMA(NULL, 0, FasterMA, 0, FasterMode,
PRICE_CLOSE, i+1);
fasterMAafter = iMA(NULL, 0, FasterMA, 0, FasterMode,
PRICE_CLOSE, i-1);
slowerMAnow = iMA(NULL, 0, SlowerMA, 0, SlowerMode, PRICE_CLOSE,
i);
slowerMAprevious = iMA(NULL, 0, SlowerMA, 0, SlowerMode,
PRICE_CLOSE, i+1);
slowerMAafter = iMA(NULL, 0, SlowerMA, 0, SlowerMode,
PRICE_CLOSE, i-1);
if ( (fasterMAnow > slowerMAnow) && (fasterMAprevious <
slowerMAprevious) && (fasterMAafter > slowerMAafter)) {
CrossUp[i] = Low[i] - Range*0.5;
if ( alertTag!=Time[0])
{
PlaySound("news.wav");// buy wav
Alert(Symbol()," M",Period()," MA cross BUY");
}
alertTag = Time[0];
}
else if ((fasterMAnow < slowerMAnow) && (fasterMAprevious >
slowerMAprevious) && (fasterMAafter < slowerMAafter)) {
CrossDown[i] = High[i] + Range*0.5;
if ( alertTag!=Time[0])
{
PlaySound("news.wav"); //sell wav
Alert(Symbol()," M",Period()," MA cross SELL");
}
alertTag = Time[0];
}
}
return(0);
}
Comments