Author: Copyright � 2006, TrendLaboratory
NonLagMA

This tool is designed to provide a more responsive and accurate way to track market trends compared to traditional moving averages. In standard trading indicators, there is often a "lag"—a delay between the actual price movement and the indicator's reaction. This script utilizes a sophisticated mathematical approach to minimize that delay, allowing for a smoother visualization of price action.

How the Logic Works

1. Advanced Weighting System Instead of treating all past data points as equally important (like a Simple Moving Average) or giving weight based solely on recency (like an Exponential Moving Average), this script applies a custom weighting formula. It uses trigonometric calculations (specifically Cosine functions) and a smoothing coefficient to determine how much influence each historical price point should have on the current value. This creates a more natural curve that follows the "flow" of the market.

2. Dynamic Smoothing The logic incorporates a specialized cycle calculation. By analyzing the data through several "cycles," the indicator can distinguish between minor price noise and significant directional movements. This helps in producing a line that remains stable during consolidation phases but reacts quickly when a genuine trend shift occurs.

3. Trend Identification and Filtering The script does more than just draw a line; it actively analyzes the direction of the move:

  • Trend Detection: It compares the current calculated value against the previous one to determine if the market is moving upward or downward.
  • Visual Differentiation: Based on your settings, the indicator can change colors or switch between separate "Up" and "Down" lines depending on the trend. This provides a clear visual cue for whether the current momentum is bullish or bearish.
  • Noise Reduction: It includes an optional "Filter" logic. If the price movement is very small (less than a specific threshold), the indicator will remain steady rather than creating "jittery" movements, ensuring that the signals you see are significant and not just market fluctuations.

Summary for the User

In simple terms, this script takes raw market data and processes it through a unique mathematical filter to create a "Non-Lag" moving average. It aims to show you where the market is going now with less delay than standard tools, while highlighting the direction of the trend through distinct visual colors or lines.

Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
19 Views
0 Downloads
0 Favorites
NonLagMA
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                     NonLagMA.mq4 |
//|                                Copyright © 2006, TrendLaboratory |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, TrendLaboratory"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_width1 2
#property indicator_color2 Green
#property indicator_width2 2
#property indicator_color3 Red
#property indicator_width3 2


//---- input parameters
extern int     Price          = 0;
extern int     Length         = 21;
extern int     Displace       = 0;
extern int     Filter         = 0;
extern int     Color          = 1;
extern int     ColorBarBack   = 0;
extern double  Deviation      = 0;         

double Cycle =  4;

//---- indicator buffers
double MABuffer[];
double UpBuffer[];
double DnBuffer[];
double price[];
double trend[];

  int init()
  {
   int ft=0;
   string short_name;
//---- indicator line
   IndicatorBuffers(5);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,MABuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,UpBuffer);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,DnBuffer);
   SetIndexBuffer(3,price);
   SetIndexBuffer(4,trend);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
//---- name for DataWindow and indicator subwindow label
   short_name="NonLagMA("+Length+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,"NLMA");
   SetIndexLabel(1,"Up");
   SetIndexLabel(2,"Down");
//----
   SetIndexShift(0,Displace);
   SetIndexShift(1,Displace);
   SetIndexShift(2,Displace);
   
   SetIndexDrawBegin(0,Length*Cycle+Length);
   SetIndexDrawBegin(1,Length*Cycle+Length);
   SetIndexDrawBegin(2,Length*Cycle+Length);
//----
   return(0);
  }

//+--------------------------------------------------------------+
//| NonLagMA                                                     |
//+--------------------------------------------------------------+
int start()
{
   int    i,shift, counted_bars=IndicatorCounted(),limit;
   double alfa, beta, t, Sum, Weight, step,g;
   double pi = 3.1415926535;    
   
   double Coeff =  3*pi;
   int Phase = Length-1;
   double Len = Length*Cycle + Phase;  
   
   if ( counted_bars > 0 )  limit=Bars-counted_bars;
   if ( counted_bars < 0 )  return(0);
   if ( counted_bars ==0 )  limit=Bars-Len-1; 
   if ( counted_bars < 1 ) 
   for(i=1;i<Length*Cycle+Length;i++) 
   {
   MABuffer[Bars-i]=0;    
   UpBuffer[Bars-i]=0;  
   DnBuffer[Bars-i]=0;  
   }
   
   for(shift=limit;shift>=0;shift--) 
   {	
   Weight=0; Sum=0; t=0;
       
      for (i=0;i<=Len-1;i++)
	   { 
      g = 1.0/(Coeff*t+1);   
      if (t <= 0.5 ) g = 1;
      beta = MathCos(pi*t);
      alfa = g * beta;
      price[i] = iMA(NULL,0,1,0,MODE_SMA,Price,shift+i); 
      Sum += alfa*price[i];
      Weight += alfa;
      if ( t < 1 ) t += 1.0/(Phase-1); 
      else if ( t < Len-1 )  t += (2*Cycle-1)/(Cycle*Length-1);
      }

	if (Weight > 0) MABuffer[shift] = (1.0+Deviation/100)*Sum/Weight;
   
      if (Filter>0)
      {
      if( MathAbs(MABuffer[shift]-MABuffer[shift+1]) < Filter*Point ) MABuffer[shift]=MABuffer[shift+1];
      }
      
      if (Color>0)
      {
      trend[shift]=trend[shift+1];
      if (MABuffer[shift]-MABuffer[shift+1] > Filter*Point) trend[shift]= 1; 
      if (MABuffer[shift+1]-MABuffer[shift] > Filter*Point) trend[shift]=-1; 
         if (trend[shift]>0)
         {  
         UpBuffer[shift] = MABuffer[shift];
         if (trend[shift+ColorBarBack]<0) UpBuffer[shift+ColorBarBack]=MABuffer[shift+ColorBarBack];
         DnBuffer[shift] = EMPTY_VALUE;
         }
         if (trend[shift]<0) 
         {
         DnBuffer[shift] = MABuffer[shift];
         if (trend[shift+ColorBarBack]>0) DnBuffer[shift+ColorBarBack]=MABuffer[shift+ColorBarBack];
         UpBuffer[shift] = EMPTY_VALUE;
         }
      }
   }
	return(0);	
}

Comments