MACD_ColorHist_AlertGGv2

Download script
MACD_ColorHist_AlertGGv2

This 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:

  1. 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.
  2. The Signal Line: A smoothed average of the MACD line, used to identify potential turning points.
  3. 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.

Price Data Components
Series array that contains open time of each bar
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screenIt sends emails
15 Views
0 Downloads
0 Favorites
MACD_ColorHist_AlertGGv2
//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