HMA2

This script is designed to generate a specialized technical analysis tool known as the Hull Moving Average (HMA). Unlike standard moving averages that can often lag behind current market prices, this specific logic aims to provide a smoother, more responsive trend line that reacts quickly to price changes while filtering out unnecessary "noise."

How the Logic Works

The script achieves its smooth yet responsive results by processing data through a multi-stage calculation:

1. Establishing the Foundation The tool starts by looking at the current period of time you have selected. It breaks this period down into smaller mathematical components—specifically, it calculates half of your chosen period and the square root of that period. These smaller figures are used as the building blocks for the final result.

2. Weighted Calculations Instead of treating every price point with equal importance, the logic uses a "Linearly Weighted" approach. This means it gives more weight to recent price data, ensuring that the indicator reflects what is happening now rather than what happened a long time ago. It focuses specifically on the opening prices of the candles to determine the trend.

3. Calculating Differences The script performs a subtraction process:

  • It calculates a weighted average based on the smaller period (half-period) and doubles it.
  • It then calculates a weighted average based on your full chosen period.
  • By subtracting the second value from the first, the script identifies the "momentum" or the rate of change between these two different timeframes.

4. The Final Smoothing Layer In the final step, the script takes those calculated differences and runs them through one last smoothing process based on the square root of your period. This final pass rounds off any jagged edges, creating a fluid line on your chart.

Summary for the User

Essentially, this script doesn't just look at the price; it looks at how the price is moving across different time scales simultaneously. It calculates the difference between short-term and long-term trends and then smooths out that difference to create a single, continuous line. For a trader, this provides a visual representation of the market trend that attempts to be as "fast" as possible without being erratic.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
13 Views
0 Downloads
0 Favorites
HMA2
//+------------------------------------------------------------------+
//|                                                          HMA.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MetaQuotes Software Corp."
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 1
#property  indicator_color1  Yellow

//---- indicator parameters
extern int HMA_Period=4;
 int MAshift=0;
//---- indicator buffers
double     ind_buffer0[];
double     ind_buffer1[];

int        draw_begin0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicator buffers mapping
   IndicatorBuffers(2);
   if(!SetIndexBuffer(0,ind_buffer0) && !SetIndexBuffer(1,ind_buffer1))
      Print("cannot set indicator buffers!");
//   ArraySetAsSeries(ind_buffer1,true);
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   draw_begin0=HMA_Period+MathFloor(MathSqrt(HMA_Period));
   SetIndexDrawBegin(0,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()
  {
   double ma1, ma2;
   int limit,i, HMA_Period2, HMA_PeriodSQ2;
   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;
   HMA_Period2 = MathFloor(HMA_Period/2);
   HMA_PeriodSQ2 = MathFloor(MathSqrt(HMA_Period));
//---- MA difference counted in the 1-st buffer
   for(i=0; i<limit; i++)
   {
      ma1 = iMA(NULL,0,HMA_Period2,MAshift,MODE_LWMA,PRICE_OPEN,i)*2;
                     
      ma2 = iMA(NULL,0,HMA_Period,MAshift,MODE_LWMA,PRICE_OPEN,i);
      ind_buffer1[i]=ma1 - ma2;
   }
//---- HMA counted in the 0-th buffer
   for(i=limit -1 ; i>=0; i--)
      ind_buffer0[i]=iMAOnArray(ind_buffer1,0,HMA_PeriodSQ2,0,MODE_LWMA,i);
//---- done
   return(0);
  }

//+------------------------------------------------------------------+

Comments