MACD Cross
Download scriptThis tool is designed to help traders identify specific momentum shifts on their charts by detecting when two different moving averages cross paths. Instead of cluttering your screen with continuous lines, the script focuses exclusively on highlighting the exact moments these "crossovers" occur, making it much easier to spot signals even when you are zoomed out or looking at fast-moving price action.
How the Logic Works
1. Data Analysis & Calculation The script looks at two distinct types of moving averages: a "fast" average and a "slow" average. It continuously calculates the relationship between these two values based on specific periods you define (for example, comparing very recent price movement against a broader historical trend).
To ensure the visual markers are placed naturally, the tool also calculates the average price range (the distance between the highest and lowest prices) over the last 10 candles. This allows it to position the signals at a comfortable distance above or below the actual price bars.
2. Identifying the "Cross" The core logic functions by comparing three consecutive points in time:
- The Past: Where the averages were before.
- The Present: Where the averages are right now.
- The Future/Next: The immediate following data point.
By analyzing these points, the script detects the precise moment the fast average moves from below to above the slow average (a potential upward move) or from above to below (a potential downward move).
3. Visual and Audible Alerts When the logic confirms a crossover has happened, the script performs three actions simultaneously:
- Upward Signals: It places a visual arrow below the price candle.
- Downward Signals: It places a visual arrow above the price candle.
- Notifications: For live trading, if a crossover happens on the most recent candle, the tool will trigger a pop-up alert in your terminal and play an audio sound file to grab your attention immediately.
Key Benefits for the User
- Clarity: By identifying specific crossing points, you can remove standard moving average lines from your chart, resulting in a much cleaner and less distracting workspace.
- Precision: It solves the problem of "visual overlap," where price bars might hide subtle crossovers on shorter timeframes.
- Automation: You no longer need to watch the lines constantly; the tool identifies the momentum shift for you and provides an instant audio notification.
//+------------------------------------------------------------------+
//| 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 Blue
#property indicator_color2 Red
double CrossUp[];
double CrossDown[];
extern int fast_ema_signal = 5;
extern int slow_ema_signal = 35;
extern int signal_period = 10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0, DRAW_ARROW, EMPTY);
SetIndexArrow(0, 163);
SetIndexBuffer(0, CrossUp);
SetIndexStyle(1, DRAW_ARROW, EMPTY);
SetIndexArrow(1, 163);
SetIndexBuffer(1, CrossDown);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
static datetime dt = 0;
int limit, i, counter;
double fasterEMAnow, slowerEMAnow, fasterEMAprevious, slowerEMAprevious, fasterEMAafter, slowerEMAafter;
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;
static datetime cDT = 0;
for(i = 0; i <= limit; i++) {
counter=i;
Range=0;
AvgRange=0;
CrossUp[i] = 0; CrossDown[i] = 0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
}
Range=AvgRange/10;
fasterEMAnow = iMACD(NULL,0,fast_ema_signal,slow_ema_signal,signal_period,PRICE_CLOSE,MODE_MAIN,i);
fasterEMAprevious = iMACD(NULL,0,fast_ema_signal,slow_ema_signal,signal_period,PRICE_CLOSE,MODE_MAIN,i+1);
fasterEMAafter = iMACD(NULL,0,fast_ema_signal,slow_ema_signal,signal_period,PRICE_CLOSE,MODE_MAIN,i-1);
slowerEMAnow = iMACD(NULL,0,fast_ema_signal,slow_ema_signal,signal_period,PRICE_CLOSE,MODE_SIGNAL,i);
slowerEMAprevious = iMACD(NULL,0,fast_ema_signal,slow_ema_signal,signal_period,PRICE_CLOSE,MODE_SIGNAL,i+1);
slowerEMAafter = iMACD(NULL,0,fast_ema_signal,slow_ema_signal,signal_period,PRICE_CLOSE,MODE_SIGNAL,i-1);
if ((fasterEMAnow > slowerEMAnow) && (fasterEMAprevious < slowerEMAprevious)) {
CrossUp[i] = Low[i] - Range*0.5;
if ((i < 2) && (dt != iTime(NULL,0,0)))
{
Print("** Macd Xross up");
PlaySound("Alert2.wav");
dt = iTime(NULL,0,0);
}
}
else if ((fasterEMAnow < slowerEMAnow) && (fasterEMAprevious > slowerEMAprevious)) {
CrossDown[i] = High[i] + Range*0.5;
if ((i < 2) && (dt != iTime(NULL,0,0)))
{
Print("** Macd Xross down");
PlaySound("Alert2.wav");
dt = iTime(NULL,0,0);
}
}
}
return(0);
}
Comments