LSMA_AppliedPrice
Download scriptThis tool is a specialized technical analysis indicator designed to help traders identify trends by calculating a "Linearly Weighted Moving Average" (LSMA). Unlike standard moving averages that treat all price points in a period equally, this script gives more importance to the most recent data, allowing for a more responsive view of current market momentum.
Core Functionality
The script analyzes historical price data over a user-defined timeframe (the "Period") to generate a smooth, continuous line on your chart. By calculating a weighted average, it aims to reduce the "lag" typically found in basic moving averages, providing a clearer picture of where the price is heading in real-time.
Key Features & Logic
- Dynamic Weighting: The primary logic follows a linear weighting system. This means that as the script looks back through the price history, it applies a multiplier to each previous price point. Prices closer to the present moment carry more weight in the final calculation than older prices.
- Customizable Price Sources: You are not limited to just looking at "Closing Prices." The logic allows you to choose which specific price data the average should be based on, including:
- Standard metrics like Open, High, Low, or Close.
- Calculated averages such as the Median (halfway between high and low), the Typical Price (average of high, low, and close), or a Weighted Price calculation.
- Smart Validation: The script includes an internal safety check. Before performing any calculations, it verifies that the settings you have chosen are valid. If an incorrect parameter is entered, it provides an alert to ensure the indicator functions correctly without producing misleading data.
- Visual Output: The result of these complex weighted calculations is plotted as a solid yellow line on your trading window, making it easy to visualize market trends at a glance.
//+------------------------------------------------------------------+
//| 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