Slope Direction Line_004
Download scriptThe Slope Direction Line is a specialized technical analysis tool designed to help traders visualize and identify the prevailing direction of a market trend. By smoothing out minor price fluctuations, it provides a clearer picture of whether the current market momentum is leaning toward an upward or downward trajectory.
How the Logic Works
The script operates through a multi-layered calculation process to filter out "market noise" and focus on the primary movement:
1. Data Smoothing (Moving Averages) The tool begins by utilizing Moving Averages—a standard way to smooth out price data over a specific period. It focuses on the relationship between two different moving average windows. By comparing these averages, the script can identify the "velocity" of the price change rather than just the raw price itself.
2. Momentum Vector Calculation The core logic employs a mathematical formula that calculates a "vector." Instead of looking at where the price is, it looks at how fast and in what direction the trend is moving. It compares the average of a shorter timeframe against a longer timeframe to generate a value that represents the strength of the current slope.
3. Trend Identification and Smoothing Once the momentum vector is established, the tool applies an additional layer of smoothing. This ensures that the line doesn't jump erratically with every small tick in price. It creates a refined "map" of the trend, making it easier for a human observer to see the overarching flow of the market.
4. Dynamic Visual Direction (The Line Switch) The most distinct feature of this script is how it displays the results on your chart:
- Uptrend Detection: When the logic determines that the slope is moving upward, it highlights the trend in a specific color (Light Blue).
- Downtrend Detection: When the logic detects a shift to a downward slope, the visual switches to another color (Tomato).
Key Features for the User
- Clear Visual Cues: Rather than showing you a cluttered mess of data, the script translates complex math into two distinct visual lines. You can easily see when a trend has flipped by watching the color change.
- Trend Confirmation: It helps eliminate "whipsaws" (fake-out moves) by requiring the mathematical slope to actually shift before the indicator changes its direction.
- Customizable Sensitivity: Users can adjust the "period" to make the indicator more sensitive to fast price changes or more stable for long-term trend following.
In essence, this tool acts as a visual filter, stripping away the daily distractions of the market to show you the underlying "slope" of the price movement.
//+------------------------------------------------------------------+
//| Slope Direction Line
//| 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 LightBlue
#property indicator_color2 Tomato
//---- input parameters
extern int period=80;
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("Slope Direction 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);
// 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