SUPER_TREND 2
Download scriptThis script is designed to act as a visual trend-following indicator for MetaTrader, helping traders identify the primary direction of price movement. It translates complex market data into two distinct lines on a chart: one representing an upward trend and another representing a downward trend.
Dynamic Adaptability
A key feature of this tool is its ability to recognize different timeframes automatically. Rather than using a "one size fits all" calculation, the script adjusts its internal sensitivity based on whether you are viewing the market on a 1-minute chart versus a monthly chart. It selects specific mathematical periods to ensure that the trend identification remains relevant and smooth across varying speeds of price action.
Trend Detection Logic
The logic operates by monitoring two primary factors:
- Momentum Analysis: The script monitors a "Commodity Channel Index" (CCI), which measures the relationship between the current price and its recent average. By looking for specific "crossovers"—where the momentum moves from a negative state to a positive one (or vice versa)—the script identifies the exact moment a trend shifts.
- Price Action Filtering: To ensure the lines aren't erratic, the script compares current price data (Highs, Lows, and Closing prices) against previous candles. This creates a "smoothing" effect where the indicator only updates its position if the move is significant enough to confirm a trend change.
Visual Representation
The results are displayed as follows:
- Upward Trend: When the script detects bullish momentum, it plots a line beneath the price action. It calculates the distance of this line based on a specific "shift" value that changes depending on the timeframe, ensuring the line stays at a consistent visual distance from the candles.
- Downward Trend: Conversely, when bearish momentum is detected, it plots a line above the price action.
Summary of Behavior
In simple terms, the script acts as a smart filter. It looks at the speed and direction of the market (momentum) and combines that with the physical behavior of the price candles to draw a clear "ceiling" or "floor" on your chart. When the trend switches from up to down, the indicator swaps these lines, providing a clear visual cue for the current market environment.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| Supertrend.mq4 |
//| Copyright © 2005, Jason Robinson (jnrtrading). |
//| http://www.jnrtrading.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)."
#property link "http://www.jnrtrading.co.uk"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 DeepSkyBlue
#property indicator_color2 Yellow //Red
double TrendUp[];
double TrendDown[];
double NonTrend[];
int st = 0;
int UpDownShift;
extern int TrendCCI_Period = 14;
extern bool Automatic_Timeframe_setting;
extern int M1_CCI_Period = 34;
extern int M5_CCI_Period = 34;
extern int M15_CCI_Period = 14;
extern int M30_CCI_Period = 14;
extern int H1_CCI_Period = 14;
extern int H4_CCI_Period = 6;
extern int D1_CCI_Period = 6;
extern int W1_CCI_Period = 6;
extern int MN_CCI_Period = 6;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0, DRAW_LINE, 0, 2);
SetIndexBuffer(0, TrendUp);
SetIndexStyle(1, DRAW_LINE, 0, 2);
SetIndexBuffer(1, TrendDown);
switch(Period()) {
case 1: UpDownShift = 3; break;
case 5: UpDownShift = 5; break;
case 15: UpDownShift = 7; break;
case 30: UpDownShift = 8; break;//9
case 60: UpDownShift = 21; break;//20
case 240: UpDownShift = 34; break;//35
case 1440: UpDownShift = 40; break;
case 10080: UpDownShift = 100; break;
case 43200: UpDownShift = 120; break;
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit, i, cciPeriod;
double cciTrendNow14, cciTrendPrevious14, cciTrendNow,
cciTrendPrevious;
int counted_bars = IndicatorCounted();
//---- check for possible errors
if(counted_bars < 0) return(-1);
//---- last counted bar will be recounted
if(counted_bars > 0) counted_bars--;
limit=Bars-counted_bars;
if (Automatic_Timeframe_setting == true) {
switch(Period()) {
case 1: cciPeriod = M1_CCI_Period; break;
case 5: cciPeriod = M5_CCI_Period; break;
case 15: cciPeriod = M15_CCI_Period; break;
case 30: cciPeriod = M30_CCI_Period; break;
case 60: cciPeriod = H1_CCI_Period; break;
case 240: cciPeriod = H4_CCI_Period; break;
case 1440: cciPeriod = D1_CCI_Period; break;
case 10080: cciPeriod = W1_CCI_Period; break;
case 43200: cciPeriod = MN_CCI_Period; break;
}
}
else {
cciPeriod = TrendCCI_Period;
}
/*switch(cciPeriod) {
case 14: break;
}*/
//cciPeriod = TrendCCI_Period;
SetIndexLabel(0, ("TrendUp " + cciPeriod));
SetIndexLabel(1, ("TrendDown " + cciPeriod));
for(i = limit; i >= 0; i--) {
cciTrendNow = iCCI(NULL, 0, cciPeriod, PRICE_TYPICAL, i) + 70;
cciTrendPrevious = iCCI(NULL, 0, cciPeriod, PRICE_TYPICAL, i+1) + 70;
//cciTrendNow50 = iCCI(NULL, 0, 50, PRICE_TYPICAL, i) + 70;
//cciTrendPrevious50 = iCCI(NULL, 0, 50, PRICE_TYPICAL, i+1) + 70;
if (cciTrendNow > st && cciTrendPrevious < st) {
TrendUp[i+1] = TrendDown[i+1];
//TrendDown[i] = EMPTY_VALUE;
}
if (cciTrendNow < st && cciTrendPrevious > st) {
TrendDown[i+1] = TrendUp[i+1];
//TrendUp[i] = EMPTY_VALUE;
}
if (cciTrendNow > 0) {
TrendUp[i] = Low[i] - Point*UpDownShift;
TrendDown[i] = EMPTY_VALUE;
if (Close[i] < Open[i] && TrendDown[i+1] != TrendUp[i+1]) {
TrendUp[i] = TrendUp[i+1];
}
if (TrendUp[i] < TrendUp[i+1] && TrendDown[i+1] !=
TrendUp[i+1]) {
TrendUp[i] = TrendUp[i+1];
}
if (High[i] < High[i+1] && TrendDown[i+1] != TrendUp[i+1]) {
TrendUp[i] = TrendUp[i+1];
}
}
else if (cciTrendNow < 0) {
TrendDown[i] = High[i] + Point*UpDownShift;
TrendUp[i] = EMPTY_VALUE;
if (Close[i] > Open[i] && TrendDown[i+1] != TrendUp[i+1]) {
TrendDown[i] = TrendDown[i+1];
}
if (TrendDown[i] > TrendDown[i+1] && TrendDown[i+1] !=
TrendUp[i+1]) {
TrendDown[i] = TrendDown[i+1];
}
if (Low[i] > Low[i+1] && TrendUp[i+1] != TrendDown[i+1]) {
TrendDown[i] = TrendDown[i+1];
}
}
}
//----
//----
return(0);
}
//+------------------------------------------------------------------+
Comments