This script is a Multi-Timeframe (MTF) technical analysis tool designed to provide traders with a comprehensive view of market trends across different time scales simultaneously. Instead of looking at just one chart, it aggregates data from four different timeframes into a single visual window, allowing for a holistic understanding of market momentum.
Core Logic and Functionality
1. Dynamic Timeframe Scaling The script automatically detects which timeframe you are currently viewing (e.g., 1-minute, 5-minute, Hourly, Daily, etc.) and intelligently selects the four most relevant "higher" timeframes to display. For example, if you are viewing a 15-minute chart, it will automatically pull data from the 30-minute, 1-hour, and 4-hour charts to provide context.
2. Multi-Layered Trend Analysis The tool processes information from four distinct layers of time. Each layer represents a different level of market "depth." By calculating the movement at these different scales, it helps traders distinguish between short-term price fluctuations (noise) and long-term structural trends.
3. Visual Representation (Bars and Colors) The logic interprets the data into specific visual markers:
- Trend Identification: It looks for specific "trigger" signals from an underlying trend calculation.
- Directional Coding: If the market is trending upward at a specific timeframe, it displays a specific marker (Blue). If the market is trending downward, it shows a different marker (Red).
- Vertical Separation: To prevent the markers from overlapping and becoming cluttered, the script applies a "Gap" logic. This places the data for each of the four timeframes on separate horizontal levels in a dedicated window, making it easy to see if all timeframes are aligned in one direction or if they are conflicting.
4. Real-Time Data Synchronization The script includes a synchronization mechanism that ensures the markers align correctly with the current time. It maps the historical "open" and "close" values of the higher timeframes back onto your current chart so that the information is always relevant to the present moment.
Summary for the Trader
Essentially, this tool acts as a "Trend Dashboard." Instead of you having to open four different charts to see if the 1-hour trend matches the 4-hour trend, this script does that work for you. It places all four trends in one window; when all markers align in the same color, it suggests a strong, multi-timeframe trend is in effect. When they differ, it signals potential complexity or a shift in momentum.
//+------------------------------------------------------------------+
//|MTF NonLagMAv7.1_4TF_BarM based on MTF_MegaTrend_Bar_4TFNextM5 |
//| from STEINITZ lee_yan_cn mod N4TF HAS Bar.mq4 |
//| Modified by Matsu, from #MTF Supertrend Bar.mq4 |
//| Forex-TSD.com Copyright © 2006, Eli hayun |
//| M 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.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
//---- parameters
extern int pq =2;
extern int pr = 10;
extern int ps = 5;
extern int trigger =3;
//extern int Length = 9;
//extern int method = 3;
//extern int Price = 0;
//extern int MaMetod2 = 3;
//extern int MaPeriod2 = 2;
extern int BarWidth = 0;
extern color BarColorUp = RoyalBlue;
extern color BarColorDown = MediumVioletRed;
extern color TextColor = White;
extern int MaxBars=500;
double Gap = 1; // Gap between the lines of bars
//---- 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[];
//double haOpen;
//double haClose;
double haOpenN;
double haCloseN;
string shortname = "";
int ArrSize = 110;//110,159;
int UniqueNum = 2282;
int Period_1, Period_2, Period_3, Period_4;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
SetIndexStyle(0,DRAW_ARROW,0,BarWidth,BarColorUp);
SetIndexArrow(0,ArrSize);
SetIndexBuffer(0,buf1_up);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW,0,BarWidth,BarColorDown);
SetIndexArrow(1,ArrSize);
SetIndexBuffer(1,buf1_down);
SetIndexEmptyValue(1,0.0);
SetIndexStyle(2,DRAW_ARROW,0,BarWidth,BarColorUp);
SetIndexArrow(2,ArrSize);
SetIndexBuffer(2,buf2_up);
SetIndexEmptyValue(2,0.0);
SetIndexStyle(3,DRAW_ARROW,0,BarWidth,BarColorDown);
SetIndexArrow(3,ArrSize);
SetIndexBuffer(3,buf2_down);
SetIndexEmptyValue(3,0.0);
SetIndexStyle(4,DRAW_ARROW,0,BarWidth,BarColorUp);
SetIndexArrow(4,ArrSize);
SetIndexBuffer(4,buf3_up);
SetIndexEmptyValue(4,0.0);
SetIndexStyle(5,DRAW_ARROW,0,BarWidth,BarColorDown);
SetIndexArrow(5,ArrSize);
SetIndexBuffer(5,buf3_down);
SetIndexEmptyValue(5,0.0);
SetIndexStyle(6,DRAW_ARROW,0,BarWidth,BarColorUp);
SetIndexArrow(6,ArrSize);
SetIndexBuffer(6,buf4_up);
SetIndexEmptyValue(6,0.0);
SetIndexStyle(7,DRAW_ARROW,0,BarWidth,BarColorDown);
SetIndexArrow(7,ArrSize);
SetIndexBuffer(7,buf4_down);
SetIndexEmptyValue(7,0.0);
IndicatorDigits(0);
getPeriod();
// shortname = "MTF_SnErgCCI";
shortname = "MTF_SnErgCCI";
IndicatorShortName(shortname);
/*
SetIndexLabel(0,"NLMA("+Length+")"+Period_1+"");
SetIndexLabel(1,"NLMA("+Length+")"+Period_1+"");
SetIndexLabel(2,"NLMA("+Length+")"+Period_2+"");
SetIndexLabel(3,"NLMA("+Length+")"+Period_2+"");
SetIndexLabel(4,"NLMA("+Length+")"+Period_3+"");
SetIndexLabel(5,"NLMA("+Length+")"+Period_3+"");
SetIndexLabel(6,"NLMA("+Length+")"+Period_4+"");
SetIndexLabel(7,"NLMA("+Length+")"+Period_4+"");
*/
SetIndexLabel(0,"MTF_SnErgCCI("+Period_1+")");
SetIndexLabel(1,"MTF_SnErgCCI("+Period_1+")");
SetIndexLabel(2,"MTF_SnErgCCI("+Period_2+")");
SetIndexLabel(3,"MTF_SnErgCCI("+Period_2+")");
SetIndexLabel(4,"MTF_SnErgCCI("+Period_3+")");
SetIndexLabel(5,"MTF_SnErgCCI("+Period_3+")");
SetIndexLabel(6,"MTF_SnErgCCI("+Period_4+")");
SetIndexLabel(7,"MTF_SnErgCCI("+Period_4+"");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- the last counted bar will be recounted
if(counted_bars>0) counted_bars--;
int limit=Bars-counted_bars+Period_4/Period();
int i,tf;
//-------------------------------1----------------------------------------
double dif = Time[0] - Time[1];
for ( i=ObjectsTotal()-1; i>-1; i--)
{
if (StringFind(ObjectName(i),"FF_"+UniqueNum+"_") >= 0) ObjectDelete(ObjectName(i));
}
double shift = 0.2;
for ( tf=1; tf<=4; tf++)
{
string txt = "??";
double gp;
switch (tf)
{
case 1: txt = tf2txt(Period_1); gp = 1 + Gap*3 + shift; break;
case 2: txt = tf2txt(Period_2); gp = 1 + Gap*2 + shift; break;
case 3: txt = tf2txt(Period_3); gp = 1 + Gap + shift; break;
case 4: txt = tf2txt(Period_4); gp = 1.5 + shift; break;
}
string name = "FF_"+UniqueNum+"_"+tf+"_"+txt;
ObjectCreate(name, OBJ_TEXT, WindowFind(shortname), iTime(NULL,0,0)+dif*3, gp);
ObjectSetText(name, txt,8,"Arial", TextColor);
}
//-------------------------------2----------------------------------------
datetime TimeArray_1[], TimeArray_2[], TimeArray_3[], TimeArray_4[];
ArrayCopySeries(TimeArray_1,MODE_TIME,Symbol(),Period_1);
ArrayCopySeries(TimeArray_2,MODE_TIME,Symbol(),Period_2);
ArrayCopySeries(TimeArray_3,MODE_TIME,Symbol(),Period_3);
ArrayCopySeries(TimeArray_4,MODE_TIME,Symbol(),Period_4);
int i1=0, i2=0, i3=0, i4=0, yy;
// for(i=0, i1=0, i2=0, i3=0, i4=0;i<MaxBars;i++)
for(i=0, i1=0, i2=0, i3=0, i4=0;i<limit;i++)
{
if (Time[i]<TimeArray_1[i1]) i1++;
if (Time[i]<TimeArray_2[i2]) i2++;
if (Time[i]<TimeArray_3[i3]) i3++;
if (Time[i]<TimeArray_4[i4]) i4++;
for ( tf = 1; tf <= 4; tf++)
{
int prd;
switch (tf)
{
case 1: prd = Period_1; yy = i1; break;
case 2: prd = Period_2; yy = i2; break;
case 3: prd = Period_3; yy = i3; break;
case 4: prd = Period_4; yy = i4; break;
}
haOpenN = iCustom(NULL,prd,"FXSnipersErgodic_CCITrigger",2,10,5,3,1,yy) ;
haCloseN = iCustom(NULL,prd,"FXSnipersErgodic_CCITrigger",2,10,5,3,0,yy) ;
switch (tf)
{ case 4: buf4_down[i]=EMPTY_VALUE;buf4_up[i]=EMPTY_VALUE; if (haOpenN>=haCloseN) buf4_down[i] = 1; else buf4_up[i] = 1; break;
case 3: buf3_down[i]=EMPTY_VALUE;buf3_up[i]=EMPTY_VALUE; if (haOpenN>=haCloseN) buf3_down[i] = 1 + Gap * 1; else buf3_up[i] = 1 + Gap * 1; break;
case 2: buf2_down[i]=EMPTY_VALUE;buf2_up[i]=EMPTY_VALUE; if (haOpenN>=haCloseN) buf2_down[i] = 1 + Gap * 2; else buf2_up[i] = 1 + Gap * 2; break;
case 1: buf1_down[i]=EMPTY_VALUE;buf1_up[i]=EMPTY_VALUE; if (haOpenN>=haCloseN) buf1_down[i] = 1 + Gap * 3; else buf1_up[i] = 1 + Gap * 3; break;
}
}
}
return(0);
}
//+------------------------------------------------------------------+
void getPeriod()
{
switch(Period())
{
case 1:
Period_1=1; Period_2=5; Period_3=15; Period_4=30;
break;
case 5:
Period_1=5; Period_2=15; Period_3=30; Period_4=60;
break;
case 15:
Period_1=15; Period_2=30; Period_3=60; Period_4=240;
break;
case 30:
Period_1=30; Period_2=60; Period_3=240; Period_4=1440;
break;
case 60:
Period_1=60; Period_2=240; Period_3=1440; Period_4=10080;
break;
case 240:
Period_1=240; Period_2=1440; Period_3=10080; Period_4=43200;
break;
case 1440:
Period_1=1440; Period_2=10080; Period_3=43200; Period_4=43200;
break;
case 10080:
Period_1=10080; Period_2=43200; Period_3=43200; Period_4=43200;
break;
case 43200:
Period_1=43200; Period_2=43200; Period_3=43200; Period_4=43200;
break;
}
}
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("MN");
//---- Refresh buffers ++++++++++++++++++++ upgrade by Raff
int TimeFrame,TimeArray[],i;
if (TimeFrame>Period()) {
int PerINT=TimeFrame/Period()+1;
datetime TimeArr[]; ArrayResize(TimeArr,PerINT);
ArrayCopySeries(TimeArr,MODE_TIME,Symbol(),Period());
for(i=0;i<PerINT+1;i++) {if (TimeArr[i]>=TimeArray[0]) {
/********************************************************
Refresh buffers: buffer[i] = buffer[0];
********************************************************/
buf4_up[i]=buf4_up[0];
buf4_down[i]=buf4_down[0];
buf3_up[i]=buf3_up[0];
buf3_down[i]=buf3_down[0];
buf2_up[i]= buf2_up[0];
buf2_down[i]= buf2_down[0];
buf1_up[i]=buf1_up[0];
buf1_down[i]= buf1_down[0];
//----
} } }
//+++++++++++++++++++++++++++++++++++++++++++++++ Raff
//+-------------
return("??");
}
Comments