This tool is designed to help traders identify and visualize market trends by smoothing out price fluctuations. It works by calculating a specialized moving average that reacts quickly to price changes while filtering out unnecessary "noise."
How the Logic Works
The script follows a multi-step process to determine the current direction of the market:
1. Smoothing the Price Action Instead of looking at raw price data, which can be jumpy and erratic, the script first processes the data through two different types of moving averages. It calculates a "fast" average (based on half of your chosen period) and a "slow" average (based on the full period).
2. Creating the Base Vector By mathematically combining these two averages, the script creates a specialized data point. This step is crucial because it emphasizes recent price momentum while still maintaining a sense of the broader trend. This combined value acts as the foundation for the visual lines you see on your chart.
3. Final Trend Filtering The script then takes that foundation and applies one final smoothing layer. This ensures that the resulting line is steady and easy to read. It specifically looks at the "slope" of this final line:
- Uptrend Detection: If the line is moving upwards, the script identifies this as an upward trend.
- Downtrend Detection: If the line is moving downwards, it identifies this as a downward trend.
Visual Representation on Your Chart
The script handles the visual output by separating these trends into two distinct lines:
- The Yellow Line (Uptrend): This line appears only when the script detects upward momentum. When the market turns down, this line disappears.
- The Magenta Line (Downtrend): This line appears only when the script detects downward momentum. When the market turns up, this line disappears.
By using these two separate colors, the tool provides a clear visual cue: the active color tells you which way the current trend is flowing, while the disappearance of one color and the appearance of the other signals a potential shift in market direction.
//+------------------------------------------------------------------+
//| Execute Line Build 205 Ok.mq4 |
//+------------------------------------------------------------------+
//| HMA
//| Copyright © 2006 WizardSerg <wizardserg@mail.ru>, ?? ??????? ForexMagazine #104
//| wizardserg@mail.ru
//| Revised by IgorAD,igorad2003@yahoo.co.uk |
//|
//| Personalized by iGoR AKA FXiGoR for the Trend Slope Trading method (T_S_T)
//| Link:
//| contact: thefuturemaster@hotmail.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 Yellow
#property indicator_color2 Magenta
//---- input parameters
extern int period=5;
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("Execute Line("+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);// build 205 can not do math this way
double price = WMA(x, period/2);// tdavid , 5/29/07 due to MT build 205 math bug
vect[x] = (price*2) - WMA(x, period); // tdavid , 5/29/07 due to MT build 205 math bug
// 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