HMA_v1

This technical tool is designed to provide traders with a specialized type of moving average known as the Hull Moving Average (HMA). Its primary objective is to smooth out price fluctuations while minimizing the "lag" typically associated with standard moving averages, allowing for a more responsive view of market trends.

How the Logic Works

The script operates by processing price data through a multi-layered mathematical calculation. Instead of simply averaging the price over a set period, it follows a specific two-step logic:

  1. Weighting and Difference Calculation: First, the tool calculates two separate weighted averages based on the current timeframe. It takes a shorter average (half of your chosen period) and doubles it, then subtracts a longer average (the full period you selected). This specific calculation is designed to capture the momentum of the price movement more accurately than a standard average would.

  2. Final Smoothing: The results from that first step are then fed into a second calculation. The script applies another weighted average to those results using a much shorter window (based on the square root of your period). This final pass smooths out the data, creating a clean, fluid line on your chart that reacts quickly to price changes but remains steady enough to be easily readable.

Key Features for the User

  • Reduced Lag: By utilizing this specific mathematical sequence, the indicator tries to stay as close to the actual price action as possible, helping traders identify trend shifts sooner.
  • Customizable Period: The "HMA_Period" setting allows you to define how much historical data the tool looks at. A lower number will make the line more sensitive to immediate price spikes, while a higher number will make it smoother and better for identifying long-term trends.
  • Visual Clarity: The indicator is programmed to appear as a solid blue line on your chart, making it easy to distinguish from other price action indicators. It also automatically calculates where the data becomes valid on your screen to ensure you aren't looking at "broken" or incomplete lines at the very edge of the current chart.
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
12 Views
0 Downloads
0 Favorites
HMA_v1
//+------------------------------------------------------------------+
//|                                                          HMA.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MetaQuotes Software Corp."
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 1
#property  indicator_color1  Blue

//---- indicator parameters
extern int HMA_Period=20;
//---- indicator buffers
double     ind_buffer0[];
double     ind_buffer1[];

int        draw_begin0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicator buffers mapping
   IndicatorBuffers(2);
   if(!SetIndexBuffer(0,ind_buffer0) && !SetIndexBuffer(1,ind_buffer1))
      Print("cannot set indicator buffers!");
//   ArraySetAsSeries(ind_buffer1,true);
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3);
   draw_begin0=HMA_Period+MathFloor(MathSqrt(HMA_Period));
   SetIndexDrawBegin(0,draw_begin0);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("HMA("+HMA_Period+")");
   SetIndexLabel(0,"Hull Moving Average");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
  {
   int limit,i;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<1)
     {
      for(i=1;i<=draw_begin0;i++) ind_buffer0[Bars-i]=0;
      for(i=1;i<=HMA_Period;i++) ind_buffer1[Bars-i]=0;
     }
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- MA difference counted in the 1-st buffer
   for(i=0; i<limit; i++)
      ind_buffer1[i]=iMA(NULL,0,MathFloor(HMA_Period/2),0,MODE_LWMA,PRICE_CLOSE,i)*2-
                     iMA(NULL,0,HMA_Period,0,MODE_LWMA,PRICE_CLOSE,i);
//---- HMA counted in the 0-th buffer
   for(i=0; i<limit; i++)
      ind_buffer0[i]=iMAOnArray(ind_buffer1,0,MathFloor(MathSqrt(HMA_Period)),0,MODE_LWMA,i);
//---- done
   return(0);
  }

Comments