+LSMA_Angle
Download scriptThe 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.
/*-----------------------------+
| |
| 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