Author: Copyright � 2005, David W. Thomas
MACDdtLSMA

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.

Miscellaneous
Implements a curve of type %1
13 Views
0 Downloads
0 Favorites
MACDdtLSMA
//+------------------------------------------------------------------+
//|                                                         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