MACD Dot
Download scriptThis 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.
//+------------------------------------------------------------------+
//| 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