HMA_v1
Download scriptThis technical tool is designed to provide traders with a specialized type of moving average known as the Hull Moving Average (HMA). Its primary objective is to smooth out price fluctuations while minimizing the "lag" typically associated with standard moving averages, allowing for a more responsive view of market trends.
How the Logic Works
The script operates by processing price data through a multi-layered mathematical calculation. Instead of simply averaging the price over a set period, it follows a specific two-step logic:
-
Weighting and Difference Calculation: First, the tool calculates two separate weighted averages based on the current timeframe. It takes a shorter average (half of your chosen period) and doubles it, then subtracts a longer average (the full period you selected). This specific calculation is designed to capture the momentum of the price movement more accurately than a standard average would.
-
Final Smoothing: The results from that first step are then fed into a second calculation. The script applies another weighted average to those results using a much shorter window (based on the square root of your period). This final pass smooths out the data, creating a clean, fluid line on your chart that reacts quickly to price changes but remains steady enough to be easily readable.
Key Features for the User
- Reduced Lag: By utilizing this specific mathematical sequence, the indicator tries to stay as close to the actual price action as possible, helping traders identify trend shifts sooner.
- Customizable Period: The "HMA_Period" setting allows you to define how much historical data the tool looks at. A lower number will make the line more sensitive to immediate price spikes, while a higher number will make it smoother and better for identifying long-term trends.
- Visual Clarity: The indicator is programmed to appear as a solid blue line on your chart, making it easy to distinguish from other price action indicators. It also automatically calculates where the data becomes valid on your screen to ensure you aren't looking at "broken" or incomplete lines at the very edge of the current chart.
//+------------------------------------------------------------------+
//| 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_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