!_HULL_MA
Download scriptThis tool is designed to provide traders with a specialized technical indicator known as the Hull Moving Average (HMA). Unlike standard moving averages that can sometimes lag behind current market price action, the logic behind this script focuses on smoothing out price fluctuations while remaining highly responsive to recent trends.
Core Logic and Functionality
The script operates by processing price data through a multi-stage mathematical sequence to filter out "noise" from the charts. Here is how the calculation flows:
1. Data Weighting (Linear Weighted Moving Average) Instead of treating all past price points equally, the logic utilizes a Linear Weighted Moving Average (LWMA). This gives more importance to recent prices, ensuring that the indicator reacts more quickly to new market information than a traditional simple moving average would.
2. The Difference Calculation The script performs a specific two-step calculation to determine the trend's momentum:
- It calculates a short-term weighted average (based on half of the user-defined period).
- It calculates a longer-term weighted average (based on the full period).
- It then finds the difference between these two values and doubles it. This specific step is designed to "tighten" the curve, making the indicator much more sensitive to rapid changes in direction.
3. Final Smoothing To ensure the resulting line isn't too jagged or erratic for a trader to follow visually, the script performs one final smoothing pass on the calculated differences. It applies another weighted average based on the square root of the user-defined period. This creates the signature "Hull" effect—a line that is smooth and rounded but stays very close to the actual price action.
User Experience
- Visual Output: The indicator appears as a continuous line on the main price chart, colored in Dark Orange.
- Customization: Users can adjust the "HMA Period" to determine how many candles the calculation looks back at. A lower number makes the line react faster to price changes, while a higher number creates a smoother, slower-moving trend line.
- Dynamic Calculation: The script automatically updates with every new price tick, ensuring that the line reflects the most current market data available in real-time.
//+------------------------------------------------------------------+
//| 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