HMAlower
Download scriptThis script is designed to generate a specialized technical analysis tool known as the Hull Moving Average (HMA) on your trading charts. Unlike standard moving averages that can sometimes lag behind current market prices, this indicator is engineered to provide a smoother visualization of price trends while remaining highly responsive to recent fluctuations.
How the Logic Works
The script achieves its smooth yet fast performance through a multi-layered calculation process:
1. The Foundation (Weighted Averages) Instead of looking at simple averages, the logic utilizes "Linear Weighted Moving Averages." This means it gives more importance to the most recent price data points. By focusing on current action, the indicator is better equipped to react quickly when a trend shifts.
2. The Differential Calculation The script performs a unique mathematical operation where it compares two different weighted averages: one based on half of the user-defined period and another based on the full period. By calculating the difference between these two measurements, the tool identifies the "velocity" or the core momentum of the price movement.
3. The Smoothing Pass To ensure the resulting line isn't too erratic or "jittery," the script applies a final smoothing pass over that differential data. This step rounds out the edges of the trend line, removing insignificant market noise while preserving the overall direction of the movement.
Key Features for Traders
- Reduced Lag: The primary objective of this logic is to minimize the delay between a price change and the indicator's reaction. It seeks to show you where the market is going now, rather than where it has already been.
- Customizable Sensitivity: Through the "HMA_Period" setting, users can adjust how much historical data the script considers. A lower period makes the line more sensitive to rapid changes, while a higher period provides a broader view of the long-term trend.
- Visual Clarity: The result is rendered as a solid blue line on your chart, making it easy to identify support, resistance, and momentum shifts at a glance.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| 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)-Point*40;
//---- 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