MACD Dot

This custom trading indicator is designed to help market participants identify potential momentum shifts and trend reversals by analyzing the relationship between different moving averages. Instead of just showing standard lines, this script translates complex price data into visual signals directly on your chart.

Core Methodology

The logic operates in three distinct layers:

1. Momentum Calculation The tool first calculates a "MACD" value by comparing two different types of moving averages: a fast-moving one and a slow-moving one. By subtracting the slow average from the fast average, the script determines the current strength and direction of the market's momentum.

2. Signal Smoothing To filter out minor market "noise," the script then takes that momentum value and applies a second smoothing process (a Simple Moving Average). This creates a "Signal Line." The primary goal here is to establish a baseline; when the main momentum deviates significantly from this signal line, it suggests a potential change in price behavior.

3. Automated Signal Detection The most practical feature of this script is its ability to detect "crossings." Rather than requiring the user to watch every fluctuation, the logic automatically scans for specific moments where:

  • The momentum line crosses above the signal line (often interpreted as upward pressure).
  • The momentum line crosses below the signal line (often interpreted as downward pressure).

Visual Output

When these specific crossovers occur, the script automatically places visual markers (arrows) on your price chart.

  • Buy/Upward Signals: These appear near the bottom of the candle when the momentum turns positive.
  • Sell/Downward Signals: These appear near the top of the candle when the momentum turns negative.

By automating this detection, the script allows you to see clear entry or exit points based on smoothed trend data without having to manually interpret the intersecting lines.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
17 Views
0 Downloads
0 Favorites
MACD Dot
//+------------------------------------------------------------------+
//|                                                  Custom MACD.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MetaQuotes Software Corp."
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 4
#property  indicator_color1  Blue
#property  indicator_color2  Red
#property  indicator_color3  Yellow
#property  indicator_color4  Lime
//---- indicator parameters
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
//---- indicator buffers
double     ind_buffer1[];
double     ind_buffer2[];

double     ind_buffer3[];
double     ind_buffer4[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_NONE);
   SetIndexDrawBegin(1,SignalSMA);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
//---- indicator buffers mapping
   if(!SetIndexBuffer(0,ind_buffer1) && !SetIndexBuffer(1,ind_buffer2))
      Print("cannot set indicator buffers!");

   SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID, 2);
   SetIndexArrow(2, 108);
   SetIndexBuffer(2, ind_buffer3);

   SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID, 2);
   SetIndexArrow(3, 108);
   SetIndexBuffer(3, ind_buffer4);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {
   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_buffer1[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++)
      ind_buffer2[i]=iMAOnArray(ind_buffer1,Bars,SignalSMA,0,MODE_SMA,i);
      
   for (i=0; i<limit; i++)
   {
      ind_buffer3[i] = EMPTY_VALUE; ind_buffer4[i] = EMPTY_VALUE; 
      if (ind_buffer1[i] > ind_buffer2[i] && ind_buffer1[i+1] < ind_buffer2[i+1])
         ind_buffer3[i] = Low[i] - 1 * Point;
         
      if (ind_buffer1[i] < ind_buffer2[i] && ind_buffer1[i+1] > ind_buffer2[i+1])
         ind_buffer4[i] = High[i] + 1 * Point;
   }    
//---- done
   return(0);
  }

Comments