nonlagdotMS_1
Download scriptThis technical indicator, known as the NonLagDOT, is designed to provide traders with a smoothed representation of price movements while minimizing the "lag"—the delay that typically occurs between a market change and its appearance on a chart. By focusing on trend identification, it helps users visualize whether the market is moving upward or downward in a more fluid, stable manner.
Core Logic and Mechanics
1. Advanced Smoothing Calculation Unlike standard moving averages that treat all data points equally or give simple weight to recent prices, this script uses a sophisticated mathematical approach. It applies a specific weighting system based on trigonometric functions (cosine waves). This allows the indicator to calculate a "non-lag" average by balancing the importance of historical data against current price action more intelligently than conventional methods.
2. Trend Detection and Coloring The script automatically categorizes the market into two states: Upward and Downward.
- When the calculated average begins to rise above a specific threshold, the indicator identifies an UpTrend.
- When it falls below that same threshold, it identifies a DownTrend. Visually, this is represented by different colored dots or lines on your chart, allowing you to see the direction of the market at a glance.
3. Noise Reduction (Filtering) To prevent the indicator from reacting to "market noise" (small, insignificant price flickers), the script includes a filtering mechanism. You can set a sensitivity level that requires the price movement to be of a certain magnitude before the indicator changes its trend direction. This helps ensure that the signals you see are based on significant momentum rather than minor fluctuations.
4. Automated Alerts The script is equipped with an active notification system. It monitors for "crossovers"—the specific moment the trend flips from down to up, or vice versa. When these shifts occur, the script can be configured to perform several actions:
- Audio Alerts: Play a sound file on your computer.
- Pop-up Alerts: Trigger an on-screen notification within the trading platform.
- Email Notifications: Send an immediate email alert to your registered account.
Summary for the User
Think of this tool as a "smart filter." It takes the chaotic movement of live prices and smooths it out into a clear trend line. It tells you not just where the price was, but helps define the current momentum by highlighting trend changes with distinct colors and alerting you the moment the market shifts direction.
//+------------------------------------------------------------------+
//| NonLagDOT.mq4 |
//| Copyright © 2006, TrendLaboratory |
//| http://finance.groups.yahoo.com/group/TrendLaboratory |
//| E-mail: igorad2003@yahoo.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, TrendLaboratory"
#property link "http://finance.groups.yahoo.com/group/TrendLaboratory"
#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 = 30;
extern int Displace = 0;
extern int Filter = 0;
extern int Color = 1;
extern int ColorBarBack = 0;
extern double Deviation = 0;
extern bool SoundAlertMode = false;
extern bool EmailAlertMode = false;
double Cycle = 4;
//---- indicator buffers
double MABuffer[];
double UpBuffer[];
double DnBuffer[];
double price[];
double trend[];
bool UpTrendAlert=false, DownTrendAlert=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
int ft=0;
string short_name;
//---- indicator line
IndicatorBuffers(5);
SetIndexStyle(0,DRAW_ARROW);
SetIndexBuffer(0,MABuffer);
SetIndexStyle(1,DRAW_ARROW);
SetIndexBuffer(1,UpBuffer);
SetIndexStyle(2,DRAW_ARROW);
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;
//if (shift>=1) price[i] = iMA(NULL,0,Per,Displace,Mode,Price,shift+i);
//else
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 (SoundAlertMode && trend[shift+1]<0 && shift==0) PlaySound("alert2.wav");
}
if (trend[shift]<0)
{
DnBuffer[shift] = MABuffer[shift];
if (trend[shift+ColorBarBack]>0) DnBuffer[shift+ColorBarBack]=MABuffer[shift+ColorBarBack];
UpBuffer[shift] = EMPTY_VALUE;
if (SoundAlertMode && trend[shift+1]>0 && shift==0) PlaySound("alert2.wav");
}
}
}
//----------
string Message;
if ( trend[2]<0 && trend[1]>0 && Volume[0]>1 && !UpTrendAlert)
{
Message = " "+Symbol()+" M"+Period()+": UP";
if ( SoundAlertMode ) Alert (Message);
if ( EmailAlertMode ) SendMail ("From nonlagdotMS",Message);
UpTrendAlert=true; DownTrendAlert=false;
}
if ( trend[2]>0 && trend[1]<0 && Volume[0]>1 && !DownTrendAlert)
{
Message = " "+Symbol()+" M"+Period()+": DOWN";
if ( SoundAlertMode ) Alert (Message);
if ( EmailAlertMode ) SendMail ("From nonlagdotMS",Message);
DownTrendAlert=true; UpTrendAlert=false;
}
//----
return(0);
}
Comments