LSMA_AppliedPrice_v1

Download script
LSMA_AppliedPrice_v1

This script is designed to provide traders with a specialized moving average called the Least Squares Moving Average (LSMA). Unlike standard moving averages that simply average past prices, the LSMA is a regression-based tool. It attempts to find the "line of best fit" for price action over a specific period, helping traders visualize the underlying trend by minimizing the distance between the actual price points and the resulting line.

How the Logic Works

1. Customization of Price Data The tool allows you to choose exactly which price data point from the market should be used to calculate the average. You can select from several different types, including:

  • Standard prices like the Open, High, Low, or Close.
  • Calculated averages such as the Median (average of high and low), the Typical Price (average of high, low, and close), or the Weighted Price (which gives more importance to the closing price).

2. Weighted Calculation Strategy Instead of treating every day or minute of data equally, the logic applies a weighted mathematical formula. It looks back over a set period (defined by the user) and calculates a sum where the weight of each price point is adjusted based on its position in time. This ensures that the resulting line reacts intelligently to the movement of the market rather than just being a flat average.

3. Automated Calculation Loop The script automatically scans through your historical chart data. It performs a series of calculations for every point on the graph to ensure the moving average line is smooth and continuous. It identifies the mathematical "trend" by iterating backward through history, applying the chosen price type and the specific regression weights to produce a single, clear trend line.

4. Safety and Error Handling The script includes a built-in verification system. Before it begins drawing on your chart, it checks to make sure the settings provided are valid. If an incorrect price type is selected (outside of the allowed options), the script will alert the user immediately to ensure that the data displayed remains accurate and reliable.

Visual Output

The result of this logic is a solid yellow line drawn directly on your main chart window. This line serves as a visual guide for identifying the momentum of the market: when the price is above the line, it suggests upward momentum; when below, it suggests downward momentum.

Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
7 Views
0 Downloads
0 Favorites
LSMA_AppliedPrice_v1
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                       LSMA       |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2005, FX Sniper "
#property  link      "http://www.metaquotes.net/"

//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 1
#property indicator_color1 Yellow      

//---- buffers
double ExtMapBuffer1[];
int width;

extern int Rperiod = 14;
extern int Draw4HowLongg = 1500;
extern int LSMA_AppliedPrice = 0;
// Applied Price enumerations
// 0=close, 1=open, 2=high, 3=low, 4=median((h+l/2)), 5=typical((h+l+c)/3), 6=weighted((h+l+c+c)/4)
int Draw4HowLong;
int shift;
int i;
int loopbegin;
double sum1;
int length;
double lengthvar;
double tmp ;
double wt;
int c;
double price;

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

//---- initialization done
   return(0);
  }

int start()

  {
   if (CheckValidUserInputs()) return(0);   
  
     Draw4HowLong = Bars-Rperiod - 5;
      length = Rperiod;
      loopbegin = Draw4HowLong - length - 1;
 
      for(shift = loopbegin; shift >= 0; shift--)
      { 
         sum1 = 0;
         for(i = length; i >= 1  ; i--)
         {
         lengthvar = length + 1;
         lengthvar /= 3;
         tmp = 0;
// Applied Price enumerations
// 0=close, 1=open, 2=high, 3=low, 4=median((h+l/2)), 5=typical((h+l+c)/3), 6=weighted((h+l+c+c)/4)
         switch(LSMA_AppliedPrice)
         {
         case 0: price = Close[length-i+shift];
                 break;
         case 1: price = Open[length-i+shift];
                 break;
         case 2: price = High[length-i+shift];
                 break;
         case 3: price = Low[length-i+shift];
                 break;
         case 4: price = (High[length-i+shift] + Low[length-i+shift])/2.0;
                 break;
         case 5: price = (High[length-i+shift] + Low[length-i+shift] + Close[length-i+shift])/3.0;
                 break;
         case 6: price = (High[length-i+shift] + Low[length-i+shift] + 2.0*Close[length-i+shift])/4;
                 break;
         }
                 
         tmp = ( i - lengthvar)*price;
         sum1+=tmp;
         }
         wt = sum1*6/(length*(length+1));
         
//========== COLOR CODING ===========================================               
        
       ExtMapBuffer1[shift] = wt;
       
      }
    
      return(0);
  }

//+------------------------------------------------------------------+
//| CheckValidUserInputs                                             |
//| Check if User Inputs are valid for ranges allowed                |
//| return true if invalid input, false otherwise                    |
//| Also display an alert for invalid input                          |
//+------------------------------------------------------------------+
bool CheckValidUserInputs()
{
  
   if (CheckAppliedPrice(LSMA_AppliedPrice))
   {
     Alert("LSMA_AppliedPrice requires a value from 0 to 6",'\n','\r',"You entered ",LSMA_AppliedPrice);
     return(true);
   }
   return(false);
}

//+-----------------------------------------------------+
//| Check for valid Applied Price enumerations          |
//|   0=close, 1=open, 2=high, 3=low, 4=median((h+l/2)) |
//|   5=typical((h+l+c)/3), 6=weighted((h+l+c+c)/4)     |
//|  return true if invalid, false if OK                |
//+-----------------------------------------------------+
bool CheckAppliedPrice(int applied_price)
{
   if (applied_price < 0) return (true);
   if (applied_price > 6) return (true);
   return(false);
}


//+------------------------------------------------------------------+



Comments