The Supertrend indicator is designed to provide traders with a clear visual representation of the current market direction, helping to distinguish between bullish (upward) and bearish (downward) trends. By analyzing price action and momentum, it simplifies complex market movements into actionable trend signals.
How the Logic Works
The script operates based on three primary pillars: dynamic timeframe adaptation, momentum filtering, and trailing price boundaries.
1. Smart Timeframe Adaptation
One of the key features of this tool is its ability to automatically adjust its sensitivity based on the chart you are viewing. Whether you are looking at fast-moving 1-minute charts or long-term monthly charts, the script modifies its internal calculations (specifically the "CCI Period") to ensure that the data remains relevant. This means it becomes more precise on lower timeframes and broader on higher ones, allowing for consistent analysis across different trading styles.
2. Momentum Filtering
To determine whether a trend is actually starting or shifting, the tool utilizes a momentum oscillator (the Commodity Channel Index). It looks for specific "crosses" in this momentum:
- Bullish Signal: If the momentum moves from below a certain threshold to above it, the tool recognizes a potential shift toward an upward trend.
- Bearish Signal: If the momentum drops from above a threshold to below it, the tool signals a potential shift toward a downward trend.
3. Dynamic Price Trailing (The "Trend Line")
Once a trend is identified, the script calculates a trailing line that follows the price:
- In an Uptrend: The indicator places a support line slightly below the recent price action. If the market experiences a slight dip but remains strong, the line stays steady. However, if the price breaks significantly below this line, it signals that the upward momentum may be losing strength.
- In a Downtrend: The indicator places a resistance line slightly above the price. It tracks how far the price drops; as long as the price stays below this "ceiling," the bearish trend is considered active.
4. Trend Continuity Logic
The script includes specific checks to prevent the trend lines from jumping erratically. It ensures that the trailing lines only move in a direction that favors the current trend (e.g., an uptrend line will never move downward). By checking the high, low, and closing prices of each candle against the previous candles, the tool ensures the trend line remains "smooth," providing a stable visual guide for traders to follow without unnecessary noise.
Summary for the User
Essentially, this script acts as a moving boundary. It tells you:
- What direction the market is moving (Up or Down).
- Where the "breaking point" is (The level where a trend might reverse).
- How to adjust expectations automatically as you switch between different timeframes.
/*-----------------------------+
| |
| 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_separate_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