Slope Direction Line

Download script
Author: MT4 release WizardSerg <wizardserg@mail.ru>, ?? ??????? ForexMagazine #104
Slope Direction Line

This script is a specialized technical analysis tool designed for the MetaTrader 4 platform to help traders identify and visualize market trends. It focuses on calculating the "slope" or momentum of price movements by filtering out market noise to provide a clearer picture of whether the market is currently trending upwards or downwards.

Core Logic Overview

The tool operates by calculating a multi-layered moving average system. Instead of simply looking at where the price is, it looks at the rate of change within the price movement. It achieves this through three primary stages:

1. Velocity Calculation The script first calculates the difference between two different types of moving averages. By comparing a shorter-term moving average against a longer-term one, it creates a "vector" or a velocity value. This tells the script how fast and in what direction the price is currently moving relative to its recent history.

2. Smoothing the Signal To prevent the indicator from reacting too wildly to small, insignificant price flickers (noise), the script takes that velocity data and applies an additional smoothing pass (a secondary moving average). This produces a continuous line on your chart that represents the underlying "momentum" of the market.

3. Trend Identification and Visuals Finally, the logic compares the current smoothed value to the previous one:

  • Uptrend: If the momentum value is higher than it was in the previous period, the script identifies an upward trend and plots a specific line on the chart.
  • Downtrend: If the momentum value is lower than the previous period, it identifies a downward trend and plots a separate line.

Automated Alerts

Beyond just drawing lines on the chart, the script includes an automated notification system. It monitors the moment the trend flips (e.g., when the momentum shifts from positive to negative). When these specific "crossover" points occur:

  • Audio Alerts: It can trigger a sound notification on your computer.
  • Email Notifications: It can send a direct email to your connected account, providing the exact price (Ask and Bid), the date, the time, and the specific currency pair being traded.

Summary for the User

Essentially, this tool acts as a trend-following filter. It interprets the "speed" of price movement to decide if the market is leaning bullish or bearish. By smoothing out the erratic movements of the market, it attempts to provide a cleaner visual signal of the current trend while proactively notifying you via sound or email whenever that trend changes direction.

Price Data Components
Series array that contains open time of each bar
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screenIt sends emails
9 Views
1 Downloads
0 Favorites
Slope Direction Line
//+------------------------------------------------------------------+ 
//| HMA.mq4 
//| Copyright © 2006 WizardSerg <wizardserg@mail.ru>, ?? ??????? ForexMagazine #104 
//| wizardserg@mail.ru 
//| Revised by IgorAD,igorad2003@yahoo.co.uk |   
//| Personalized by iGoR AKA FXiGoR for the Trend Slope Trading method (T_S_T) 
//| Link: 
//| contact: thefuturemaster@hotmail.com                                                                         
//+------------------------------------------------------------------+
#property copyright "MT4 release WizardSerg <wizardserg@mail.ru>, ?? ??????? ForexMagazine #104" 
#property link      "wizardserg@mail.ru" 

#property indicator_chart_window 
#property indicator_buffers 3 
#property indicator_color2 Blue 
#property indicator_color3 Red 
#property indicator_color1 Orange 
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1

//---- input parameters 
extern string note1 ="period of MA; default = 60";
extern int       period=60; 
extern string note2 = "0=Simple,1=Exponential";
extern string note3 = "2=Smooth,3=Linear Weighted";
extern int       method=3;                          
extern string note4 ="0=Hi/Low, 1=Close/Close";
extern int       price=0;                           
extern string note5 ="E-mail Alert";
extern string note6 ="0=false;1=true";
extern int       EmailON=1;                        // 0 = false    1 = true
extern string note7 ="0=false;1=true";
extern int       SoundON=1;                        // 0 = false    1 = true
//---- buffers 
double Uptrend[];
double Dntrend[];
double ExtMapBuffer[]; 
double buff[];


