This tool is a technical analysis indicator designed to help traders visualize market momentum and identify potential trends. It operates by calculating three distinct visual elements: the MACD Line, the Signal Line, and a Histogram.
Core Logic and Calculations
Unlike standard moving averages that simply average past prices, this script utilizes a Least Squares Moving Average (LSMA). This method treats price action as a linear regression, essentially trying to find the "best fit" line for a specific period of data. By using LSMA, the indicator attempts to smooth out market noise while remaining more responsive to current price movements than traditional averages.
The logic follows three main steps:
1. The MACD Line The script calculates two separate Least Squares Moving Averages based on user-defined periods (by default, a "fast" period of 12 and a "slow" period of 26). The MACD Line is created by subtracting the value of the slow average from the fast average.
- When the fast average is significantly higher than the slow average, it suggests upward momentum.
- When the fast average falls below the slow average, it suggests downward momentum.
2. The Signal Line To make the data easier to read, the script creates a Signal Line. This is a smoothed version of the MACD Line itself. It uses a mathematical weighting system (an "alpha" calculation) to blend the current MACD value with the previous Signal Line value. This helps filter out minor fluctuations and identifies the broader direction of the momentum.
3. The Histogram The Histogram provides an immediate visual representation of the relationship between the MACD Line and the Signal Line. It is calculated by finding the difference between the two.
- If the MACD Line is above the Signal Line, the histogram rises.
- If the MACD Line falls below the Signal Line, the histogram drops.
Summary for the User
Essentially, this script automates the process of comparing two different "best-fit" averages to see who is leading the market. By looking at where these lines cross and how the histogram fluctuates, traders can better understand whether the market's current strength is accelerating, slowing down, or reversing direction.
//+------------------------------------------------------------------+
//| MACD.mq4 |
//| Copyright © 2005, David W. Thomas |
//| mailto:davidwt@usa.net |
//+------------------------------------------------------------------+
// This is the correct computation and display of MACD.
#property copyright "Copyright © 2005, David W. Thomas"
#property link "mailto:davidwt@usa.net"
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Green
//---- input parameters
extern int FastMAPeriod=12;
extern int SlowMAPeriod=26;
extern int SignalMAPeriod=9;
//---- buffers
double MACDLineBuffer[];
double SignalLineBuffer[];
double HistogramBuffer[];
//---- variables
double alpha = 0;
double alpha_1 = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,MACDLineBuffer);
SetIndexDrawBegin(0,SlowMAPeriod);
SetIndexStyle(1,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(1,SignalLineBuffer);
SetIndexDrawBegin(1,SlowMAPeriod+SignalMAPeriod);
SetIndexStyle(2,DRAW_HISTOGRAM);
SetIndexBuffer(2,HistogramBuffer);
SetIndexDrawBegin(2,SlowMAPeriod+SignalMAPeriod);
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("MACD_LSMAdt("+FastMAPeriod+","+SlowMAPeriod+","+SignalMAPeriod+")");
SetIndexLabel(0,"MACD");
SetIndexLabel(1,"Signal");
//----
alpha = 2.0 / (SignalMAPeriod + 1.0);
alpha_1 = 1.0 - alpha;
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------------+
//| LSMA - Least Squares Moving Average function calculation |
//| LSMA_In_Color Indicator plots the end of the linear regression line |
//+------------------------------------------------------------------------+
double LSMA(int Rperiod, int shift)
{
int i;
double sum;
int length;
double lengthvar;
double tmp;
double wt;
length = Rperiod;
sum = 0;
for(i = length; i >= 1 ; i--)
{
lengthvar = length + 1;
lengthvar /= 3;
tmp = 0;
tmp = ( i - lengthvar)*Close[length-i+shift];
sum+=tmp;
}
wt = sum*6/(length*(length+1));
return(wt);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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;
for(int i=limit; i>=0; i--)
{
MACDLineBuffer[i] = LSMA(FastMAPeriod,i) - LSMA(SlowMAPeriod,i);
SignalLineBuffer[i] = alpha*MACDLineBuffer[i] + alpha_1*SignalLineBuffer[i+1];
HistogramBuffer[i] = MACDLineBuffer[i] - SignalLineBuffer[i];
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments