Big trend
Download scriptThis script functions as a specialized technical analysis tool designed to help traders identify and visualize market trends with higher precision than standard moving averages. It utilizes the logic of a "Hull Moving Average," which is specifically engineered to reduce the typical lag found in most trend-following indicators while maintaining a smooth visual output.
Core Logic Overview
The script processes market data through a multi-layered mathematical calculation to filter out "noise" and highlight the underlying direction of price movement. Instead of simply averaging past prices, it performs the following steps:
1. Weighted Momentum Calculation The logic first calculates two different weighted moving averages based on the user-defined period. By doubling the value of a shorter-term average and subtracting a longer-term average, the script isolates the immediate momentum of the market. This effectively "accelerates" the indicator's response to recent price changes.
2. Smoothing and Refinement To prevent the resulting line from being too erratic or jagged, the script applies a secondary smoothing pass. It takes the square root of the initial period to determine a refined calculation window. This ensures that while the indicator reacts quickly to new data, it remains smooth enough for a human trader to interpret clearly on a chart.
3. Trend Detection and Directional Filtering The final stage of the logic distinguishes between upward and downward movements:
- Directional Logic: The script compares the current value of the smoothed line against its previous value. If the value is rising, it identifies an upward trend; if falling, a downward trend.
- Visual Separation: Rather than drawing a single continuous line that might change colors or styles, the script separates the data into two distinct visual buffers.
Visual Output for Traders
For the end-user, this logic results in a clean, dual-layered display:
- Uptrend Identification: When the market moves up, the script plots a specific line (colored Light Pink) to represent the bullish phase.
- Downtrend Identification: When the market moves down, it plots a different line (colored Sienna) to represent the bearish phase.
By separating these two movements into distinct "buffers," the script allows traders to see exactly where a trend shift occurs, making it easier to identify turning points in the market without the visual clutter of overlapping data.
//+------------------------------------------------------------------+
//| 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 LightPink
#property indicator_color2 Sienna
//---- input parameters
extern int period=120;
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