Mega trend
Download scriptThis technical tool is designed to identify and visualize market trends by calculating a specialized moving average known as the Hull Moving Average (HMA). Unlike standard moving averages, which often lag behind price action, this script uses a mathematical approach to provide a much smoother line that reacts more quickly to sudden changes in the market.
How the Logic Works
The script processes market data through three primary stages to determine the trend:
1. Mathematical Smoothing and Weighting The tool begins by calculating a weighted average of price data over a user-defined period. It then performs a specific calculation—doubling a shorter moving average and subtracting a longer one. This specific "vector" calculation is what allows the indicator to strip away market noise while maintaining high responsiveness to new price movements.
2. Curve Refinement Once the initial vector is created, the script applies a secondary smoothing process (calculated using the square root of the period). This results in a refined curve that represents the core "momentum" of the asset. By doing this, the tool ensures that the line remains fluid and doesn't provide "false signals" caused by minor, insignificant price flickers.
3. Trend Direction and Visual Output The final stage of the logic compares the current value of the refined curve against its previous value to determine the direction:
- Bullish Trend: If the curve is moving upward, the script identifies this as an uptrend and maps it to a specific visual output (typically highlighted in Lime).
- Bearish Trend: If the curve is moving downward, it identifies a downtrend (typically highlighted in Red).
Key Features for the User
- Trend Switching: The logic is designed to recognize the exact moment the trend flips from upward to downward (or vice versa), providing clear visual cues for entry or exit points.
- Lag Reduction: Because of the underlying "Hull" mathematics, the indicator attempts to stay as close to the current price action as possible while still providing a smooth, readable line on your chart.
- Customizable Sensitivity: Users can adjust the period and calculation methods to make the indicator more "sensitive" (reacting quickly to small moves) or more "conservative" (focusing only on major, long-term shifts).
//+------------------------------------------------------------------+
//| HMA.mq4
//| Copyright © 2006 WizardSerg <wizardserg@mail.ru>, ?? ??????? ForexMagazine #104
//| wizardserg@mail.ru
//| Revised by IgorAD,igorad2003@yahoo.co.uk |
//|
//| Personalized by iGoR for the Trend Slope Trading method (T_S_T)
//| Link: http://www.strategybuilderfx.com/forums/showthread.php?t=16507
//| contact: igor@igor.cc
//+------------------------------------------------------------------+
#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 Red
//---- input parameters
extern int period=15;
extern int method=3; // 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