nonlagdotMS_alerts

Download script
Author: Copyright � 2006, TrendLaboratory
nonlagdotMS_alerts

The NonLagDOT is a sophisticated technical analysis tool designed to identify market trends with greater precision and less delay than standard moving averages. Most traditional indicators suffer from "lag"—a situation where the indicator reacts to price movements only after they have already occurred. This script uses specialized mathematical logic to mitigate that delay, providing a smoother, more responsive visual of the market's direction.

Core Logic and Methodology

1. Advanced Smoothing Mechanism Instead of using a simple average of past prices, the script employs a complex weighting system based on trigonometric cycles (specifically using cosine waves). It calculates a "weight" for each data point, ensuring that the indicator remains responsive to current price action while filtering out the "noise" or minor fluctuations that often cause false signals in standard tools.

2. Dynamic Trend Identification The script continuously monitors the movement of its own calculated line. By comparing the current value of the indicator against its previous position, it determines the momentum of the market:

  • Upward Trend: When the indicator shows a consistent positive move exceeding a specific user-defined threshold, the script identifies an "Up" trend.
  • Downward Trend: When the indicator shows a consistent negative move exceeding that same threshold, it identifies a "Down" trend.

3. Visual Representation The tool provides clear visual cues on the trading chart:

  • It utilizes distinct colors to differentiate between bullish (upward) and bearish (downward) movements.
  • It features an "offset" or "back-color" logic that helps traders see where a trend began and how it has evolved, making it easier to identify the duration of a specific market move.

User Features and Alerts

Beyond simply drawing lines on a chart, the script is designed to act as an active monitoring system through several automated features:

  • Customizable Filtering: Users can set a "Filter" sensitivity. This allows you to decide how much price movement is required before the indicator officially confirms a change in trend, helping to avoid "whipsaws" (rapid switching between up and down signals in a flat market).
  • Real-Time Notifications: The script can be configured to proactively notify the trader of trend changes. These alerts can be delivered via:
    • On-Screen Pop-ups: Visual boxes appearing on the trading platform.
    • Audible Alerts: Sound files playing to grab the trader's attention immediately.
    • Email Notifications: Sending a direct alert to an email inbox for monitoring while away from the computer.
  • Volume Validation: To ensure high-quality signals, the script can be set to only trigger alerts when there is active trading volume, ensuring that the trend change is backed by actual market participation.
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1It plays sound alerts
11 Views
3 Downloads
0 Favorites
nonlagdotMS_alerts
//+------------------------------------------------------------------+
//|                                                  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    SoundAlert  = true;  
extern bool    BoxAlert    = true;
extern bool    EmailAlert  = false;
extern int     AlertOnBar  = 1;
extern string  soundfile   = "news.wav";

double Cycle =  4;

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

bool   UpTrendAlert=false, DownTrendAlert=false;
datetime alerttag;
//+------------------------------------------------------------------+
//| 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 (trend[shift]<0) 
         {
         DnBuffer[shift] = MABuffer[shift];
         if (trend[shift+ColorBarBack]>0) DnBuffer[shift+ColorBarBack]=MABuffer[shift+ColorBarBack];
         UpBuffer[shift] = EMPTY_VALUE;
         }
      }
   }
//----------   
   string Message;
	Message = " "+Symbol()+" M"+Period()+" NonlagdotMS:";
   int b=AlertOnBar;
   if ( trend[1+b]<0 && trend[0+b]>0 && Volume[0]>1 && !UpTrendAlert && alerttag!=Time[0])
	  {
	  if ( BoxAlert )   Alert (Message," UP");  
	  if ( SoundAlert ) PlaySound(soundfile);
	  if ( EmailAlert ) SendMail ("From nonlagdotMS",Message);
	  UpTrendAlert=true; DownTrendAlert=false; alerttag =Time[0];
	  } 
	 	  
	if ( trend[1+b]>0 && trend[0+b]<0 && Volume[0]>1 && !DownTrendAlert && alerttag!=Time[0])
	  {
	  if ( BoxAlert )   Alert (Message," DOWN");  
	  if ( SoundAlert ) PlaySound(soundfile);
	  if ( EmailAlert ) SendMail ("From nonlagdotMS",Message);
	  DownTrendAlert=true; UpTrendAlert=false; alerttag=Time[0];
	  } 	         
//----
	return(0);	
}

Comments