Laguerre Filter

Metatrader Technical Forex Market Indicator

Metatrader Technical Forex Market Indicator
Laguerre Filter
Metatrader Technical Forex Market Indicator
Laguerre Filter
Metatrader Technical Forex Market Indicator
Laguerre Filter
Metatrader Technical Forex Market Indicator
Laguerre Filter
Metatrader Technical Forex Market Indicator
Laguerre Filter
Metatrader Technical Forex Market Indicator
Laguerre Filter
Metatrader Technical Forex Market Indicator
Laguerre Filter
Metatrader Technical Forex Market Indicator
Laguerre Filter









The Laguerre Filter indicator created by John F. Ehlers is described in his book "Cybernetic Analysis for Stocks and Futures". In this book, John Ehlers develops and demonstrates profoundly effective new trading tools through the application of modern digital signal processing techniques. Laguerre Filter indicator is similar to a moving average, it has little lag and keeps tight to the price movement. This indicator allows to avoid "whipsaw" trades and strike a balance between the amount of smoothing and the amount of lag by using some modern mathematic tools. This Laguerre indicator uses the next generation tool,  either the usual Moving Average  or FIR Finite Impulse Response - FIR filters. The picture shows red Moving Average (MA 75) and green line - Laguerre filter. Indikákátor can be used in several ways, but the true value is above Laguerre line - Bay and otherwise Sell. The indicator is a good helper to detect a trend.


Laguerre Filter MQ4 Code Base (Copy Code)
//+------------------------------------------------------------------+
//|                                               LaguerreFilter.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by IgorAD,igorad2003@yahoo.co.uk |   
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |                                      
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Forex-TSD.com "
#property link      "http://www.forex-tsd.com/"
#property indicator_chart_window

#property indicator_color1 Yellow

//---- input parameters
extern double    gamma      = 0.7;
extern int       Price_Type = 0; 
//---- buffers
double Filter[];
double L0[];
double L1[];
double L2[];
double L3[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   IndicatorBuffers(5);
//---- indicators
   SetIndexStyle(0, DRAW_LINE);
   SetIndexDrawBegin(0, 1);
 SetIndexLabel(0, "LaguerreFilter");
 SetIndexBuffer(0, Filter);
   SetIndexBuffer(1, L0);
   SetIndexBuffer(2, L1);
   SetIndexBuffer(3, L2);
   SetIndexBuffer(4, L3);
//----
   string short_name="LaguerreFilter(" + DoubleToStr(gamma, 2) + ")";
   IndicatorShortName(short_name);
   return(0);
}

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
 int    limit;
 int    counted_bars = IndicatorCounted();
 double CU, CD;
 //---- last counted bar will be recounted
 if (counted_bars>0)
  counted_bars--;
 else
  counted_bars = 1;
 limit = Bars - counted_bars;
 //---- computations for RSI
 for (int i=limit; i>=0; i--)
 {
  double Price=iMA(NULL,0,1,0,0,Price_Type,i);
  
  L0[i] = (1.0 - gamma)*Price + gamma*L0[i+1];
  L1[i] = -gamma*L0[i] + L0[i+1] + gamma*L1[i+1];
  L2[i] = -gamma*L1[i] + L1[i+1] + gamma*L2[i+1];
  L3[i] = -gamma*L2[i] + L2[i+1] + gamma*L3[i+1];
  
  CU = 0;
  CD = 0;
  if (L0[i] >= L1[i])
   CU = L0[i] - L1[i];
  else
   CD = L1[i] - L0[i];
  if (L1[i] >= L2[i])
   CU = CU + L1[i] - L2[i];
  else
   CD = CD + L2[i] - L1[i];
  if (L2[i] >= L3[i])
   CU = CU + L2[i] - L3[i];
  else
   CD = CD + L3[i] - L2[i];

  if (CU + CD != 0)
   Filter[i] = (L0[i] + 2 * L1[i] + 2 * L2[i] + L3[i]) / 6.0;
 }
   return(0);
}
//+------------------------------------------------------------------+