HMA_Russian_Color
Download scriptThis tool is designed to provide traders with a smooth, responsive visual of price trends on a trading chart. It calculates a specific type of moving average known as the Hull Moving Average (HMA), which is highly valued for its ability to minimize "lag"—the delay between a price movement and the indicator's reaction to it.
Core Mechanics
The logic operates through a multi-step calculation process to filter out market noise while maintaining high sensitivity:
- Weighted Smoothing: The script begins by calculating two different weighted moving averages based on the user-defined period. It takes half of that period and compares it against the full period. By doubling the shorter average and subtracting the longer one, it creates a "vector" that highlights immediate momentum shifts.
- Square Root Normalization: To ensure the final line remains stable and doesn't fluctuate erratically, the script applies a secondary moving average to the previously calculated vector. It uses the square root of the period as the basis for this calculation, which is a hallmark of the Hull Moving Average formula. This step creates the smooth, flowing line you see on the chart.
- Trend Detection: Beyond just drawing a line, the logic actively monitors the direction of the average. It compares the current value of the moving average against the previous value to determine if the trend is moving upward or downward.
Visual Behavior
The script intelligently organizes these calculations into distinct visual outputs:
- Dynamic Trend Mapping: When the logic detects an upward trajectory, it plots the data as an "Uptrend" line. If the trend shifts downward, it switches to a "Downtrend" line.
- Directional Clarity: By separating the data based on direction, the indicator helps traders quickly identify the current market bias. It provides a clear visual cue of whether the momentum is gaining strength in a positive direction or retreating into a negative one.
In summary, this script transforms complex mathematical smoothing into a clean, easy-to-read visual guide that highlights the "true" path of the price while filtering out the smaller, distracting fluctuations of the market.
//+------------------------------------------------------------------+
//| 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 Lime
#property indicator_color2 Lime
//---- input parameters
extern int period=100;
extern int method=2; // 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