Hull Trend_v2
Download scriptThis technical tool is designed to help traders identify and visualize market trends by utilizing a specialized moving average called the Hull Moving Average (HMA). Unlike standard moving averages, which often suffer from significant delays, this script aims to provide a smoother curve that reacts more quickly to price changes while filtering out "market noise."
Core Logic and Functionality
The indicator operates through a three-step mathematical process to interpret price action:
1. Signal Calculation The script first calculates the difference between two distinct Weighted Moving Averages (WMA). By comparing a shorter-term average to a longer-term average, it creates a raw data stream that highlights the immediate momentum of the market.
2. Smoothing and Refinement To prevent the data from becoming too erratic, the script applies a second layer of processing to that difference. It calculates a secondary weighted average based on the square root of the user-defined period. This results in the "Hull" effect—a refined line that tracks the price trend with high responsiveness but remains visually smooth.
3. Visual Trend Tracking (Color Coding) The most practical feature for a trader is how this data is displayed on the chart. The script constantly compares its internal calculations against the current price highs and lows:
- Bullish Alignment: When the calculated momentum aligns in a positive direction, the indicator captures the high and low points of the candle to reflect an upward trend.
- Bearish Alignment: When the momentum shifts negatively, the script flips these values to highlight a downward trend.
Key Features for the User
- Dynamic Visuals: Instead of just providing a line on a sub-window, this tool interacts with the price candles, making it easier to see at a glance whether the current market environment is favoring buyers or sellers.
- Customizable Sensitivity: Users can adjust the "HMA Period" to determine how fast or slow the indicator reacts. A lower period makes the tool more sensitive to sudden price spikes, while a higher period focuses on broader, long-term trends.
- Reduced Lag: By using a weighted approach rather than a simple average, the tool attempts to stay closer to the "real-time" price action, helping traders identify trend reversals slightly earlier than they might with standard indicators.
/*-----------------------------+
| |
| 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