LSMA_AppliedPrice1_v2
Download scriptThis tool is designed to provide traders with a smoothed price trend line on their charts, known as a Linear Weighted Moving Average (LSMA). Unlike standard moving averages that give equal importance to all data points in a set period, this script applies a "weighted" logic, placing greater significance on more recent price action.
How the Logic Works
1. Customizing the Data Source The core of this tool allows you to choose exactly which type of price data should be used to calculate the trend. Instead of being restricted to just the closing price, the script gives you seven different options:
- Standard Prices: You can base the trend on the Open, High, Low, or Close of each candle.
- Calculated Averages: It can also use more complex mathematical averages for each candle, such as the Median (average of High and Low), the Typical price (average of High, Low, and Close), or a Weighted price that gives extra importance to the Close price.
2. The Weighting Mechanism The script looks back over a specific number of candles (the "period") defined by the user. For every candle within that period, it calculates a weight based on its position in time.
- Older data points are assigned a lower mathematical weight.
- The most recent price points are assigned the highest weights.
By multiplying the chosen price by these specific weights and summing them up, the tool generates a line that reacts more dynamically to current market shifts while still filtering out minor "noise" from historical data.
3. Visual Output Once the calculations are complete, the script renders a solid red line on the trading chart. This line serves as a visual guide for traders to identify the prevailing direction of the market, helping to distinguish between long-term trends and short-term price fluctuations.
4. Safety and Validation To ensure the tool operates correctly, it includes an internal check. If a user tries to select a data source outside of the allowed options (0 through 6), the script will automatically detect the error, trigger an alert notification, and pause the calculation until a valid setting is chosen.
//+------------------------------------------------------------------+
//| LSMA_AppliedPrice.mq4 |
//| 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 Red
//---- 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,1);
//---- 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