//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int init() 
{ 
    IndicatorBuffers(3);  
    SetIndexBuffer(1, Uptrend); 
    //ArraySetAsSeries(Uptrend, true); 
    SetIndexBuffer(2, Dntrend); 
    //ArraySetAsSeries(Dntrend, true); 
    //SetIndexBuffer(2, ExtMapBuffer); 
    //ArraySetAsSeries(Uptrend, true);
    SetIndexBuffer(0, ExtMapBuffer); 
    ArraySetAsSeries(ExtMapBuffer, true); 
    
    SetIndexStyle(0,DRAW_LINE);
    SetIndexStyle(1,DRAW_LINE);
    SetIndexStyle(2,DRAW_LINE);
    
    IndicatorShortName("Slope Direction Line("+period+")"); 
    return(0); 
} 

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

//+------------------------------------------------------------------+ 
//| ?????????? ???????                                               | 
//+------------------------------------------------------------------+ 
double WMA(int x, int p) 
{ 
    return(iMA(NULL, 0, p, 0, method, price, x));    
} 

//+------------------------------------------------------------------+ 
//| Custom indicator iteration function                              | 
//+------------------------------------------------------------------+ 
int start() 
{ 
    int counted_bars = IndicatorCounted(); 
    
    if(counted_bars < 0) 
        return(-1); 
                  
    int x = 0; 
    int p = MathSqrt(period);              
    int e = Bars - counted_bars + period + 1; 
    
    double vect[], trend[]; 
    
    if(e > Bars) 
        e = Bars;    

    ArrayResize(vect, e); 
    ArraySetAsSeries(vect, true);
    ArrayResize(trend, e); 
    ArraySetAsSeries(trend, true); 
    
    for(x = 0; x < e; x++) 
    { 
        vect[x] = 2*WMA(x, period/2) - WMA(x, period);        
 //       Print("Bar date/time: ", TimeToStr(Time[x]), " close: ", Close[x], " vect[", x, "] = ", vect[x], " 2*WMA(p/2) = ", 2*WMA(x, period/2), " WMA(p) = ",  WMA(x, period)); 
    } 

    for(x = 0; x < e-period; x++)
     
        ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, method, x);        
    
    for(x = e-period; x >= 0; x--)
    {     
        trend[x] = trend[x+1];
        if (ExtMapBuffer[x]> ExtMapBuffer[x+1]) trend[x] =1;
        if (ExtMapBuffer[x]< ExtMapBuffer[x+1]) trend[x] =-1;
    
    if (trend[x]>0)
    { Uptrend[x] = ExtMapBuffer[x]; 
      if (trend[x+1]<0) Uptrend[x+1]=ExtMapBuffer[x+1];
      Dntrend[x] = EMPTY_VALUE;
    }
    else              
    if (trend[x]<0)
    { 
      Dntrend[x] = ExtMapBuffer[x]; 
      if (trend[x+1]>0) Dntrend[x+1]=ExtMapBuffer[x+1];
      Uptrend[x] = EMPTY_VALUE;
    }    
    buff[x] = trend[x];          
    
    //Print( " trend=",trend[x]);
    }
    if (EmailON==1 && Dntrend[0] != EMPTY_VALUE &&   Dntrend[1] == EMPTY_VALUE && isNewBar())
    { 
      if (SoundON==1) Alert("SELL signal at Ask=",Ask,", Bid=",Bid,", Date=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime())," Symbol=",Symbol()," Period=",Period());
      SendMail("SELL signal alert","SELL signal at Ask="+DoubleToStr(Ask,4)+", Bid="+DoubleToStr(Bid,4)+", Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
    }
    if (EmailON==1 && Uptrend[0] != EMPTY_VALUE &&   Uptrend[1] == EMPTY_VALUE && isNewBar()) 
    { 
      if (SoundON==1) Alert("BUY signal at Ask=",Ask,", Bid=",Bid,", Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime())," Symbol=",Symbol()," Period=",Period());
      SendMail("BUY signal alert","BUY signal at Ask="+DoubleToStr(Ask,4)+", Bid="+DoubleToStr(Bid,4)+", Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
    }
    return(0); 
}

bool isNewBar()
{
   static datetime lastbar=0;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
      return(false);
   }
}  

 
//+------------------------------------------------------------------+ 

Comments