HMA-Open
Download scriptThis script is designed to create a specialized technical analysis tool known as the Hull Moving Average (HMA). Unlike standard moving averages, which often struggle to balance responsiveness with smoothness, this indicator uses a sophisticated three-step mathematical process to track price trends more efficiently.
Core Logic Overview
The primary goal of this logic is to reduce the "lag" typically found in traditional trend indicators. It achieves this by calculating moving averages of moving averages in a specific sequence:
1. Weighted Data Processing The script begins by analyzing the price data using a Linear Weighted Moving Average (LWMA). It takes two different sets of weighted averages—one based on half of the user-defined period and another based on the full period. By doubling the first result and subtracting the second, it creates a specialized data set that highlights the immediate momentum of the market.
2. Secondary Smoothing Instead of applying this logic directly to the chart, the script stores these intermediate calculations in a hidden buffer. It then performs a secondary smoothing operation on this new data set. This step is crucial because it filters out "noise" and minor price fluctuations while preserving the overall direction of the trend.
3. Final Trend Visualization The final result is plotted as a solid blue line on your trading chart. The thickness and style are configured to be clearly visible, allowing traders to see the smoothed average price in real-time.
Key Features for Traders
- Reduced Lag: Because of the way it compounds moving averages, the resulting line follows the price much more closely than a standard Simple Moving Average (SMA).
- Dynamic Periodicity: The script automatically calculates the necessary smoothing depth based on the square root of your chosen period. This ensures that as you change the timeframe sensitivity, the indicator maintains its mathematical integrity and smoothness.
- Visual Clarity: The indicator is programmed to begin drawing only after a sufficient amount of data has accumulated, ensuring that the line remains stable and accurate from the moment it appears on your screen.
In summary, this tool transforms raw price action into a smooth, responsive trend line by calculating the difference between two weighted averages and then smoothing those differences once more.
/*-----------------------------+
| |
| 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);
//---- 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