HMA-High_v1
Download scriptThis 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.
//+------------------------------------------------------------------+
//| 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