HMAhigher_v1
Download scriptThis tool is a specialized technical analysis indicator designed to help traders identify trends in the financial markets with greater precision and less "lag" than standard moving averages. It utilizes a specific mathematical approach known as the Hull Moving Average (HMA).
How the Logic Works
The primary goal of this script is to provide a smooth, responsive line on your trading chart that follows price movements closely while filtering out minor market noise. To achieve this, the logic operates in two distinct stages:
1. The Weighted Calculation Phase Instead of looking at the price simply as it is, the script first performs a complex calculation based on "Linear Weighted Moving Averages." It takes the current price data and applies a specific weight to it—essentially giving more importance to the most recent price actions.
By calculating two different versions of these weighted averages (one with a shorter period and one with a longer period) and combining them, the script effectively "accelerates" the average's ability to react to new information. This helps the indicator stay closer to the actual price line during rapid market shifts.
2. The Smoothing Phase Once that initial weighted calculation is complete, the script performs a second pass of processing. It takes the results from the first stage and smooths them out using a square root calculation of your chosen period.
This two-step process is what makes this indicator unique:
- The first step ensures the line is fast and reactive.
- The second step ensures the line remains smooth and doesn't jump erratically.
Key Features for the User
- Reduced Lag: Unlike traditional moving averages that often "trail" behind the price, this logic tries to stay as close to the current market action as possible.
- Customizable Sensitivity: You can adjust the "HMA_Period" to determine how many bars of data the script should consider. A lower number will make the line more reactive to sudden changes; a higher number will make it smoother and better for identifying long-term trends.
- Visual Clarity: The tool renders as a solid blue line on your chart, providing a clear visual cue of the market's momentum.
In short, this script is designed for traders who need a reliable trend-following tool that balances speed and smoothness, helping you identify the direction of the market more efficiently than standard tools allow.
//+------------------------------------------------------------------+
//| 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