HMA-Open_v1
Download scriptOverview 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_Periodsetting 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.
//+------------------------------------------------------------------+
//| 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