3colorMACD
Download scriptThe Three Colour MACD is a specialized technical analysis tool designed to provide traders with a clearer visual representation of market momentum and trend direction. While the standard Moving Average Convergence Divergence (MACD) often appears as a single fluctuating line, this specific script enhances that data by categorizing price movements into distinct visual components based on their trajectory.
Core Mechanics
The logic begins by calculating the relationship between two different types of moving averages: a "Fast" average and a "Slow" average. By subtracting the slow average from the fast average, the script identifies the underlying momentum of the asset. This primary calculation serves as the foundation for all other visual data in the indicator.
The Three-Colour Differentiation
The defining feature of this script is how it interprets the momentum calculated above. Rather than simply showing a single line that moves up and down, the logic analyzes the change between the current momentum value and the previous one. It then splits the visual output into three distinct categories:
- Positive Momentum: When the momentum is increasing compared to the previous bar, the script highlights this movement.
- Negative Momentum: When the momentum is decreasing compared to the previous bar, the script captures this shift separately.
- Neutral/No Change: If there is no change in momentum between bars, the script identifies this as a neutral state.
By separating these three states into different colored histogram bars, the indicator allows traders to see at a glance whether a trend is accelerating, decelerating, or remaining stagnant.
Signal and Reference Layers
To provide additional context for these momentum shifts, the script includes two supplementary layers:
- The Signal Line: The logic calculates a secondary moving average based specifically on the momentum values. This "Signal" line helps smooth out the data, making it easier to identify broader trends versus minor price fluctuations.
- The Zero Level: A steady reference line is maintained to provide a clear baseline. This allows users to see exactly when the momentum shifts from positive to negative territory relative to the center point of the indicator window.
Visual Summary
In practical terms, this script transforms raw mathematical data into a multi-colored visual map. It moves beyond simple "up or down" tracking by highlighting the specific nature of price velocity—distinguishing between rising strength, falling weakness, and neutral stability—all while providing a smoothed signal line to help filter out market noise.
//+------------------------------------------------------------------+
//| Three Colour MACD.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//| Nikolay Kositsin |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Green
#property indicator_color2 Magenta
#property indicator_color3 Gray
#property indicator_color4 LimeGreen
#property indicator_color5 DarkSlateBlue
//---- indicator parameters
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
extern int CountBars=300;
extern int Line=3;
extern double Zero_level=0.0;
//---- indicator buffers
double ind_buffer1[];
double ind_buffer2[];
double ind_buffer3[];
double ind_buffer4[];
double ind_buffer5[];
double ind_buffer6[];
double minuse;
double Vol;
double Zml;
double Color1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicator buffers mapping
IndicatorBuffers(6);
if(!SetIndexBuffer(0,ind_buffer1) &&
!SetIndexBuffer(1,ind_buffer2) &&
!SetIndexBuffer(2,ind_buffer3) &&
!SetIndexBuffer(3,ind_buffer4) &&
!SetIndexBuffer(4,ind_buffer5) &&
!SetIndexBuffer(5,ind_buffer6))
Print("cannot set indicator buffers!");
//---- drawing settings
Color1= C'128,0,255';
SetIndexStyle(0,DRAW_HISTOGRAM, STYLE_SOLID, Line, Color1);
SetIndexStyle(1,DRAW_HISTOGRAM, STYLE_SOLID, Line);
SetIndexStyle(2,DRAW_HISTOGRAM, STYLE_SOLID, Line);
SetIndexStyle(3,DRAW_LINE, STYLE_DASHDOTDOT,1);
SetIndexStyle(4,DRAW_LINE, STYLE_DASHDOTDOT,1);
SetIndexDrawBegin(0,Bars-CountBars);
SetIndexDrawBegin(1,Bars-CountBars);
SetIndexDrawBegin(2,Bars-CountBars);
SetIndexDrawBegin(3,Bars-CountBars+SignalSMA);
SetIndexDrawBegin(4,Bars-CountBars-100);
SetIndexShift(4,100);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")");
SetIndexLabel(0,"MACD+");
SetIndexLabel(1,"MACD-");
SetIndexLabel(2,"MACD0");
SetIndexLabel(3,"Signal");
SetIndexLabel(4,"Zero");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence |
//+------------------------------------------------------------------+
int start()
{
//---- drawing settings
SetIndexStyle(0,DRAW_HISTOGRAM, STYLE_SOLID,Line);
SetIndexStyle(1,DRAW_HISTOGRAM, STYLE_SOLID,Line);
SetIndexStyle(2,DRAW_HISTOGRAM, STYLE_SOLID,Line);
SetIndexStyle(3,DRAW_LINE, STYLE_DASHDOTDOT,1);
SetIndexStyle(4,DRAW_LINE, STYLE_DASHDOTDOT,1);
int limit;
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++)
ind_buffer6[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//---- Three Colour MACD mapping
for(i=0; i<limit; i++)
{
ind_buffer5[i]=Zero_level;
Vol = ind_buffer6[i]; minuse = Vol - ind_buffer6[i+1];
if(minuse>0.0){ind_buffer1[i]=Vol; ind_buffer2[i]=0.0; ind_buffer3[i]=0.0;}
else {if(minuse<0.0){ind_buffer1[i]=0.0; ind_buffer2[i]=Vol; ind_buffer3[i]=0.0;}
else {ind_buffer1[i]=0.0; ind_buffer2[i]=0.0; ind_buffer3[i]=Vol;}}
//----
}
//---- signal line counted in the 2-nd buffer
for(i=0; i<limit; i++)
ind_buffer4[i]=iMAOnArray(ind_buffer6,Bars,SignalSMA,0,MODE_SMA,i);
//---- done
return(0);
}
Comments