HMA_Russian_Color_v1

Download script
Author: MT4 release WizardSerg <wizardserg@mail.ru>, ?? ??????? ForexMagazine #104
HMA_Russian_Color_v1

This tool is designed to provide traders with a clear, visual representation of market trends by utilizing a specialized moving average technique known as the Hull Moving Average (HMA). Its primary objective is to filter out market "noise" and identify the underlying direction of price movement more smoothly than standard indicators.

Core Logic and Functionality

The script operates through a multi-layered mathematical process to ensure that the trend lines are responsive yet stable:

1. Smoothing the Data Rather than simply averaging the price, the logic first performs a series of internal calculations. It takes the weighted average of the data over different time frames and combines them to create a "vector." This step is designed to reduce the lag typically found in traditional moving averages, allowing the indicator to react more quickly to sudden changes in market momentum.

2. Trend Identification Once the preliminary data is smoothed, the script applies a second layer of calculation (using the square root of the period) to refine the curve. This produces a final trend line that tracks price action with high fluidity. The logic then compares each new data point against the previous one to determine direction:

  • If the current value is higher than the previous one, it signifies an upward movement.
  • If the current value is lower than the previous one, it signifies a downward movement.

3. Visual Representation The indicator distinguishes between different market states using two distinct visual lines:

  • Uptrend: When the logic detects a positive trend, it plots a specific line (traditionally Aqua) to highlight bullish momentum.
  • Downtrend: When the logic detects a negative trend, it plots a separate line (traditionally Tomato) to highlight bearish momentum.

Key User Features

The script includes adjustable parameters that allow users to customize its sensitivity:

  • Period: Defines how much historical data the indicator looks back at. A higher number makes the indicator smoother and slower, while a lower number makes it more reactive to fast price changes.
  • Method & Price: These settings allow the user to choose which specific types of price data (such as Close prices) or mathematical models (like Simple vs. Weighted averages) should be used as the foundation for the calculation.

By processing the data in these stages, the script provides a "cleaned" view of the market, helping traders see whether the current price action is moving up, down, or shifting direction in real-time.

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

//+------------------------------------------------------------------+ 
//| HMA.mq4 
//| Copyright © 2006 WizardSerg <wizardserg@mail.ru>, ?? ??????? ForexMagazine #104 
//| wizardserg@mail.ru 
//|                         Revised by IgorAD,igorad2003@yahoo.co.uk |   
//|                                        http://www.forex-tsd.com/ |                                      
//+------------------------------------------------------------------+
#property copyright "MT4 release WizardSerg <wizardserg@mail.ru>, ?? ??????? ForexMagazine #104" 
#property link      "wizardserg@mail.ru" 

#property indicator_chart_window 
#property indicator_buffers 2 
#property indicator_color1 Aqua 
#property indicator_color2 Tomato 
//---- input parameters 
extern int       period=21; 
extern int       method=0;                         // MODE_SMA 
extern int       price=0;                          // PRICE_CLOSE 
//---- buffers 
double Uptrend[];
double Dntrend[];
double ExtMapBuffer[]; 


//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int init() 
{ 
    IndicatorBuffers(3);  
    SetIndexBuffer(0, Uptrend); 
    //ArraySetAsSeries(Uptrend, true); 
    SetIndexBuffer(1, Dntrend); 
    //ArraySetAsSeries(Dntrend, true); 
    SetIndexBuffer(2, ExtMapBuffer); 
    ArraySetAsSeries(ExtMapBuffer, true); 
    
    SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
    SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);
    
    IndicatorShortName("Hull Moving Average("+period+")"); 
    return(0); 
} 

//+------------------------------------------------------------------+ 
//| Custor indicator deinitialization function                       | 
//+------------------------------------------------------------------+ 
int deinit() 
{ 
    // ???? ????? ?????? ?????? 
    return(0); 
} 

//+------------------------------------------------------------------+ 
//| ?????????? ???????                                               | 
//+------------------------------------------------------------------+ 
double WMA(int x, int p) 
{ 
    return(iMA(NULL, 0, p, 0, method, price, x));    
} 

//+------------------------------------------------------------------+ 
//| Custom indicator iteration function                              | 
//+------------------------------------------------------------------+ 
int start() 
{ 
    int counted_bars = IndicatorCounted(); 
    
    if(counted_bars < 0) 
        return(-1); 
                  
    int x = 0; 
    int p = MathSqrt(period);              
    int e = Bars - counted_bars + period + 1; 
    
    double vect[], trend[]; 
    
    if(e > Bars) 
        e = Bars;    

    ArrayResize(vect, e); 
    ArraySetAsSeries(vect, true);
    ArrayResize(trend, e); 
    ArraySetAsSeries(trend, true); 
    
    for(x = 0; x < e; x++) 
    { 
        vect[x] = 2*WMA(x, period/2) - WMA(x, period);        
 //       Print("Bar date/time: ", TimeToStr(Time[x]), " close: ", Close[x], " vect[", x, "] = ", vect[x], " 2*WMA(p/2) = ", 2*WMA(x, period/2), " WMA(p) = ",  WMA(x, period)); 
    } 

    for(x = 0; x < e-period; x++)
     
        ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, method, x);        
    
    for(x = e-period; x >= 0; x--)
    {     
        trend[x] = trend[x+1];
        if (ExtMapBuffer[x]> ExtMapBuffer[x+1]) trend[x] =1;
        if (ExtMapBuffer[x]< ExtMapBuffer[x+1]) trend[x] =-1;
    
    if (trend[x]>0)
    { Uptrend[x] = ExtMapBuffer[x]; 
      if (trend[x+1]<0) Uptrend[x+1]=ExtMapBuffer[x+1];
      Dntrend[x] = EMPTY_VALUE;
    }
    else              
    if (trend[x]<0)
    { 
      Dntrend[x] = ExtMapBuffer[x]; 
      if (trend[x+1]>0) Dntrend[x+1]=ExtMapBuffer[x+1];
      Uptrend[x] = EMPTY_VALUE;
    }              
    
    //Print( " trend=",trend[x]);
    }
    
    return(0); 
} 
//+------------------------------------------------------------------+ 

Comments