3color_MACD

Download script
3color_MACD

This tool is a specialized technical analysis indicator designed to provide a more nuanced visual representation of market momentum compared to the standard MACD (Moving Average Convergence Divergence). While a traditional MACD often shows a single line or histogram, this script breaks down price movement into three distinct visual categories to help traders identify the strength and direction of trends more clearly.

How the Logic Works

The indicator operates by analyzing the relationship between two different moving averages—a "fast" one that reacts quickly to price changes and a "slow" one that tracks the broader trend. The core logic follows these steps:

1. Calculating Momentum First, the script calculates the difference between the fast and slow moving averages. This difference represents the current momentum of the market. If the gap is widening, the trend is gaining strength; if it is narrowing, the trend may be losing steam.

2. Identifying Trend Direction (The Three Colors) Unlike standard indicators that simply plot a value, this script evaluates how the momentum is changing from one candle to the next. It categorizes every movement into three specific states:

  • Upward Momentum: When the momentum is increasing in a positive direction, it is highlighted visually. This signals an accelerating bullish move.
  • Downward Momentum: When the momentum is decreasing in a negative direction, it is shown with a different visual style. This indicates an accelerating bearish move.
  • Neutral/Stagnant Momentum: If the momentum is flat (neither increasing nor decreasing), the script assigns it a neutral visual state. This helps identify periods where the market is consolidating or lacking clear direction.

3. The Signal Line In addition to the three-color momentum histogram, the script calculates a "Signal Line." This is a secondary moving average of the momentum itself. By comparing the three-colored histogram against this signal line, traders can better identify potential turning points or "overextended" market conditions.

Summary for Traders

Instead of just seeing if the price is going up or down, this indicator allows you to see the velocity of that movement. It distinguishes between a "weak" move and a "strong" move by changing colors based on whether the trend's energy is expanding, contracting, or staying still. This provides a clearer picture of market health and helps in identifying high-probability entries where momentum is actively accelerating.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
16 Views
0 Downloads
0 Favorites
3color_MACD
//+------------------------------------------------------------------+
//|                                                  3color_MACD.mq4 |
//|               MACD:  Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//|             3color:  Copyright © 2005,          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  MediumBlue
#property  indicator_color2  Red
#property  indicator_color3  Gray
#property  indicator_color4  LimeGreen
#property  indicator_color5  DarkSlateBlue
//---- indicator parameters
extern int FastEMA=5;
extern int SlowEMA=34;
extern int SignalSMA=5;
extern int CountBars=300;
extern int Line=3;
//---- indicator buffers
double     ind_buffer1[];
double     ind_buffer2[];
double     ind_buffer3[];
double     ind_buffer4[];
double     ind_buffer5[];

double minuse;
double Vol;
double Zml;
double Color1;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  
//---- indicator buffers mapping
   IndicatorBuffers(5);
   if(!SetIndexBuffer(0,ind_buffer1) &&
      !SetIndexBuffer(1,ind_buffer2) &&
      !SetIndexBuffer(2,ind_buffer3) &&
      !SetIndexBuffer(3,ind_buffer4) &&
      !SetIndexBuffer(4,ind_buffer5))
       Print("cannot set indicator buffers!");
//---- drawing settings
    
   Color1= C'128,0,255';                                            
   SetIndexStyle(0,DRAW_HISTOGRAM, STYLE_SOLID, 2, Color1); 
   SetIndexStyle(1,DRAW_HISTOGRAM, STYLE_SOLID, 2);
   SetIndexStyle(2,DRAW_HISTOGRAM, STYLE_SOLID, 3);
   SetIndexStyle(3,DRAW_LINE, STYLE_DASHDOTDOT,1);   

   SetIndexDrawBegin(0,Bars-CountBars);
   SetIndexDrawBegin(1,Bars-CountBars);
   SetIndexDrawBegin(2,Bars-CountBars);
   SetIndexDrawBegin(3,Bars-CountBars+SignalSMA); 
     
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);

//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")");
   SetIndexLabel(0,"MACDUp");
   SetIndexLabel(1,"MACDDown");
   SetIndexLabel(2,"MACDStr");
   SetIndexLabel(3,"Signal");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()   
   {
//---- drawing settings
   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_buffer5[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++)
   {          
       Vol = ind_buffer5[i];     minuse = Vol - ind_buffer5[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_buffer5,Bars,SignalSMA,0,MODE_SMA,i);
//---- done
   return(0);
  }

Comments