This tool is designed to provide traders with a more responsive and fluid way to visualize price trends on a trading chart. While standard moving averages often suffer from a delay—meaning they react slowly to sudden market shifts or, conversely, become too "noisy" and erratic—this specific indicator utilizes a multi-layered calculation method to balance speed and smoothness.
How the Logic Works
The indicator functions by performing a series of nested calculations rather than relying on a single average. It processes market data through three distinct conceptual stages:
-
Weighting the Momentum: First, the script looks at the price action over a specific period (defined by the user). It calculates two different linear weighted averages: one that is half the length of the target period and another that is the full length. By doubling the shorter average and subtracting the longer one, the tool captures the immediate "momentum" or change in direction of the market.
-
Smoothing the Data: Once that momentum is identified, the script applies a second layer of calculation. It takes the results from the first step and runs them through a weighted average again, but this time using a mathematical square root of the period. This specific step is what provides the "Hull" characteristic, effectively filtering out the jittery movements while maintaining a much tighter fit to the actual price than a standard moving average would allow.
-
Visual Output: The final result is plotted as a single continuous line on your chart. Because of this dual-processing logic, the line aims to stay very close to the current price during fast trends (reducing lag) while remaining smooth enough to clearly indicate the overall direction of the market.
Key Features for the User
- Reduced Lag: By calculating differences between moving averages before smoothing them out, the indicator identifies trend turns faster than traditional methods.
- Visual Clarity: The tool is designed to produce a clean, "flowing" line that helps traders distinguish between minor price fluctuations and significant trend shifts.
- Customizable Sensitivity: Users can adjust the primary period setting to make the line react more aggressively to short-term price changes or more conservatively for long-term trend analysis.
/*-----------------------------+
| |
| 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 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