+LSMA_Angle

Download script
+LSMA_Angle

The LSMA Angle indicator is a technical analysis tool designed to measure the momentum and direction of a price trend by calculating the specific "slope" or angle of a Least Squares Moving Average (LSMA). Instead of just showing you the average price, this script interprets how aggressively the market is moving in a particular direction.

How the Logic Works

The indicator operates by performing three primary steps:

1. Calculating the LSMA Value The script first identifies the "Least Squares Moving Average." Unlike a standard moving average that simply averages past prices, the LSMA uses linear regression to find a line of best fit for the price data over a specific period. This provides a smoother and often more responsive view of the market trend.

2. Measuring the Angle (The Slope) To determine the strength of the current movement, the script compares two different points on that moving average:

  • It looks at a "Start" point (a look-back shift in the past).
  • It looks at an "End" point (the current price position).

By calculating the difference between these two points and applying a multiplier based on the distance between them, the script converts that movement into an angle. A steep upward angle indicates strong bullish momentum, while a steep downward angle indicates strong bearish momentum.

3. Visualizing Momentum via Color Coding The indicator translates these mathematical angles into a visual histogram in a separate window to help traders quickly identify market states:

  • Green (Upward Trend): When the calculated angle is significantly positive and exceeds a specific threshold, the histogram turns green, signaling strong upward momentum.
  • Red (Downward Trend): When the calculated angle is significantly negative and falls below the negative threshold, the histogram turns red, signaling strong downward momentum.
  • Yellow (Neutral/Consolidation): When the angle is "near zero" (falling within a small range between the positive and negative thresholds), the histogram turns yellow. This suggests that the market is moving sideways, consolidating, or lacks a clear directional trend at that moment.

Summary for Traders

This tool is designed to filter out "noise." By focusing on the angle of the average rather than just the price itself, it helps traders identify when a trend is gaining real strength and when the market is simply drifting without conviction.

Miscellaneous
Implements a curve of type %1
9 Views
0 Downloads
0 Favorites
+LSMA_Angle
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                   LSMA_Angle.mq4 |
//|                                                           MrPip  |
//|                                                                  |
//| You can use this indicator to measure when the LSMA angle is     |
//| "near zero". AngleTreshold determines when the angle for the     |
//| LSMA is "about zero": This is when the value is between          |
//| [-AngleTreshold, AngleTreshold] (or when the histogram is red).  |
//|   LSMAPeriod: LSMA period                                        |
//|   AngleTreshold: The angle value is "about zero" when it is      |
//|     between the values [-AngleTreshold, AngleTreshold].          |      
//|   StartLSMAShift: The starting point to calculate the            |   
//|     angle. This is a shift value to the left from the            |
//|     observation point. Should be StartEMAShift > EndEMAShift.    | 
//|   EndLSMAShift: The ending point to calculate the                |
//|     angle. This is a shift value to the left from the            | 
//|     observation point. Should be StartEMAShift > EndEMAShift.    |
//|                                                                  |
//|   Modified by MrPip from EMAAngle by jpkfox                      |                                              |
//|       Red for down                                               |
//|       Yellow for near zero                                       |
//|       Green for up                                               |   
//|                                                                  |
//+------------------------------------------------------------------+

#property  copyright "Robert L. Hill aka MrPip"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  LimeGreen
#property  indicator_color2  Yellow
#property  indicator_color3 FireBrick
//---- indicator parameters
extern int LSMAPeriod=25;
extern double AngleTreshold=15.0;
extern int StartLSMAShift=4;
extern int EndLSMAShift=0;

//---- indicator buffers
double UpBuffer[];
double DownBuffer[];
double ZeroBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,2);

   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);

//---- 3 indicator buffers mapping
   if(!SetIndexBuffer(0,UpBuffer) &&
      !SetIndexBuffer(1,DownBuffer) &&
      !SetIndexBuffer(2,ZeroBuffer))
      Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("LSMAAngle("+LSMAPeriod+","+AngleTreshold+","+StartLSMAShift+","+EndLSMAShift+")");
//---- initialization done
   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);
}


//+------------------------------------------------------------------+
//| The angle for LSMA                                               |
//+------------------------------------------------------------------+
int start()
{
   double fEndMA, fStartMA;
   double fAngle, mFactor, dFactor;
   int nLimit, i;
   int nCountedBars;
   double angle;
   int ShiftDif;
   string Sym;
   
   if(EndLSMAShift >= StartLSMAShift)
   {
      Print("Error: EndLSMAShift >= StartLSMAShift");
      StartLSMAShift = 6;
      EndLSMAShift = 0;      
   }  
         
   nCountedBars = IndicatorCounted();
//---- check for possible errors
   if(nCountedBars<0) 
      return(-1);
//---- last counted bar will be recounted
   if(nCountedBars>0) 
      nCountedBars--;
   nLimit = Bars-nCountedBars;

   dFactor = 2*3.14159/180.0;
   mFactor = 100000.0;
   Sym = StringSubstr(Symbol(),3,3);
   if (Sym == "JPY") mFactor = 1000.0;
 //  if (Symbol() == "USDJPY") mFactor = 1000.0;
   ShiftDif = StartLSMAShift-EndLSMAShift;
   mFactor /= ShiftDif; 
 
//---- main loop
   for(i=0; i<nLimit; i++)
   {
      fEndMA=LSMA(LSMAPeriod,i+EndLSMAShift);
      fStartMA=LSMA(LSMAPeriod,i+StartLSMAShift);
      // 10000.0 : Multiply by 10000 so that the fAngle is not too small
      // for the indicator Window.
      fAngle = mFactor * (fEndMA - fStartMA)/2;
//      fAngle = MathArctan(fAngle)/dFactor;

      DownBuffer[i] = 0.0;
      UpBuffer[i] = 0.0;
      ZeroBuffer[i] = 0.0;
      
      if(fAngle > AngleTreshold)
         UpBuffer[i] = fAngle;
      else if (fAngle < -AngleTreshold)
         DownBuffer[i] = fAngle;
      else ZeroBuffer[i] = fAngle;
   }

   return(0);
  }
//+------------------------------------------------------------------+

Comments