HMA_Color_v02_v1

Download script
Author: Ron Thompson
HMA_Color_v02_v1

This tool is designed to provide traders with a visually clear and responsive moving average that helps identify price trends with less "lag" than traditional methods. It utilizes the logic of the Hull Moving Average (HMA), which is specifically engineered to smooth out price fluctuations while maintaining its responsiveness to current market movements.

Core Logic Breakdown

1. Multi-Layered Smoothing Instead of simply averaging the price over a set period, this script performs a three-step calculation:

  • It first looks at two different averages: one based on a full time period and another based on half of that period.
  • By doubling the "half-period" average and subtracting the "full-period" average, the tool captures the immediate momentum of the price.
  • Finally, it applies a third smoothing pass (calculated using the square root of the period) to ensure the resulting line remains fluid and readable rather than jagged.

2. Trend Detection & Directional Logic The primary purpose of this script is to help users identify which way the market is moving. To achieve this, the logic compares the current value of the average against its previous value:

  • Upward Movement: When the average is moving higher than the previous point, the script identifies an upward trend.
  • Downward Movement: When the average is moving lower, it identifies a downward trend.

3. Dynamic Visual Signaling The script is programmed to change colors automatically based on these shifts in direction. Rather than showing a single constant line, it uses different colors (Lime Green, Yellow, and Red) to act as visual cues:

  • Green: Generally signifies an increasing trend or bullish momentum.
  • Red: Generally signifies a decreasing trend or bearish momentum.
  • Yellow/Neutral: Acts as a transition or specific indicator for slight shifts in the calculation's direction.

Summary for the User

Essentially, this script acts as a "smart" trend tracker. It processes complex mathematical smoothing to filter out market "noise," and then translates that data into a color-coded line on your chart. This allows you to quickly see at a glance whether the current price momentum is trending up or down without having to interpret raw, fluctuating numbers.

Indicators Used
Moving average indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
9 Views
0 Downloads
0 Favorites
HMA_Color_v02_v1
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+----------------+
//| HMA.mq4  by Ron|
//+----------------+

/*
MetaStock Formula
period:=Input("Period",1,200,20) ;
sqrtperiod:=Input("Square Root of Period",1,20,4);
Mov(2*(Mov(C,period/2,W))-Mov(C,period,W),sqrtperiod,W); 

SuperCharts Formula
Input: period (Default value 20)
waverage(2*waverage(close,period/2)-waverage(close,period), SquareRoot(Period)) 

Added color on direction change

*/


#property copyright "Ron Thompson"
#property link "http://www.metaquotes.net/"

//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 3

#property indicator_color1 LimeGreen
#property indicator_color2 Yellow
#property indicator_color3 Red

//User input
extern int HMA_Period=14;

//---- indicator buffers
double ind_buffer0[];
double ind_buffer1[];
double ind_buffer2[];

double buffer[];

int draw_begin0;


//Custom init
int init()
{
//---- indicator buffers mapping
IndicatorBuffers(4);

if(   !SetIndexBuffer(0,ind_buffer0) 
   && !SetIndexBuffer(1,ind_buffer1)
   && !SetIndexBuffer(2,ind_buffer2) 
   && !SetIndexBuffer(3, buffer))
      Print("cannot set indicator buffers!");
// ArraySetAsSeries(ind_buffer1,true);

//---- drawing settings
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,2);

draw_begin0=HMA_Period+MathFloor(MathSqrt(HMA_Period));

SetIndexDrawBegin(0,draw_begin0);
SetIndexDrawBegin(1,draw_begin0);
SetIndexDrawBegin(2,draw_begin0);

IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);

//---- name for DataWindow and indicator subwindow label
IndicatorShortName("HMA("+HMA_Period+")");
SetIndexLabel(0,"Hull Moving Average");

}


// Main Program loop
int start()
  {
   int limit,i;
   int counted_bars=IndicatorCounted();
   double tmp, tmpPrevious;
   
   double fullMA;
   double halfMA;
   
   int fullPeriod = HMA_Period;
   int halfPeriod = HMA_Period/2;
   int sqrtPeriod = MathFloor(MathSqrt(HMA_Period*1.00));

   //---- check for possible errors
   if(counted_bars<1)
     {
      for(i=1;i<=draw_begin0;i++)
        {
         buffer[Bars-i]=0;
        }
        
      for(i=1;i<=fullPeriod;i++)
        {
         ind_buffer0[Bars-i]=0;
         ind_buffer1[Bars-i]=0;
         ind_buffer2[Bars-i]=0;
        }
     }// if counted
     
   //---- 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++)
     {
      halfMA=iMA(NULL,0,halfPeriod,0,MODE_LWMA,PRICE_CLOSE,i)*2;
      fullMA=iMA(NULL,0,fullPeriod,0,MODE_LWMA,PRICE_CLOSE,i);
      buffer[i]=halfMA-fullMA;
     }

   //---- HMA counted in the 0-th buffer
   tmp=iMAOnArray(buffer,0,MathFloor(MathSqrt(HMA_Period)),0,MODE_LWMA,0);

   for(i=1; i<limit; i++)
     {
      tmpPrevious=iMAOnArray(buffer,0,MathFloor(MathSqrt(HMA_Period)),0,MODE_LWMA,i);
      if (tmpPrevious > tmp)
        {
         ind_buffer0[i] = EMPTY_VALUE;
         ind_buffer1[i] = EMPTY_VALUE;
         ind_buffer2[i] = tmpPrevious;
         ind_buffer2[i-1] = tmp; // !
        }
       else if (tmpPrevious < tmp)
        {
         ind_buffer0[i] = tmpPrevious;
         ind_buffer0[i-1] = tmp; // !
         ind_buffer1[i] = EMPTY_VALUE;
         ind_buffer2[i] = EMPTY_VALUE;
        }
       else
        {
         ind_buffer0[i] = CLR_NONE;
         ind_buffer1[i] = tmpPrevious;
         ind_buffer2[i-1] = tmp; // !
         ind_buffer2[i] = CLR_NONE;
        }
      tmp = tmpPrevious;
     }//for
  }

Comments