AllAverages_v1-Lab_tab1

Author: Copyright � 2007-08, TrendLaboratory
AllAverages_v1-Lab_tab1

This script is a versatile technical analysis tool designed to calculate and display various types of Moving Averages (MA) on a trading chart. Instead of providing just one standard calculation, it acts as a multi-functional engine that allows users to switch between ten different mathematical models to determine price trends.

Core Functionality

The primary logic of the script follows a two-step process:

  1. Data Preparation: The script first gathers historical price data based on a user-defined source (such as the closing price). It then generates an initial set of averages to establish a baseline for the calculations.
  2. Dynamic Calculation: Based on the specific "Method" selected by the user, the script runs a unique mathematical formula to determine the final line shown on the chart. This allows the same tool to behave differently depending on whether you prefer smooth, reactive, or weighted data.

Supported Mathematical Models

The script includes the following calculation types:

  • Standard Averages: Simple Moving Average (SMA), which treats all data points equally.
  • Exponential & Smoothing Models: Includes Exponential Moving Average (EMA), Smoothed Moving Average (SMMA), and the Wilder’s Smoothing method, which give more weight to recent price action.
  • Weighted & Linear Models: Weighted Moving Average (WMA), Linear Weighted Moving Average (LWMA), and Sine Weighted Moving Average (SineWMA), which prioritize specific timeframes within the period.
  • Advanced/Lag-Reducing Models: Includes the Hull Moving Average (HMA), Least Squares Moving Average (LSMA), Triple Moving Average (TriMA), and a Zero Lag EMA—all designed to react more quickly to sudden market changes while remaining smooth.

User Interface and Visuals

  • Dynamic Labeling: The script automatically creates a text label on the chart. This label updates in real-time to show the current name of the moving average being used, its period, and its exact numerical value.
  • Visual Styling: The resulting line is rendered in orange with a specific thickness, making it easy to distinguish from other potential indicators on the screen.
  • Customization: Users can adjust settings such as the calculation period (how many bars of data to look back), the "shift" (moving the line forward or backward on the chart), and the visual size of the text labels.

In essence, this tool provides a comprehensive suite of trend-following calculations in a single interface, allowing traders to quickly swap between different mathematical philosophies to see which one best fits their specific trading style.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
12 Views
0 Downloads
0 Favorites
AllAverages_v1-Lab_tab1
//+------------------------------------------------------------------+
//|                                               AllAverages_v1.mq4 |
//|                             Copyright © 2007-08, TrendLaboratory |
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |
//|                                   E-mail: igorad2003@yahoo.co.uk |
//|            "Labels added by "OTCFX".                             |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007-08, TrendLaboratory"
#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1  Orange
#property indicator_width1  2  
//---- indicator parameters
extern int Price=0;
extern int MA_Period=5;
extern int MA_Shift=0;
extern int MA_Method=1;
//---- indicator buffers
double MA[];
double aPrice[];
//----
int    draw_begin;
string short_name;
extern int Label_Size=8;
extern color LabelCol=Orange;
string xLAb1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   SetIndexShift(0,MA_Shift);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   draw_begin=MA_Period;
//---- indicator short name
   switch(MA_Method)
   {
      case 1 : short_name="EMA";  break;
      case 2 : short_name="Wilder"; break;
      case 3 : short_name="LWMA"; break;
      case 4 : short_name="SineWMA"; break;
      case 5 : short_name="TriMA"; break;
      case 6 : short_name="LSMA"; break;
      case 7 : short_name="SMMA"; break;
      case 8 : short_name="MMA"; break;
      case 9 : short_name="HMA"; break;
      case 10: short_name="ZeroLagEMA"; break;
      default: MA_Method=0; short_name="SMA";
   }
   IndicatorShortName(short_name+MA_Period+")");
   SetIndexDrawBegin(0,draw_begin);
   SetIndexLabel(0,short_name+MA_Period+")");
//---- indicator buffers mapping
   IndicatorBuffers(2);
   SetIndexBuffer(0,MA);
   SetIndexBuffer(1,aPrice);
