_2523MTF Supertrend Bar
Download scriptThis script functions as a multi-timeframe analysis tool designed to provide traders with a comprehensive overview of market trends across different time scales simultaneously. Instead of requiring you to switch back and forth between different charts to see the "big picture," this tool consolidates that information into a single view.
Core Functionality
The primary logic of the script is to monitor four different time periods at once (for example, 15-minute, 30-minute, 1-hour, and 4-hour charts). It identifies the prevailing trend for each of these periods using a technical analysis method known as the "SuperTrend."
Key Features and Logic:
-
Multi-Timeframe Synchronization: The script automatically calculates and pulls data from four distinct timeframes. It ensures that even if you are currently looking at a 15-minute chart, you can still see what is happening on much larger hourly or daily scales.
-
Dynamic Timeframe Selection (AutoDisplay): To keep the data relevant to your current view, the script features an "AutoDisplay" logic. It intelligently adjusts which timeframes it tracks based on the chart you have open. For instance, if you move to a daily chart, it will automatically shift its focus to track even larger scales (like Weekly or Monthly) to maintain a consistent perspective of the market hierarchy.
-
Visual Trend Indicators: The logic identifies whether a trend is "Up" or "Down" for each of the four selected timeframes. It translates this data into visual markers (arrows) on your screen. This allows you to see at a glance if all timeframes are in agreement (alignment) or if there is a conflict between short-term price action and long-term trends.
-
Clean Interface Management: The script includes logic to manage the visual workspace. It automatically labels the different trend indicators so you know which timeframe corresponds to which marker. Additionally, it handles the refreshing of these markers, clearing out old data to ensure that your chart remains clean and only displays current, accurate information.
Summary for the User
In simple terms, this script acts as a "trend radar." It looks ahead at four different time horizons simultaneously and tells you, through visual cues, whether the market is trending up or down on each of those levels. This helps traders avoid "getting lost" in short-term noise by confirming if the smaller movements are supported by the larger overarching trends.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| #MTF Supertrend Bar.mq4 |
//| Copyright © 2006, Eli hayun |
//| http://www.elihayun.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Eli hayun"
#property link "http://www.elihayun.com"
#property indicator_separate_window
#property indicator_minimum 0
//#property indicator_maximum 5
#property indicator_buffers 8
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Red
#property indicator_color4 Blue
#property indicator_color5 Red
#property indicator_color6 Blue
#property indicator_color7 Red
#property indicator_color8 Blue
//---- buffers
double buf4_up[];
double buf4_down[];
double buf3_up[];
double buf3_down[];
double buf2_up[];
double buf2_down[];
double buf1_up[];
double buf1_down[];
extern double Gap = 1; // Gap between the lines of bars
extern int Period_1 = PERIOD_M15;
extern int Period_2 = PERIOD_M30;
extern int Period_3 = PERIOD_H1;
extern int Period_4 = PERIOD_H4;
extern bool AutoDisplay = true;
string shortname = "";
bool firstTime = true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
SetAutoDisplay();
shortname = "# SuperTbar("+Period_1+","+Period_2+","+Period_3+","+Period_4+")";
firstTime = true;
IndicatorShortName(shortname);
//---- indicators
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,110);
SetIndexBuffer(0,buf4_up);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,110);
SetIndexBuffer(1,buf4_down);
SetIndexEmptyValue(1,0.0);
SetIndexStyle(2,DRAW_ARROW);
SetIndexArrow(2,110);
SetIndexBuffer(2,buf3_up);
SetIndexEmptyValue(2,0.0);
SetIndexStyle(3,DRAW_ARROW);
SetIndexArrow(3,110);
SetIndexBuffer(3,buf3_down);
SetIndexEmptyValue(3,0.0);
SetIndexStyle(4,DRAW_ARROW);
SetIndexArrow(4,110);
SetIndexBuffer(4,buf2_up);
SetIndexEmptyValue(4,0.0);
SetIndexStyle(5,DRAW_ARROW);
SetIndexArrow(5,110);
SetIndexBuffer(5,buf2_down);
SetIndexEmptyValue(5,0.0);
SetIndexStyle(6,DRAW_ARROW);
SetIndexArrow(6,110);
SetIndexBuffer(6,buf1_up);
SetIndexEmptyValue(6,0.0);
SetIndexStyle(7,DRAW_ARROW);
SetIndexArrow(7,110);
SetIndexBuffer(7,buf1_down);
SetIndexEmptyValue(7,0.0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
SetAutoDisplay();
shortname = "# SuperTbar("+Period_1+","+Period_2+","+Period_3+","+Period_4+")";
firstTime = true;
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
int i=0, y15m=0, y4h=0, y1h=0, y30m=0, yy;
int limit=Bars-counted_bars;
datetime TimeArray_4H[], TimeArray_1H[], TimeArray_30M[], TimeArray_15M[];
//----
if (firstTime || NewBar())
{
firstTime = false;
int win = WindowFind(shortname);
double dif = Time[0] - Time[1];
for (int ii=ObjectsTotal()-1; ii>-1; ii--)
{
if (StringFind(ObjectName(ii),"ST_"+win+"_") >= 0)
ObjectDelete(ObjectName(ii));
else
ii=-1;
}
double shift = 0.2;
for (ii=0; ii<4; ii++)
{
string txt = "??";
double gp;
switch (ii)
{
case 0: txt = tf2txt(Period_1); gp = 1 + shift; break;
case 1: txt = tf2txt(Period_2); gp = 1 + Gap + shift; break;
case 2: txt = tf2txt(Period_3); gp = 1 + Gap*2 + shift; break;
case 3: txt = tf2txt(Period_4); gp = 1 + Gap*3 + shift; break;
}
string name = "ST_"+win+"_"+ii+"_"+txt;
ObjectCreate(name, OBJ_TEXT, WindowFind(shortname), iTime(NULL,0,0)+dif*3, gp);
ObjectSetText(name, txt,8,"Arial", Black);
}
}
ArrayCopySeries(TimeArray_4H,MODE_TIME,Symbol(),Period_1);
ArrayCopySeries(TimeArray_1H,MODE_TIME,Symbol(),Period_2);
ArrayCopySeries(TimeArray_30M,MODE_TIME,Symbol(),Period_3);
ArrayCopySeries(TimeArray_15M,MODE_TIME,Symbol(),Period_4);
for(i=0, y15m=0, y4h=0, y1h=0, y30m=0;i<limit;i++)
{
if (Time[i]<TimeArray_15M[y15m]) y15m++;
if (Time[i]<TimeArray_4H[y4h]) y4h++;
if (Time[i]<TimeArray_1H[y1h]) y1h++;
if (Time[i]<TimeArray_30M[y30m]) y30m++;
for (int tf = 0; tf < 4; tf++)
{
int prd;
switch (tf)
{
case 0: prd = Period_1; yy = y15m; break;
case 1: prd = Period_2; yy = y30m; break;
case 2: prd = Period_3; yy = y1h; break;
case 3: prd = Period_4; yy = y4h; break;
}
double dUp = iCustom(NULL, prd, "SuperTrend", false, 1, yy);
double dDn = iCustom(NULL, prd, "SuperTrend", false, 0, yy);
switch (tf)
{
case 0: if (dUp == EMPTY_VALUE) {buf1_down[i] = 1; buf1_up[i] = EMPTY_VALUE;} else {buf1_up[i] = 1; buf1_down[i] = EMPTY_VALUE;} break;
case 1: if (dUp == EMPTY_VALUE) {buf2_down[i] = 1; buf2_up[i] = EMPTY_VALUE;} else {buf2_up[i] = 1; buf2_down[i] = EMPTY_VALUE;} break;
case 2: if (dUp == EMPTY_VALUE) {buf3_down[i] = 1; buf3_up[i] = EMPTY_VALUE;} else {buf3_up[i] = 1; buf3_down[i] = EMPTY_VALUE;} break;
case 3: if (dUp == EMPTY_VALUE) {buf4_down[i] = 1; buf4_up[i] = EMPTY_VALUE;} else {buf4_up[i] = 1; buf4_down[i] = EMPTY_VALUE;} break;
}
}
}
return(0);
}
//+------------------------------------------------------------------+
string tf2txt(int tf)
{
if (tf == PERIOD_M1) return("M1");
if (tf == PERIOD_M5) return("M5");
if (tf == PERIOD_M15) return("M15");
if (tf == PERIOD_M30) return("M30");
if (tf == PERIOD_H1) return("H1");
if (tf == PERIOD_H4) return("H4");
if (tf == PERIOD_D1) return("D1");
if (tf == PERIOD_W1) return("W1");
if (tf == PERIOD_MN1) return("MN1");
return("??");
}
void SetValues(int p1, int p2, int p3, int p4)
{
Period_1 = p1; Period_2 = p2; Period_3 = p3; Period_4 = p4;
}
void SetAutoDisplay()
{
if (AutoDisplay)
{
switch (Period())
{
case PERIOD_M1 : SetValues(PERIOD_M1, PERIOD_M5, PERIOD_M15,PERIOD_M30); break;
case PERIOD_M5 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30,PERIOD_H1); break;
case PERIOD_M15 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30,PERIOD_H1); break;
case PERIOD_M30 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30, PERIOD_H1); break;
case PERIOD_H1 : SetValues(PERIOD_M15, PERIOD_M30,PERIOD_H1, PERIOD_H4); break;
case PERIOD_H4 : SetValues(PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1); break;
case PERIOD_D1 : SetValues(PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1); break;
case PERIOD_W1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1); break;
case PERIOD_MN1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1); break;
}
}
}
bool NewBar()
{
static datetime dt = 0;
if (Time[0] != dt)
{
dt = Time[0];
return(true);
}
return(false);
}
Comments