NonLagAMA
Download scriptThe NonLagAMA is a specialized technical analysis tool designed to visualize market trends with high precision. Unlike standard moving averages, which often suffer from "lag"—the delay between a price movement and the indicator's reaction—this script utilizes a sophisticated mathematical approach to track price action more fluidly.
Core Logic and Functionality
The underlying logic of this script can be broken down into three primary components:
1. Advanced Weighted Calculation Instead of treating all past price data equally, the script applies a complex weighting system. It uses trigonometric functions (specifically cosine waves) and a variable coefficient to determine how much influence each past price point should have on the current average. This allows the indicator to prioritize relevant price movements while smoothing out "market noise," resulting in a curve that follows the price more naturally.
2. Dynamic Filtering and Smoothing To ensure the visual output remains clean and actionable, the script includes internal logic to handle volatility:
- Deviation Adjustment: It can slightly amplify or dampen the average based on user preference.
- Trend Filtering: The tool features a mechanism to detect very small price fluctuations. If a move is too minor, the script recognizes it as noise and maintains the previous trend level, preventing the indicator from flickering or "jittering" during sideways markets.
3. Trend Identification and Visual Distinction The script doesn't just provide a single line; it intelligently interprets the direction of the market to provide clear visual cues:
- Directional Tracking: It constantly compares the current average against the previous one to determine if the momentum is moving upward or downward.
- Dynamic Coloring: Based on these calculations, the script separates the data into different "buffers." This allows it to display different colors for bullish (upward) and bearish (downward) trends simultaneously.
- Trend Continuity: It includes logic to handle "back-coloring," which ensures that when a trend changes, the visual transition is handled smoothly rather than creating disconnected segments.
Summary for the User
In practical terms, this tool is designed for traders who need to see where the market is heading without the distracting delays found in basic indicators. It provides a smooth, weighted view of price history that reacts dynamically to momentum, highlighting trend reversals through distinct visual changes while filtering out insignificant market "wobbles."
//+------------------------------------------------------------------+
//| NonLagAMA.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Yellow
#property indicator_width1 2
#property indicator_color2 RoyalBlue
#property indicator_width2 2
#property indicator_color3 Red
#property indicator_width3 2
//---- input parameters
extern int Price =0;
extern int Length =60;
extern int Displace =0;
extern int Filter =0;
extern int Color =1;
extern int ColorBarBack =2;
extern double Deviation =0;
//----
double Cycle= 4;
//---- indicator buffers
double MABuffer[];
double UpBuffer[];
double DnBuffer[];
double price[];
double trend[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
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));
SetIndexArrow(0,159);
SetIndexArrow(1,159);
SetIndexArrow(2,159);
SetIndexArrow(3,159);
//---- name for DataWindow and indicator subwindow label
short_name="NonLagDot("+Length+")";
IndicatorShortName(short_name);
SetIndexLabel(0,"NLD");
SetIndexLabel(1,"Up");
SetIndexLabel(2,"Dn");
//----
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_v4 |
//+------------------------------------------------------------------+
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