This script functions as a multi-timeframe analysis tool designed to help traders visualize market trends across four different time horizons simultaneously on a single chart. Instead of requiring the user to switch back and forth between various timeframes (like moving from a 15-minute chart to a 4-hour chart), it pulls relevant data from multiple periods into one visual display.
Core Logic and Functionality
Multi-Timeframe Coordination The script automatically identifies which timeframes are most relevant based on the chart you are currently viewing. For example, if you are looking at a 1-hour chart, it intelligently selects specific higher and lower intervals (such as 15 minutes, 30 minutes, 4 hours, etc.) to display alongside it. This provides a "bird's eye view" of the market's momentum.
Trend Detection via Hull HAMA The script utilizes a specialized calculation method (based on the Hull Moving Average and HAMA) to determine the current trend. It specifically looks at "Open" and "Close" price relationships across those different timeframes:
- If the data indicates a bullish sentiment, it marks a specific visual signal.
- If the data indicates a bearish sentiment, it marks a different signal.
Visual Representation The results are displayed as a series of colored markers (arrows/bars) rather than standard lines. The script organizes these signals into four distinct levels:
- Each level corresponds to a different timeframe.
- The levels are separated by a "Gap," ensuring the visual display remains clean and easy to read without overlapping.
- The colors typically differentiate between upward (bullish) and downward (bearish) movements, allowing for immediate identification of trend agreement or disagreement across various periods.
Dynamic Updates The script is designed to refresh its calculations automatically with every new price bar. It handles the "history" of the chart efficiently, ensuring that as new candles form, the visual markers update to reflect the most recent trend data from all synchronized timeframes.
Summary for the User
Essentially, this tool acts as a trend aggregator. It scans four different timeframes at once, checks if those timeframes are currently trending up or down using a smoothed moving average calculation, and then paints dots/bars on your current chart to show you that status. This helps traders see if the "big picture" trend aligns with the "small picture" price action.
//+------------------------------------------------------------------+
//| lee_yan_cn N4 4TF HASBar.mq4|
//| Modified by Matsu, #MTF SupertrendBar.mq4|
//| Copyright © 2006, Eli hayun|
//| http://www.elihayun.com|
//+------------------------------------------------------------------+
//| Hull_O_H_L_C.mq4 |
//|Hull_HAMAm_4TF_Bar Copyright © 2007, None |
//| (TFswch autodisplay) Planet.Earth.Redistribution |
//+------------------------------------------------------------------+
//mod 2008 fxtsd ki
#property copyright "Copyright © 2006, Eli hayun"
#property link "http://www.elihayun.com"
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 6.5
#property indicator_buffers 8
#property indicator_color1 Black
#property indicator_color2 Black
#property indicator_color3 Black
#property indicator_color4 Black
#property indicator_color5 Black
#property indicator_color6 Black
#property indicator_color7 Red
#property indicator_color8 DodgerBlue
//---- parameters
extern int MaMethod =3; //0-3
extern int MaPeriod =14;
extern int DrawType =2; //0-2
extern int OpCl_Width= 2;
extern int ShowBars =1200;
extern string notes_ = "Hull_HAMA param: MaMethod: SMA0 EMA1 SMMA2 LWMA3; DrawType: 0line 1section 2Histo";
//--- Bar param
extern int BarWidth = 0;
extern color BarColorUp = C'0,103,206';//DodgerBlue;
extern color BarColorDown = Red;
extern color TextColor = Black;
extern int MaxBars=500;
double Gap = 1; // Gap between the lines of bars
//---- buffers
double buf1_up[];
double buf1_down[];
double buf2_up[];
double buf2_down[];
double buf3_up[];
double buf3_down[];
double buf4_up[];
double buf4_down[];
double haOpen;
double haClose;
/*
//extern int Period_1 = 15;
//extern int Period_2 = 30;
extern int Period_3 = 60;
//extern int Period_4 = 240;
extern bool AutoDisplay = false;
*/
string shortname = "";
bool firstTime = true;
int ArrSize = 110;//159;
//extern int UniqueNum = 2284;
string UniqueNum;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//SetAutoDisplay();
firstTime = true;
//IndicatorShortName(shortname);
//---- indicators
SetIndexStyle(0,DRAW_ARROW,0,BarWidth,BarColorDown);
SetIndexArrow(0,ArrSize);
SetIndexBuffer(0,buf4_up);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW,0,BarWidth,BarColorUp);
SetIndexArrow(1,ArrSize);
SetIndexBuffer(1,buf4_down);
SetIndexEmptyValue(1,0.0);
SetIndexStyle(2,DRAW_ARROW,0,BarWidth,BarColorDown);
SetIndexArrow(2,ArrSize);
SetIndexBuffer(2,buf3_up);
SetIndexEmptyValue(2,0.0);
SetIndexStyle(3,DRAW_ARROW,0,BarWidth,BarColorUp);
SetIndexArrow(3,ArrSize);
SetIndexBuffer(3,buf3_down);
SetIndexEmptyValue(3,0.0);
SetIndexStyle(4,DRAW_ARROW,0,BarWidth,BarColorDown);
SetIndexArrow(4,ArrSize);
SetIndexBuffer(4,buf2_up);
SetIndexEmptyValue(4,0.0);
SetIndexStyle(5,DRAW_ARROW,0,BarWidth,BarColorUp);
SetIndexArrow(5,ArrSize);
SetIndexBuffer(5,buf2_down);
SetIndexEmptyValue(5,0.0);
SetIndexStyle(6,DRAW_ARROW,0,BarWidth,BarColorDown);
SetIndexArrow(6,ArrSize);
SetIndexBuffer(6,buf1_up);
SetIndexEmptyValue(6,0.0);
SetIndexStyle(7,DRAW_ARROW,0,BarWidth,BarColorUp);
SetIndexArrow(7,ArrSize);
SetIndexBuffer(7,buf1_down);
SetIndexEmptyValue(7,0.0);
///**/
SetIndexLabel(0,NULL);
SetIndexLabel(1,NULL);
SetIndexLabel(2,NULL);
SetIndexLabel(3,NULL);
SetIndexLabel(4,NULL);
SetIndexLabel(5,NULL);
SetIndexLabel(6,NULL);
SetIndexLabel(7,NULL);
IndicatorDigits(0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//SetAutoDisplay();
UniqueNum = ""+ MaMethod+", "+ MaPeriod+"";
for (int ii=ObjectsTotal()-1; ii>-1; ii--)
{
if (StringFind(ObjectName(ii),"FFbar_"+UniqueNum+"_") >= 0)
ObjectDelete(ObjectName(ii));
// else
// ii=-1;
}
// shortname = "# Forex Freedom("+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,y30m=0,y1h=0,y4h=0, yy;
int Period_1, Period_2, Period_3, Period_4;
int limit=Bars-counted_bars;
limit=MathMax(limit,Period_1/Period());
limit=MathMax(limit,Period_2/Period());
limit=MathMax(limit,Period_3/Period());
limit=MathMax(limit,Period_4/Period());
limit=MathMin(limit,MaxBars);
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;
}
shortname = "Hull_HAMA_Bar ("+MaMethod+", "+MaPeriod+") ["+Period_1+","+Period_2+","+Period_3+","+Period_4+"]";
IndicatorShortName(shortname);
datetime TimeArray_4H[], TimeArray_1H[], TimeArray_30M[], TimeArray_15M[];
//----
if (firstTime || NewBar())
{
firstTime = false;
// int win = UniqueNum; // WindowFind(shortname);
UniqueNum = ""+ MaMethod+", "+ MaPeriod+"";
double dif = Time[0] - Time[1];
for (int ii=ObjectsTotal()-1; ii>-1; ii--)
{
if (StringFind(ObjectName(ii),"FFbar_"+UniqueNum+"_") >= 0)
ObjectDelete(ObjectName(ii));
else
ii=-1;
}
double shift = 0.5;
for ( ii=0; ii<4; ii++)
{
string txt = "??";
double gp;
switch (ii)
{
case 0: txt = tf2txt(Period_4); gp = 1 + shift;
break;
case 1: txt = tf2txt(Period_3); gp = 1 + Gap + shift;
break;
case 2: txt = tf2txt(Period_2); gp = 1 + Gap*2 + shift;
break;
case 3: txt = tf2txt(Period_1); gp = 1 + Gap*3 + shift;
break;
}
string name = "FFbar_"+UniqueNum+"_"+ii+"_"+txt;
ObjectCreate(name, OBJ_TEXT, WindowFind(shortname), iTime(NULL,0,0)+dif*8, gp);
ObjectSetText(name, txt,6,"Arial", TextColor);
}
}
ArrayCopySeries(TimeArray_15M,MODE_TIME,Symbol(),Period_1);
ArrayCopySeries(TimeArray_30M,MODE_TIME,Symbol(),Period_2);
ArrayCopySeries(TimeArray_1H,MODE_TIME,Symbol(),Period_3);
ArrayCopySeries(TimeArray_4H,MODE_TIME,Symbol(),Period_4);
for(i=0, y15m=0, y4h=0, y1h=0, y30m=0;i<limit;i++)
// for(i=0, y15m=0, y4h=0, y1h=0, y30m=0;i<MaxBars;i++)
{
if (Time[i]<TimeArray_15M [y15m]) y15m++;
if (Time[i]<TimeArray_30M [y30m]) y30m++;
if (Time[i]<TimeArray_1H [y1h]) y1h++;
if (Time[i]<TimeArray_4H [y4h]) y4h++;
for (int tf = 0; tf < 4; tf++)
{
int prd;
switch (tf)
{
case 3: prd = Period_1; yy = y15m; break;
case 2: prd = Period_2; yy = y30m; break;
case 1: prd = Period_3; yy = y1h; break;
case 0: prd = Period_4; yy = y4h; break;
}
haOpen = iCustom(NULL,prd,"Hull_HAMA_m",MaMethod,MaPeriod,2,2,ShowBars,2,yy) ;
haClose = iCustom(NULL,prd,"Hull_HAMA_m",MaMethod,MaPeriod,2,2,ShowBars,3,yy) ;
double dUp = EMPTY_VALUE; // iCustom(NULL, prd, "SuperTrend", false, 1, yy);
double dDn = EMPTY_VALUE; //iCustom(NULL, prd, "SuperTrend", false, 0, yy);
if (haOpen<haClose) dDn = 1; else dUp = 1;
switch (tf)
{
case 0: if (dUp == EMPTY_VALUE) buf1_down[i] = 1;
else buf1_up[i] = 1; break;
case 1: if (dUp == EMPTY_VALUE) buf2_down[i] = 1 + Gap *
1; else buf2_up[i] = 1 + Gap * 1; break;
case 2: if (dUp == EMPTY_VALUE) buf3_down[i] = 1 + Gap *
2; else buf3_up[i] = 1 + Gap * 2; break;
case 3: if (dUp == EMPTY_VALUE) buf4_down[i] = 1 + Gap *
3; else buf4_up[i] = 1 + Gap * 3; 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("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("??");
}
/*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