HMA_No_Solid_v1

Download script
HMA_No_Solid_v1

Overview of the Hull Moving Average (HMA) Indicator

This script is designed to provide traders with a specialized moving average that balances two competing priorities in technical analysis: smoothness and responsiveness. While standard moving averages often lag significantly behind current price action, this tool uses a multi-layered mathematical approach to reduce that delay, allowing for a clearer view of the market's immediate trend.

How the Logic Works

The script calculates the final "Hull Moving Average" line by performing a three-step process:

1. Data Weighting and Differentiation Instead of simply averaging the closing prices of a set period, the logic first creates a secondary calculation. It compares two different weighted moving averages: one that covers half of your chosen time period and another that covers the full period. By doubling the shorter average and subtracting the longer average, the script identifies the "velocity" or the specific direction of the price change. This step is crucial because it helps neutralize the lag usually found in traditional indicators.

2. Smoothing the Results Once the weighted differences are calculated, the script applies a second layer of processing. It takes those results and runs them through another moving average calculation based on the square root of your chosen period. This "smooths out" any erratic spikes or noise generated by the first step, ensuring that the resulting line is fluid and easy to read on a chart.

3. Visual Output The final result is a single, continuous blue line plotted directly on your price chart. Because of its unique logic, this line reacts much faster to sudden price turns than a standard moving average would, while remaining steady enough to help you identify the primary trend without constant "jitter."

Key Customization

The behavior of this indicator is controlled primarily by the HMA_Period setting. By adjusting this number, you can change how many bars of historical data the script considers:

  • Lower values make the line more sensitive to rapid price fluctuations (faster reaction).
  • Higher values make the line smoother and more stable, focusing on long-term trends.
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
10 Views
0 Downloads
0 Favorites
HMA_No_Solid_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);
   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