!_HULL_MA

This tool is designed to provide traders with a specialized technical indicator known as the Hull Moving Average (HMA). Unlike standard moving averages that can sometimes lag behind current market price action, the logic behind this script focuses on smoothing out price fluctuations while remaining highly responsive to recent trends.

Core Logic and Functionality

The script operates by processing price data through a multi-stage mathematical sequence to filter out "noise" from the charts. Here is how the calculation flows:

1. Data Weighting (Linear Weighted Moving Average) Instead of treating all past price points equally, the logic utilizes a Linear Weighted Moving Average (LWMA). This gives more importance to recent prices, ensuring that the indicator reacts more quickly to new market information than a traditional simple moving average would.

2. The Difference Calculation The script performs a specific two-step calculation to determine the trend's momentum:

  • It calculates a short-term weighted average (based on half of the user-defined period).
  • It calculates a longer-term weighted average (based on the full period).
  • It then finds the difference between these two values and doubles it. This specific step is designed to "tighten" the curve, making the indicator much more sensitive to rapid changes in direction.

3. Final Smoothing To ensure the resulting line isn't too jagged or erratic for a trader to follow visually, the script performs one final smoothing pass on the calculated differences. It applies another weighted average based on the square root of the user-defined period. This creates the signature "Hull" effect—a line that is smooth and rounded but stays very close to the actual price action.

User Experience

  • Visual Output: The indicator appears as a continuous line on the main price chart, colored in Dark Orange.
  • Customization: Users can adjust the "HMA Period" to determine how many candles the calculation looks back at. A lower number makes the line react faster to price changes, while a higher number creates a smoother, slower-moving trend line.
  • Dynamic Calculation: The script automatically updates with every new price tick, ensuring that the line reflects the most current market data available in real-time.
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
25 Views
0 Downloads
0 Favorites
!_HULL_MA
//+------------------------------------------------------------------+
//|                                                          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  DarkOrange

//---- indicator parameters
extern int HMA_Period=5;
//---- 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