THMA

This tool is a specialized technical analysis indicator designed to provide traders with a smoother and more responsive trend-following line on their price charts. It utilizes a sophisticated calculation method known as the Hull Moving Average (HMA), which aims to solve the common trade-off in financial charting: the balance between "lag" (how far behind the current price a line stays) and "smoothness" (how much the line wobbles or reacts to noise).

How the Logic Works

The script processes market data through a multi-layered calculation to achieve its final result. Instead of simply averaging the price over a set period—which often results in a delayed signal—this logic follows a three-step transformation process:

1. Weighted Data Input The tool begins by calculating two separate weighted averages based on the user-defined period. By using a "Linearly Weighted" approach, the script gives more importance to the most recent price actions than to older historical data. This ensures that the foundation of the calculation is tuned to current market momentum.

2. Difference Calculation (The Core Mechanism) Rather than just averaging the prices directly, the logic calculates the difference between two weighted averages: one calculated at half of the total period and another at the full period. By subtracting these two values and doubling the result, the script effectively "accelerates" the data. This step is what allows the indicator to react much faster to sudden price turns than a standard moving average would.

3. Final Smoothing To prevent the "acceleration" from creating too much visual noise or erratic zig-zags, the script performs a final calculation on the results of the previous step. It applies one last smoothing pass based on the square root of the chosen period. This stabilizes the line, ensuring that while it remains highly responsive to new trends, it stays visually clean and easy for a trader to read.

Summary for the User

In practical terms, this script provides a "fast" moving average. It is designed for traders who want to see the direction of the market trend clearly without the significant delays found in traditional indicators. Because it calculates the rate of change and then smooths that change, it identifies shifts in momentum more quickly while filtering out the minor fluctuations that often cause "false starts" in simpler tools.

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

//+------------------------------------------------------------------+
//|                                                          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;
extern int THMA_Forward=20;
extern int THMA_Backward=50;
//---- 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_CLOSE,i)*2-
                     iMA(NULL,0,HMA_Period,0,MODE_LWMA,PRICE_CLOSE,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