Execute Linesw_001

Download script
Author: MT4 release WizardSerg <wizardserg@mail.ru>, ?? ??????? ForexMagazine #104
Execute Linesw_001

This script functions as a specialized visual tool designed to identify and highlight market trends based on momentum shifts. Instead of simply looking at price fluctuations, it uses a multi-layered calculation to smooth out "market noise," helping traders distinguish between minor price wobbles and actual significant trend movements.

How the Logic Works

1. Data Smoothing (The Foundation) The tool begins by calculating weighted averages of price data over a specific timeframe defined by the user. By using these averages, the script filters out erratic price spikes to reveal the underlying direction of the market.

2. Momentum Calculation To determine the strength of the movement, the logic compares two different moving average periods simultaneously. It calculates the difference between twice the short-term average and the long-term average. This creates a "vector" that represents the velocity of the price change.

3. Trend Detection & Signal Mapping The script then applies a final smoothing pass over these vectors. It looks for specific transitions in this smoothed data:

  • Upward Movement: When the value begins to rise consistently compared to its previous state, the tool identifies an upward trend.
  • Downward Movement: When the value begins to fall consistently, it identifies a downward trend.

4. Visual Representation The final output is presented on your chart in two distinct colors:

  • Uptrend (Yellow): This line appears specifically during confirmed bullish movements. It highlights the path of the trend as it moves upward.
  • Downtrend (Magenta): This line appears during confirmed bearish movements, highlighting the path as it moves downward.

Key Features for the User

  • Trend Switching: The logic is designed to "flip" between states. When the market shifts from a bearish state to a bullish state, the script recognizes the transition point and updates the visual output accordingly.
  • Noise Reduction: Because the tool uses multiple layers of calculation (averages of averages), it aims to provide a cleaner, more stable trend line than standard indicators that might change direction too frequently.
  • Customizable Sensitivity: The period settings allow you to adjust how "reactive" the indicator is—shorter periods will capture faster moves, while longer periods will focus on broader, more significant market cycles.
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
13 Views
0 Downloads
0 Favorites
Execute Linesw_001
//+------------------------------------------------------------------+ 
//| 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_separate_window 
#property indicator_buffers 2 
#property indicator_color1 Yellow 
#property indicator_color2 Magenta 
//---- input parameters 
extern int       period=5; 
extern int       method=3;                         // MODE_SMA 
extern int       price=0;                          // PRICE_CLOSE 
//---- buffers 
double Uptrend[];
double Dntrend[];
double ExtMapBuffer[]; 


//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int init() 
{ 
    IndicatorBuffers(3);  
    SetIndexBuffer(0, Uptrend); 
    //ArraySetAsSeries(Uptrend, true); 
    SetIndexBuffer(1, Dntrend); 
    //ArraySetAsSeries(Dntrend, true); 
    SetIndexBuffer(2, ExtMapBuffer); 
    ArraySetAsSeries(ExtMapBuffer, true); 
    
    SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
    SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);
    
    IndicatorShortName("Execute 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;
    }              
    
    //Print( " trend=",trend[x]);
    }
    
    return(0); 
} 
//+------------------------------------------------------------------+ 

Comments