HMA-High_v1

Download script
HMA-High_v1

This script is designed to create a specialized technical analysis tool called the Hull Moving Average (HMA). Unlike standard moving averages which can sometimes lag behind current market price action, this specific logic is engineered to provide a smoother line that reacts more quickly to recent price changes while filtering out unnecessary market noise.

How the Logic Works

The script processes market data through a multi-stage calculation to arrive at its final visual output:

1. Data Preparation and Scaling The tool begins by looking at the "High" prices of the candles on your chart over a user-defined period (which defaults to 20). It uses a "Linear Weighted Moving Average" approach, which gives more importance to recent prices than older ones, ensuring the indicator stays relevant to what is happening right now.

2. The Difference Calculation The core of the logic happens in two distinct phases:

  • Phase A: The script calculates a fast-moving average based on half of your chosen period.
  • Phase B: It simultaneously calculates a slower-moving average based on the full period.
  • The Combination: The script then performs a mathematical "weighted difference" between these two averages. By multiplying the faster average and subtracting the slower one, the tool captures the immediate momentum of the price movement.

3. Smoothing for Stability Because calculating the difference alone can result in a very jagged or "choppy" line, the script applies a final smoothing pass. It takes the results from the previous step and runs them through one last moving average calculation (based on the square root of your period). This rounds off the sharp edges, creating a fluid, continuous curve.

Summary for the User

The end result is a blue line displayed on your chart. Because of the "Weighted Difference" logic used in the code, this line aims to be much more responsive to trend turns than a standard moving average. It helps traders identify the direction of the market trend with less delay, making it easier to see where price momentum is shifting in real-time.

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

//---- indicator parameters
extern int HMA_Period=20;
//---- 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,STYLE_SOLID,3);
   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()
  {
   int limit,i;
   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_HIGH,i)*2-
                     iMA(NULL,0,HMA_Period,0,MODE_LWMA,PRICE_HIGH,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);
//---- done
   return(0);
  }

Comments