HMAhigher

The Hull Moving Average (HMA) is a technical analysis tool designed to provide traders with a smoothed representation of price trends while minimizing the inherent "lag" typically found in traditional moving averages. For investors who need to identify the direction of the market quickly without reacting to every minor price fluctuation, this script serves as a visual guide to current momentum.

Core Logic and Functionality

The logic of this script operates through a multi-layered calculation process to achieve its specific results:

  • Smoothing and Responsiveness: Unlike standard moving averages that simply average the price over a set period, the HMA uses a specialized mathematical sequence. It calculates "Linear Weighted Moving Averages" (LWMA) across different timeframes. By combining multiple weighted averages, the script can prioritize more recent price action while still maintaining a smooth line on the chart.
  • Two-Stage Calculation: The script processes the data in two primary stages:
    1. Weighted Difference: It first calculates the difference between two weighted moving averages—one based on half of the user-defined period and another based on the full period. This highlights the immediate "velocity" of price changes.
    2. Final Averaging: It then takes those results and runs them through a second weighted average based on the square root of the period. This final step "rounds off" the data, creating the fluid, curved line that traders see on their screens.
  • Dynamic Adjustment: The script allows for a customizable "Period" setting. A shorter period makes the line react more quickly to sudden price movements (ideal for day trading), while a longer period creates a broader, smoother curve suitable for identifying long-term trends.

Visual Output

When active on a chart, the script generates a solid blue line. Because it is designed to filter out "noise," it provides a clearer view of whether the market is currently in an uptrend (where the line slopes upward) or a downtrend (where the line slopes downward). By calculating the starting point based on the period length, it ensures that the visual data only appears once there is enough historical information to provide an accurate calculation.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
10 Views
0 Downloads
0 Favorites
HMAhigher
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                          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)+Point*40;
//---- 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