Hull Trend_v1
Download scriptThe Hull Trend indicator is a specialized technical analysis tool designed to identify the primary direction of market momentum by smoothing out price fluctuations. It provides traders with a clearer picture of the "flow" of the market, helping to filter out minor price noise that can often lead to false signals.
How it Works
The logic behind this tool follows a multi-layered calculation process to ensure it reacts quickly to new price movements while remaining smooth:
- Weighted Movement Analysis: Instead of using a standard moving average, the script utilizes a "Linear Weighted Moving Average" (LWMA). This gives more importance to recent price data, making the indicator more responsive to current market conditions than traditional models.
- The Hull Calculation: The script performs a unique two-step calculation. First, it calculates the difference between two different moving averages (one based on half of your chosen period and one based on the full period). It then applies a second layer of smoothing over those results. This specific mathematical combination is what allows the Hull Trend to be significantly faster and more "fluid" than most other trend indicators.
- Trend Detection: The indicator compares these internal calculations to determine the current market bias. When the underlying momentum shifts, the script identifies whether the price is trending upward or downward.
Visual Representation
The tool translates this complex math into a visual format on your chart:
- Momentum Shifting: By tracking the relationship between the calculated averages, the indicator detects when the trend changes direction.
- Dynamic Range Mapping: The script monitors the high and low prices of the candles based on these trend shifts. It essentially "wraps" around the price action, highlighting the boundaries of the current trend movement.
Summary for Traders
The primary goal of this script is to provide a more reactive yet stable trend line. Because it uses the Hull logic, it aims to reduce the "lag" (the delay between a price move and the indicator's reaction) that you typically see with standard moving averages, allowing you to see the current market direction as it develops in real-time.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| 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