HMA_No_Solid_v1
Download scriptOverview of the Hull Moving Average (HMA) Indicator
This script is designed to provide traders with a specialized moving average that balances two competing priorities in technical analysis: smoothness and responsiveness. While standard moving averages often lag significantly behind current price action, this tool uses a multi-layered mathematical approach to reduce that delay, allowing for a clearer view of the market's immediate trend.
How the Logic Works
The script calculates the final "Hull Moving Average" line by performing a three-step process:
1. Data Weighting and Differentiation Instead of simply averaging the closing prices of a set period, the logic first creates a secondary calculation. It compares two different weighted moving averages: one that covers half of your chosen time period and another that covers the full period. By doubling the shorter average and subtracting the longer average, the script identifies the "velocity" or the specific direction of the price change. This step is crucial because it helps neutralize the lag usually found in traditional indicators.
2. Smoothing the Results Once the weighted differences are calculated, the script applies a second layer of processing. It takes those results and runs them through another moving average calculation based on the square root of your chosen period. This "smooths out" any erratic spikes or noise generated by the first step, ensuring that the resulting line is fluid and easy to read on a chart.
3. Visual Output The final result is a single, continuous blue line plotted directly on your price chart. Because of its unique logic, this line reacts much faster to sudden price turns than a standard moving average would, while remaining steady enough to help you identify the primary trend without constant "jitter."
Key Customization
The behavior of this indicator is controlled primarily by the HMA_Period setting. By adjusting this number, you can change how many bars of historical data the script considers:
- Lower values make the line more sensitive to rapid price fluctuations (faster reaction).
- Higher values make the line smoother and more stable, focusing on long-term trends.
//+------------------------------------------------------------------+
//| 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);
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