Hull_Trend

This 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.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
12 Views
0 Downloads
0 Favorites
Hull_Trend
//+------------------------------------------------------------------+
//|                                                   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