HMA-Open_v1

Download script
HMA-Open_v1

Overview of the Hull Moving Average (HMA) Tool

This script is designed to provide traders with a specialized visual aid on their charts that identifies market trends more efficiently than standard moving averages. While traditional indicators often lag behind current price action—meaning they tell you what happened in the past rather than what is happening now—this tool uses a multi-layered calculation logic to smooth out "noise" while remaining responsive to recent price changes.

How the Logic Works

The script operates through a three-step mathematical process to arrive at the final blue line displayed on your chart:

1. Weighted Price Analysis Instead of looking at all prices equally, the tool starts by calculating two different "Weighted Moving Averages" based on the opening prices of candles. The first calculation looks at a short window (half of your chosen period), and the second looks at the full period.

2. Calculating the Difference (The "Velocity") The script then calculates the difference between these two weighted averages. By subtracting the longer average from the shorter one and doubling the result, the tool essentially captures the "momentum" or the speed of the price movement. This specific step is what allows the indicator to react much faster to sudden market shifts than a standard moving average would.

3. Final Smoothing To ensure the line doesn't move erratically (which can lead to false signals), the script performs one final calculation. It takes the "momentum" data produced in the previous step and applies another moving average over it. This creates a smooth, flowing curve that follows the price closely.

Key Features for the User

  • Reduced Lag: By using this layered approach, the indicator aims to provide a clearer picture of the trend with less delay than traditional methods.
  • Customizable Sensitivity: The HMA_Period setting allows you to choose the balance between smoothness and speed. A higher number will result in a smoother, slower-moving line for identifying long-term trends, while a lower number will make the line more reactive to short-term price fluctuations.
  • Visual Clarity: The tool renders as a solid blue line directly on your main chart window, making it easy to see whether the current trend is moving upward or downward at a glance.
Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
10 Views
0 Downloads
0 Favorites
HMA-Open_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_OPEN,i)*2-
                     iMA(NULL,0,HMA_Period,0,MODE_LWMA,PRICE_OPEN,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