//---- initialization done
  xLAb1 = short_name+MA_Period+")";

   return(0);

}
int deinit()
{
  
   ObjectDelete(xLAb1);
   return(0);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
{
   int limit, i, shift;
   int counted_bars=IndicatorCounted();
   int JK0=0;
   if(counted_bars<1)
   for(i=1;i<=draw_begin;i++) MA[Bars-i]=iMA(NULL,0,1,0,0,Price,Bars-i); 
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   for(shift=limit; shift>=0; shift--)
   aPrice[shift] = iMA(NULL,0,1,0,0,Price,shift);
   JK0=MA_Period;
   for(shift=limit; shift>=0; shift--)
   {
      if(shift == Bars - MA_Period)
      {
         switch(MA_Method)
         {
         case 1 : MA[shift] = SMA(aPrice,MA_Period,shift); break;
         case 2 : MA[shift] = SMA(aPrice,MA_Period,shift); break;
         case 7 : MA[shift] = SMA(aPrice,MA_Period,shift); break;
         case 10: MA[shift] = SMA(aPrice,1,shift); break;
         }
      }
      else
      if(shift < Bars - MA_Period)
      {
         switch(MA_Method)
         {
         case 1 : MA[shift] = EMA(aPrice,MA,MA_Period,shift); break;
         case 2 : MA[shift] = Wilder(aPrice,MA,MA_Period,shift); break;  
         case 3 : MA[shift] = LWMA(aPrice,MA_Period,shift); break;
         case 4 : MA[shift] = SineWMA(aPrice,MA_Period,shift); break;
         case 5 : MA[shift] = TriMA(aPrice,MA_Period,shift); break;
         case 6 : MA[shift] = LSMA(aPrice,MA_Period,shift); break;
         case 7 : MA[shift] = SMMA(aPrice,MA,MA_Period,shift); break;
         case 8 : MA[shift] = MMA(aPrice,MA_Period,shift); break;
         case 9 : MA[shift] = HMA(aPrice,MA_Period,shift); break;
         case 10: MA[shift] = ZeroLagEMA(aPrice,MA,MA_Period,shift); break;
         default: MA[shift] = SMA(aPrice,MA_Period,shift); break;
         }
      }
   }     
//---- done
         

 
      
      if (ObjectFind(xLAb1) != 0)
      ObjectCreate(xLAb1,OBJ_TEXT,0,0,0);
      ObjectMove(xLAb1,0,Time[0], MA[0]+0.00007);
      ObjectSetText(xLAb1,"                        <-<"+JK0+","+short_name+","+DoubleToStr( MA[0],Digits), Label_Size, "Verdana", LabelCol);  
      
       
      
      
   return(0);
}

double SMA(double array[],int per,int bar)
{
   double Sum = 0;
   for(int i = 0;i < per;i++) Sum += array[i+bar];
  
   return(Sum/per);
}                

double EMA(double array1[],double array2[],int per,int bar)
{
   return(array2[bar+1] + 2.0/(1+per)*(array1[bar] - array2[bar+1]));
}

double Wilder(double array1[],double array2[],int per,int bar)
{
   return(array2[bar+1] + 1.0/per*(array1[bar] - array2[bar+1]));
}

double LWMA(double array[],int per,int bar)
{
   double Sum = 0;
   double Weight = 0;
   
      for(int i = 0;i < per;i++)
      { 
      Weight+= (per - i);
      Sum += array[bar+i]*(per - i);
      }
   if(Weight>0) double lwma = Sum/Weight;
   else lwma = 0; 
   return(lwma);
} 

double SineWMA(double array[],int per,int bar)
{
   double pi = 3.1415926535;
   double Sum = 0;
   double Weight = 0;
   double del = 0.5*pi/per;
     
      for(int i = 0;i < per;i++)
      { 
      Weight+= MathSin(0.5*pi - del*i);
      Sum += array[bar+i]*MathSin(0.5*pi - del*i);
      }
   if(Weight>0) double swma = Sum/Weight;
   else swma = 0; 
   return(swma);
}

double TriMA(double array[],int per,int bar)
{
   double sma[];
   int len = MathCeil((per+1)*0.5);
   ArrayResize(sma,len);
   
   for(int i = 0;i < len;i++) sma[i] = SMA(array,len,bar+i);
   double trima = SMA(sma,len,0);
   
   return(trima);
}
 
double LSMA(double array[],int per,int bar)
{   
   double Sum=0;
   for(int i=per; i>=1; i--) Sum += (i-(per+1)/3.0)*array[per-i+bar];
   double lsma = Sum*6/(per*(per+1));
   return(lsma);
}

double SMMA(double array1[],double array2[],int per,int bar)
{
   double Sum = 0;
   for(int i = 0;i < per;i++) Sum += array1[i+bar+1];
         
   double smma = (Sum - array2[bar+1] + array1[bar])/per;
   return(smma);
}                

double MMA(double array[],int per,int bar)
{
   double Slope = 0;

   for (int i = 1;i <= per;i++)
   {
   double Factor = 1 + (2 * (i - 1));
   Slope += (array[bar + i - 1] * ((per - Factor)/2));
   }
   double sma = SMA(array,per,bar);
   double mma = sma + (6 * Slope) / ((per + 1) * per);
   return(mma);
}

double HMA(double array[],int per,int bar)
{
   double tmp[];
   int len =  MathSqrt(per);
   ArrayResize(tmp,len);
   
   for(int i = 0; i < len;i++) tmp[i] = 2*LWMA(array,per/2,bar+i) - LWMA(array,per,bar+i);  
   double hma = LWMA(tmp,len,0); 
     
   return(hma);
}

double ZeroLagEMA(double array1[],double array2[],int per,int bar)
{
   double alfa = 2.0/(1+per); 
   int lag = 0.5*(per - 1); 
   return(alfa*(2*array1[bar] - array1[bar+lag]) + (1-alfa)*array2[bar+1]);
}


Comments