Hull Trend_v3
Download scriptThis script is designed to act as a visual trend-following indicator for the MetaTrader platform. Its primary purpose is to smooth out market noise and identify the underlying direction of price movement, making it easier for traders to see whether the current momentum is bullish or bearish.
How the Logic Works
The tool operates by calculating a specialized moving average known as the Hull Moving Average (HMA). Instead of simply looking at past prices in a straight line, the script uses a multi-layered mathematical approach:
- Weighted Smoothing: The logic first calculates two different weighted averages based on the timeframe you choose. By subtracting one from the other and multiplying the result, it isolates the "velocity" or change in price.
- Refined Calculation: It then applies a second layer of smoothing to that velocity calculation. This specific sequence is what creates the "Hull" effect—it reduces the lag typically found in standard moving averages, allowing the indicator to react more quickly to real-time price shifts while remaining smooth enough to avoid false signals from minor market fluctuations.
- Dynamic Trend Identification: The script compares these calculated values against each other to determine the current state of the market.
- When the primary calculation is higher than the secondary, it identifies an upward trend.
- When the primary calculation falls below the secondary, it signals a downward trend.
Visual Representation on the Chart
To make this data easy to read at a glance, the script translates these calculations into visual elements on your chart:
- Trend Boundaries: The script identifies the high and low points of price action based on the detected trend direction.
- Color Coding: It uses distinct colors (Blue and Red tones) to highlight the shift between "High" and "Low" zones. This provides a clear visual cue: when the trend flips, the boundaries effectively swap, signaling a change in market sentiment.
By using this logic, the indicator attempts to provide a "cleaner" view of the market, helping users distinguish between temporary price spikes and sustained directional moves.
//+------------------------------------------------------------------+
//| 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 DeepSkyBlue
#property indicator_color4 MediumVioletRed
//---- 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
SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 2);
SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 2);
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(Digits+1);
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("HT(" + HMA_Period + ")");
SetIndexLabel(0, "HT(" + HMA_Period + ")");
SetIndexLabel(1, "HT2");
SetIndexLabel(2, "HTHigh");
SetIndexLabel(3, "HTLow");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Hull Trend |
//+------------------------------------------------------------------+
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);
//----
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