HMA2_Color
Download scriptThis tool is a technical analysis indicator designed to provide traders with a smoother, more responsive view of price momentum compared to standard moving averages. By utilizing the Hull Moving Average (HMA) logic, it aims to reduce the "lag" typically found in traditional indicators while maintaining a clear visual representation of market trends.
How It Works
The script functions by processing historical price data through a series of sophisticated mathematical layers to calculate a refined average. Here is a breakdown of the logic:
- Multi-Layered Calculation: Instead of simply averaging the current price, the tool first performs a weighted calculation based on the market's closing prices. It compares two different variations of "Linewise Weighted Moving Averages" (LWMA) at specific intervals. This helps the script identify the underlying "velocity" of the price movement.
- Dynamic Smoothing: Once the initial difference between these averages is established, the tool applies a third layer of smoothing using a square root calculation based on your chosen period. This specific mathematical approach is what defines the "Hull" logic—it allows the indicator to stay very close to the actual price action without creating the jagged, erratic movements often seen in simpler models.
- Visual Trend Signaling: The indicator manages three distinct visual buffers (represented by different colors: White, Yellow, and Red). These are used to highlight changes in direction:
- It tracks whether the current calculated value is rising or falling relative to the previous one.
- When the trend shifts, the script intelligently assigns values to specific buffers to draw lines that clearly mark the transition points.
- By comparing the "current" vs. "previous" state of these calculations, it provides a clean visual path that tells you whether momentum is gaining or losing strength.
Key Benefits for the User
- Reduced Lag: By using the weighted logic described above, the tool reacts much faster to sudden price turns than a standard moving average would.
- Visual Clarity: Because it manages three separate buffers, it can distinguish between different types of price movement, helping you identify not just where the price is, but the direction in which it is heading.
- Customizable Sensitivity: The logic is centered around a "Period" setting. A shorter period will make the indicator more reactive to immediate price changes, while a longer period will smooth out the noise for a broader view of the market trend.
//| HMA1.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_separate_window
#property indicator_buffers 3
#property indicator_color1 White
#property indicator_color2 Yellow
#property indicator_color3 Red
//---- indicator parameters
extern int HMA_Period=18;
//---- indicator buffers
double ind_buffer0[];
double ind_buffer1[];
double ind_buffer2[];
double buffer[];
int draw_begin0;
//+------------------------------------------------------------------
//| Custom indicator initialization function |
//+------------------------------------------------------------------
int init()
{
//---- indicator buffers mapping
IndicatorBuffers(4);
if(!SetIndexBuffer(0,ind_buffer0) && !SetIndexBuffer(1,ind_buffer1)
&& !SetIndexBuffer(2,ind_buffer2) && !SetIndexBuffer(3, buffer))
Print("cannot set indicator buffers!");
// ArraySetAsSeries(ind_buffer1,true);
//---- drawing settings
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3);
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,3);
draw_begin0=HMA_Period+MathFloor(MathSqrt(HMA_Period));
SetIndexDrawBegin(0,draw_begin0);
SetIndexDrawBegin(1,draw_begin0);
SetIndexDrawBegin(2,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();
double tmp, tmpPrevious;
//---- check for possible errors
if(counted_bars<1)
{
for(i=1;i<=draw_begin0;i++) buffer[Bars-i]=0;
for(i=1;i<=HMA_Period;i++)
{
ind_buffer0[Bars-i]=0;
ind_buffer1[Bars-i]=0;
ind_buffer2[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++)
{
buffer[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
tmp=iMAOnArray(buffer,0,MathFloor(MathSqrt
(HMA_Period)),0,MODE_LWMA,0);
for(i=1; i<limit; i++)
{
tmpPrevious=iMAOnArray(buffer,0,MathFloor(MathSqrt
(HMA_Period)),0,MODE_LWMA,i);
if (tmpPrevious > tmp)
{
ind_buffer0[i] = EMPTY_VALUE;
ind_buffer1[i] = EMPTY_VALUE;
ind_buffer2[i] = tmpPrevious;
ind_buffer2[i-1] = tmp; // !
}
else if (tmpPrevious < tmp)
{
ind_buffer0[i] = tmpPrevious;
ind_buffer0[i-1] = tmp; // !
ind_buffer1[i] = EMPTY_VALUE;
ind_buffer2[i] = EMPTY_VALUE;
}
else
{
ind_buffer0[i] = CLR_NONE;
ind_buffer1[i] = tmpPrevious;
ind_buffer2[i-1] = tmp; // !
ind_buffer2[i] = CLR_NONE;
}
tmp = tmpPrevious;
}
//---- done
return(0);
}
Comments