HMAhigher
Download scriptThe 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:
- 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.
- 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.
/*-----------------------------+
| |
| 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