Author: MT4 release WizardSerg <wizardserg@mail.ru>, ?? ??????? ForexMagazine #104
HMA_v3

This tool is designed to help traders identify and visualize market trends by calculating a specialized moving average known as the Hull Moving Average (HMA). Its primary goal is to provide a smoother, faster-reacting trend line than standard indicators, helping to reduce "noise" while maintaining a responsive view of price action.

How the Logic Works

The script operates through a multi-stage mathematical process to transform raw price data into clear visual signals:

1. Smoothing and Weighting Instead of looking at simple averages, the script uses a Weighted Moving Average (WMA) as its foundation. It calculates these averages across different timeframes (defined by the "period" setting) to identify the underlying momentum of the market.

2. The Calculation Sequence The logic follows a specific three-step sequence to generate the final signal:

  • Primary Calculation: It first calculates weighted averages based on half of the user-defined period and the full period.
  • Weighted Difference: It then computes a "vector" by doubling the short-term average and subtracting the long-term average. This step is what gives the Hull Moving Average its unique ability to react quickly to price changes without creating excessive jagged movements.
  • Final Smoothing: A final calculation is applied to this vector to create the actual trend line you see on your chart.

3. Trend Detection and Visualization The script automatically monitors the direction of this final calculated line:

  • Uptrend Identification: When the indicator detects that the line is moving upward, it highlights the trend in Lime. It also identifies the exact point where a downward move turns into an upward move to help pinpoint potential shifts.
  • Downtrend Identification: When the line begins to move downward, the script highlights the trend in Red. Similarly, it marks the transition from an upward move to a downward move.

Summary for the Trader

By using this logic, the indicator effectively "filters" out minor price fluctuations that often lead to false signals. It provides a clean visual representation of whether the current market momentum is leaning bullish (Lime) or bearish (Red), allowing for a more streamlined approach to trend-following strategies.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
15 Views
0 Downloads
0 Favorites
HMA_v3
//+---------------------------------------------------------------------------+ 
//| 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 2
#property indicator_color1 Lime
#property indicator_color2 Red
//---- input parameters 
extern int       period=15;
extern int       method=3;                        
extern int       price=0;                           
//---- 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("Signal 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);
      }
   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;
           }
      }
   return(0);
  }
//+------------------------------------------------------------------+ 

Comments