THMA_v1
Download scriptThis script functions as a specialized technical analysis tool designed to smooth out price fluctuations on a trading chart. It calculates what is known as a Hull Moving Average (HMA), which is prized by traders for its ability to follow price trends more closely than traditional moving averages while significantly reducing the "lag" (the delay between a price movement and the indicator's reaction).
How the Logic Works
The script achieves its smooth, responsive result through a multi-stage mathematical process:
1. The Initial Weighted Calculation Instead of looking at all price data equally, the logic first performs a series of weighted calculations. It takes a specific portion of the look-back period and compares it against a larger section of the period. By calculating the difference between these two weighted sections, the script identifies the current momentum of the price.
2. The Smoothing Phase Once that momentum difference is established, the script applies a secondary layer of smoothing. It takes the results from the first step and processes them through another moving average calculation based on the square root of your chosen period. This "averaging of the differences" is what gives the Hull Moving Average its unique shape—it eliminates the jagged edges of raw price data while remaining highly sensitive to new trends.
3. Visual Output The final result is plotted as a solid blue line on your main chart. Because of the way the math is structured, the line appears much "tighter" to the price action than a standard moving average would. It is designed to help you identify the direction of the trend more clearly by filtering out minor market noise.
Key Settings Explained
- HMA Period: This determines the primary timeframe the indicator looks at. A higher number will make the line smoother and slower, while a lower number will make it react faster to price changes.
- Forward/Backward Offsets: These parameters allow for internal adjustments to how the data is weighted, though the primary logic relies on the Period setting to dictate the overall behavior.
In summary, this script transforms raw, erratic price movements into a refined trend line by calculating the difference between two weighted averages and then smoothing that difference to provide a clear visual path of market direction.
//+------------------------------------------------------------------+
//| 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;
extern int THMA_Forward=20;
extern int THMA_Backward=50;
//---- 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