This script is designed to create a specialized technical analysis tool for trading platforms, specifically the Hull Moving Average (HMA). Unlike standard moving averages that can sometimes lag behind current market price action, this tool aims to provide a smoother line that reacts more quickly to recent price changes while still filtering out minor market "noise."
How the Logic Works
The script achieves its results by processing price data through a multi-layered calculation sequence:
1. Weighted Price Filtering The logic begins by looking at the opening prices of candles over a specific timeframe (defined by the user). Instead of treating all candles equally, it applies a "Linearly Weighted" approach. This means it gives more significance to the most recent price data, helping the tool stay relevant to what is happening in the market right now.
2. The Difference Calculation The script performs a unique mathematical operation where it compares two different weighted averages:
- It calculates a short-term average (half the length of your chosen period).
- It calculates a long-term average (the full length of your chosen period).
- By subtracting the long-term average from double the short-term average, the script isolates the momentum and "velocity" of the price movement.
3. Smoothing the Result The final step takes that calculated difference and runs it through one last smoothing pass. This ensures that the resulting line on your chart is not jagged or erratic. It creates a fluid, continuous curve that identifies the underlying trend clearly.
Key Features for the User
- Customizable Sensitivity: You can adjust the "Period" to decide how many candles the tool should look at. A smaller number makes the line more reactive; a larger number makes it slower and smoother.
- Visual Clarity: The script renders as a yellow line directly on your main price chart, allowing you to see the trend direction instantly.
- Delayed Start: To ensure accuracy, the script automatically calculates a "starting point" based on the math required for the moving average, preventing messy or inaccurate lines from appearing at the very beginning of your chart history.
In short, this tool is built for traders who want to see the true direction of the market trend with less delay than traditional indicators provide.
/*-----------------------------+
| |
| 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 Yellow
//---- indicator parameters
extern int HMA_Period=7;
extern 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()
{
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),MAshift,MODE_LWMA,PRICE_OPEN,i)*2-
iMA(NULL,0,HMA_Period,MAshift,MODE_LWMA,PRICE_OPEN,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