HMA_Russian_Color_v1
Download scriptThis 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.
/*-----------------------------+
| |
| 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