Hull_Trend
Download scriptThis tool is designed to provide traders with a visual representation of market trends by utilizing a specialized mathematical formula known as the Hull Moving Average (HMA). Unlike standard moving averages, which can often be "laggy" or slow to react to sudden price changes, this script focuses on identifying the current direction of the market while maintaining a smoother flow.
Core Logic and Functionality
The script operates through a multi-layered calculation process to determine the trend:
1. Dual-Layer Calculation Instead of looking at price in isolation, the tool performs a two-step mathematical operation. It first calculates a specific difference between two variations of weighted moving averages. This identifies the "momentum" or the velocity of the price movement. It then applies a second smoothing layer to that momentum to produce the final Hull Moving Average value.
2. Trend Detection The script constantly compares these two mathematical layers against each other. By analyzing whether one value is rising above or falling below the other, the tool can identify whether the market is currently in an "uptrend" or a "downtrend."
3. Visual Execution The results are displayed on your chart to make decision-making easier:
- Dynamic Highs and Lows: The script identifies the peaks and valleys of the price based on the calculated trend.
- Visual Signals: It maps these highs and lows to specific visual elements (histograms/lines) on the chart. When the mathematical conditions favor an upward move, one set of visual markers is highlighted; when they favor a downward move, the other set takes precedence.
User Experience Summary
For the end user, this script acts as a trend filter. It simplifies complex price action into a clearer visual path, helping to distinguish between significant trend shifts and minor market noise. By smoothing out the data while keeping it responsive, it aims to show you the "true" direction of the market at a glance.
//+------------------------------------------------------------------+
//| Hull Trend.mq4 |
//| Copyright © 2005, adoleh2000 |
//| adoleh2000@yahoo.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, adoleh2000."
#property link "adoleh2000@yahoo.com"
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 EMPTY
#property indicator_color4 EMPTY
//---- indicator parameters
extern int HMA_Period=20;
extern double Price=PRICE_CLOSE;
extern double Displacement=0;
//---- indicator buffers
double ind_buffer0[];
double ind_buffer1[];
double HighBuffer[];
double LowBuffer[];
int draw_begin0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicator buffers mapping
//IndicatorBuffers(4);
// ArraySetAsSeries(ind_buffer1,true);
//---- drawing settings
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,1);
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,1);
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,1);
SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,1);
SetIndexBuffer(0,HighBuffer);
SetIndexBuffer(1,LowBuffer);
SetIndexBuffer(2,ind_buffer0);
SetIndexBuffer(3,ind_buffer1);
draw_begin0=HMA_Period+MathFloor(MathSqrt(HMA_Period));
SetIndexDrawBegin(0,draw_begin0);
SetIndexDrawBegin(1,draw_begin0);
SetIndexDrawBegin(2,draw_begin0);
SetIndexDrawBegin(3,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,shift;
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,i)*2-iMA(NULL,0,HMA_Period,0,MODE_LWMA,Price,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+Displacement);
//Comment ("MA=",ind_buffer1[i],"; ","HMA=",ind_buffer0[i]);
for (shift=i; shift>=0;shift--)
{
if (ind_buffer1[shift] > ind_buffer0[shift])
{
HighBuffer[shift]=High[shift];
LowBuffer[shift]=Low[shift];
}
else
if (ind_buffer1[shift]< ind_buffer0[shift])
{
LowBuffer[shift]=High[shift];
HighBuffer[shift]=Low[shift];
}
}
//---- done
return(0);
}
Comments