MACD_ColorHist_AlertGGv2
Download scriptThis script is a custom technical analysis tool designed for the MetaTrader 4 platform. It enhances the standard Moving Average Convergence Divergence (MACD) indicator by providing visual cues and automated notifications to help traders identify momentum shifts and trend reversals in real-time.
Core Functionality
The script calculates three primary components based on user-defined settings:
- The MACD Line: This measures the distance between two moving averages (Fast and Slow). It helps determine the strength and direction of a price trend.
- The Signal Line: A smoothed average of the MACD line, used to identify potential turning points.
- The Histogram: A visual representation of the difference between the MACD line and the Signal line.
Visual Logic & Color Coding
Rather than showing a single uniform histogram, this script dynamically changes colors based on momentum movement:
- Expanding Momentum: When the current gap between the MACD and Signal lines is larger than the previous bar, the histogram reflects an increase in strength.
- Contracting Momentum: When that gap shrinks compared to the previous bar, the color shifts to indicate a loss of momentum.
This allows traders to see at a glance whether a trend is gaining "power" or starting to tire out, even if the price continues in the same direction.
Automated Alerts & Notifications
The script is designed to act as an automated watchdog, monitoring for two specific types of events:
1. Histogram Crosses: The tool monitors when the histogram moves from positive to negative territory (or vice versa). When this happens, it triggers a notification identifying that the momentum has flipped.
2. Signal Line Zero-Crossings: The script specifically watches the Signal Line. When this line crosses the zero level:
- On-Chart Label: It displays a text message directly on the chart indicating whether the trend has shifted to "UP" or "DOWN."
- Audio Alerts: If enabled, it triggers a pop-up sound.
- Email Notifications: If configured, it sends an automated email to your connected account with the specific details of the crossover (including time, symbol, and timeframe).
Summary for the User
Essentially, this tool transforms a standard trend indicator into an active alert system. It automates the "manual" work of watching for momentum exhaustion and trend shifts, providing immediate visual and auditory feedback so you can react to market changes without constantly staring at the screen.
//compile//
//+------------------------------------------------------------------+
//| MACD_ColorHist_Alert.mq4 |
//| Copyright © 2006, Robert Hill |
//| |
//Could you give me a price for taking your MACD Color Hist Alert (attached)
// and changing it so that the histogram bars change color when they
// switch from expanding to contracting (and visa versa)
// and also popup an alert that this has happened,
// as well as add an extra alert (popup and email) when the signal line
// goes thru 0 along with a text message on the chart
// that says "the trend has changed to up/down" as the case may be.
//The attached JRSX histograms change color the way I like.
// Perhaps you could add the same alerts as per above to this one as well.
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Robert Hill"
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Aqua
#property indicator_color2 Red
#property indicator_color3 Green
#property indicator_color4 Red
//---- indicator parameters
extern bool SoundON=true;
extern bool EmailON=false;
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
//---- indicator buffers
double MACD_buffer[];
double Signal_buffer[];
double HistogramBufferUp[];
double HistogramBufferDown[];
bool HistAboveZero = false;
bool HistBelowZero = false;
bool MACDAboveZero = false;
bool MACDBelowZero = false;
//---- variables
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- drawing settings
// IndicatorBuffers(3);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID);
SetIndexBuffer(0,MACD_buffer);
SetIndexDrawBegin(0,SlowEMA);
SetIndexStyle(1,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(1,Signal_buffer);
SetIndexDrawBegin(1,SignalSMA);
SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID);
SetIndexBuffer(2,HistogramBufferUp);
SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID);
SetIndexBuffer(3,HistogramBufferDown);
// SetIndexDrawBegin(2,SlowEMA + SignalSMA);
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")");
SetIndexLabel(0,"MACD");
SetIndexLabel(1,"Signal");
SetIndexLabel(2,"Histogram");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence |
//+------------------------------------------------------------------+
int start()
{
int limit;
double current, prev;
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;
//---- macd counted in the 1-st buffer
for(int i=0; i<limit; i++)
MACD_buffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//---- signal line counted in the 2-nd buffer
for(i=0; i<limit; i++)
Signal_buffer[i]=iMAOnArray(MACD_buffer,Bars,SignalSMA,0,MODE_SMA,i);
for(i=0; i<limit; i++)
{
HistogramBufferUp[i] = 0;
HistogramBufferDown[i] = 0;
current = MACD_buffer[i] - Signal_buffer[i];
prev = MACD_buffer[i+1] - Signal_buffer[i+1];
if (current > prev)
{
HistogramBufferUp[i] = current;
HistogramBufferDown[i] = 0.0;
}
else
{
HistogramBufferDown[i] = current;
HistogramBufferUp[i] = 0.0;
}
if (MACDAboveZero) Comment ("\nThe trend has changed to UP");
if (MACDBelowZero) Comment ("\nThe trend has changed to DOWN");
if (i == 1)
{
// Check for Histogram crossing 0 line
if (HistogramBufferUp[i] > 0 && HistogramBufferDown[i + 1] < 0)
{
// Cross up
if (HistAboveZero == false)
{
HistAboveZero=true;
HistBelowZero=false;
if (SoundON) Alert("MACD Histogram Crossed up","\n Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
if (EmailON) SendMail("MACD Histogram Crossed up", "MACD Crossed up, Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
}
}
else if (HistogramBufferDown[i] < 0 && HistogramBufferUp[i + 1] > 0)
{
// Cross down
if (HistBelowZero == false)
{
HistBelowZero=true;
HistAboveZero=false;
if (SoundON) Alert("MACD Histogram Crossed down","\n Date=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
if (EmailON) SendMail("MACD Histogram Crossed down","MACD Crossed Down, Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
}
}
// Check for MACD Signal line crossing 0 line
if (Signal_buffer[i] > 0 && Signal_buffer[i + 1] < 0)
{
// Cross up
if (MACDAboveZero == false)
{
MACDAboveZero=true;
MACDBelowZero=false;
if (SoundON) Alert("MACD Signal line Crossed up","\n Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
if (EmailON) SendMail("MACD Signal line Crossed up", "MACD Crossed up, Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
}
}
else if (Signal_buffer[i] < 0 && Signal_buffer[i + 1] > 0)
{
// Cross down
if (MACDBelowZero == false)
{
MACDBelowZero=true;
MACDAboveZero=false;
if (SoundON) Alert("MACD Signal line Crossed down","\n Date=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
if (EmailON) SendMail("MACD Signal line Crossed down","MACD Crossed Down, Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
}
}
}
}
//---- done
return(0);
}
Comments