macd-dot_001
Download scriptThis custom trading tool is designed to analyze price momentum and provide visual cues to help identify potential entry or exit points in the market. It operates by calculating two specific moving averages and comparing their relationship to determine trend shifts.
Core Logic and Calculations
The script functions through a three-step mathematical process:
-
Trend Momentum Calculation: The tool first looks at the price history to calculate two different types of Exponential Moving Averages (EMAs)—one fast-reacting and one slower-moving. By subtracting the slow average from the fast average, the script creates a "MACD" line. This line represents the momentum: when it moves upward, the short-term price is gaining strength; when it moves downward, the short-term price is losing strength.
-
Signal Smoothing: To filter out market "noise," the script takes that momentum line and applies a secondary smoothing process (a Simple Moving Average). This creates a "Signal Line." By comparing the momentum line against this signal line, the tool can more accurately identify where a trend is genuinely changing rather than just fluctuating momentarily.
-
Crossover Identification: The primary goal of this script is to detect "crossovers." The logic continuously monitors the relationship between the momentum line and the signal line:
- Buy Signal: If the momentum line moves from below the signal line to above it, the tool identifies a bullish shift.
- Sell Signal: If the momentum line moves from above the signal line to below it, the tool identifies a bearish shift.
Visual Representation
Instead of drawing complex lines that might clutter your chart, this script is designed to be clean and actionable. It automatically places visual markers (arrows) at specific price points whenever a crossover occurs:
- Bullish Markers: When a positive momentum crossover is detected, an arrow appears below the current price candle.
- Bearish Markers: When a negative momentum crossover is detected, an arrow appears above the current price candle.
By automating these calculations, the script allows you to see at a glance where the trend momentum has shifted without having to manually monitor the moving average values yourself.
//+------------------------------------------------------------------+
//| 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 Yellow
#property indicator_color3 Blue
#property indicator_color4 Yellow
//---- indicator parameters
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
//---- indicator buffers
double ind_buffer1[2];
double ind_buffer2[2];
double ind_buffer3[2];
double ind_buffer4[2];
//+------------------------------------------------------------------+
//| 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, 0);
SetIndexArrow(2, 108);
SetIndexBuffer(2, ind_buffer3);
SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID, 0);
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