3colorMACD_002
Download scriptThis tool is designed to provide a more visual and intuitive way to track market momentum compared to the standard Moving Average Convergence Divergence (MACD) indicator. By breaking down the movement of the market into specific colored segments, it helps traders identify the strength and direction of price trends more clearly.
Core Logic Overview
The script works by calculating the relationship between two different moving averages: a "fast" average (which reacts quickly to recent price changes) and a "slow" average (which represents the broader trend). The difference between these two lines creates the baseline momentum value.
Instead of simply showing one continuous line, this script analyzes the change in that momentum from one moment to the next. It then categorizes that change into three distinct visual categories:
- Positive Momentum: When the current momentum is higher than it was in the previous period, the script highlights this growth with one specific color. This signifies that the upward trend is gaining strength.
- Negative Momentum: When the current momentum is lower than the previous period, the script switches to a different color. This indicates that the downward trend is becoming more aggressive.
- Neutral/Stationary Momentum: If there is no change in the momentum value between periods, the script uses a third "neutral" color. This identifies moments where the market is flat or transitioning without clear directional movement.
Visual Components
To make these insights easy to read on a chart, the script generates several visual elements:
- The Three-Color Histogram: These are the primary bars that change colors based on whether the momentum is increasing, decreasing, or staying the same. This allows you to see at a glance if a trend is accelerating or slowing down.
- The Signal Line: The script also calculates a "Signal" average based on the momentum data itself. This line helps smooth out minor fluctuations, allowing traders to see the overall flow of the market more clearly.
- The Zero Level: A baseline is established to help users quickly identify when the momentum shifts from positive (above the line) to negative (below the line).
How it Helps the User
By using this logic, you can move beyond simply knowing that a price is "up" or "down." You can see how it is moving. For example, if the bars remain the same color while the price moves, the trend is steady. If the colors shift rapidly, it indicates high volatility or a potential change in market sentiment.
//+------------------------------------------------------------------+
//| 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 Blue
#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