MFCS 4TF MACD SLOPE #2
Download scriptThe MFCS 4TF MACD Slope script is a multi-timeframe analysis tool designed to provide traders with a visual representation of momentum across four different time horizons simultaneously. Instead of looking at a single price point, it helps you understand the "flow" of the market by comparing short-term trends against longer-term trends on one screen.
Core Logic and Functionality
Multi-Timeframe Synchronization The script automatically identifies your current chart's timeframe and selects four corresponding timeframes to monitor. It offers two distinct "modes":
- Standard Mode: Used for lower timeframes (like 1-minute or 5-minute charts), it selects smaller increments to track rapid price movements.
- Higher Timeframe Mode: Used for larger charts (like Hourly or Daily), it scales the analysis to capture much broader market trends.
MACD Slope Analysis The tool specifically calculates the "Slope" of the MACD (Moving Average Convergence Divergence) indicator. Rather than just showing you a line, it looks at whether the MACD value is increasing or decreasing compared to its previous position.
- If the MACD is moving upward, it indicates bullish momentum.
- If the MACD is moving downward, it indicates bearish momentum.
Visual Representation The script translates this data into a vertical stack of visual markers (arrows/bars) in a separate window:
- Color Coding: It uses distinct colors to differentiate between upward and downward momentum (typically Blue for up and Red for down).
- Layered View: The four different timeframes are stacked vertically. This allows you to see at a glance if all timeframes are aligned (e.g., all arrows pointing the same way) or if there is a "divergence" (where short-term trends conflict with long-term trends).
- Dynamic Labeling: The tool automatically labels each layer so you know exactly which timeframe (such as M1, H4, D1, etc.) each row represents.
Summary for the User
Essentially, this script acts as a "momentum dashboard." It simplifies complex multi-timeframe analysis by condensing four different charts into one visual list. By observing whether the colored markers are all pointing in the same direction, you can quickly determine if the market is in a strong trend across various scales or if the market is currently experiencing internal conflict between short-term volatility and long-term direction.
//+------------------------------------------------------------------+
//| MFCS 4TF MACD SLOPE.mq4 |
//| Copyright © 2009, MFCS |
//| http://www.mpatidar.com/mfcs |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MFCS"
#property link "http://www.mpatidar.com/mfcs"
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 5
#property indicator_buffers 8
/*
#property indicator_color1 OrangeRed
#property indicator_color2 DodgerBlue
#property indicator_color3 OrangeRed
#property indicator_color4 DodgerBlue
#property indicator_color5 OrangeRed
#property indicator_color6 DodgerBlue
#property indicator_color7 OrangeRed
#property indicator_color8 DodgerBlue
*/
//---- parameters
extern int price = PRICE_CLOSE;
extern int MaFastPeriod = 12;
extern int MaSlowPeriod = 26;
/*
Mode 0: Default, lower timeframes
Mode 1: Higher TimeFrames
*/
extern int mode = 0;
extern int BarWidth = 0;
extern color BarColorUp = DodgerBlue;
extern color BarColorDown = OrangeRed;
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 macd0;
double macd1;
string shortname = "";
int ArrSize = 110;//159;
int UniqueNum = 20565;
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);
if(mode == 0)
{
SetIndexLabel(0, "T1");
SetIndexLabel(1,"T1");
SetIndexLabel(2,"T2");
SetIndexLabel(3,"T2");
SetIndexLabel(4,"T3");
SetIndexLabel(5,"T3");
SetIndexLabel(6,"T4");
SetIndexLabel(7,"T4");
}
else
{
SetIndexLabel(0, "T5");
SetIndexLabel(1,"T5");
SetIndexLabel(2,"T6");
SetIndexLabel(3,"T6");
SetIndexLabel(4,"T7");
SetIndexLabel(5,"T7");
SetIndexLabel(6,"T8");
SetIndexLabel(7,"T8");
}
IndicatorDigits(0);
getPeriod();
shortname = "MFCS 4TF/8TF-MACD Slope ("+ tf2txt(Period_1)+", "+tf2txt(Period_2)+", "+tf2txt(Period_3)+", "+tf2txt(Period_4)+")";
IndicatorShortName(shortname);
//----
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 -= Period_4 / Period();
counted_bars--;
}
int limit=Bars-counted_bars;
int i,tf;
//-------------------------------1----------------------------------------
double dif = Time[0] - Time[1];
for ( i=ObjectsTotal()-1; i>-1; i--)
{
if (StringFind(ObjectName(i),"FF2_"+UniqueNum + "_" + mode +"_") >= 0) ObjectDelete(ObjectName(i));
}
for ( tf=1; tf<=4; tf++)
{
string txt = "??";
double gp;
switch (tf)
{
case 1: txt = tf2txt(Period_1); gp = 1 + mode * 4; break;
case 2: txt = tf2txt(Period_2); gp = 1 + Gap + mode * 4; break;
case 3: txt = tf2txt(Period_3); gp = 1 + Gap*2 + mode * 4; break;
case 4: txt = tf2txt(Period_4); gp = 1 + Gap*3 + mode * 4; break;
}
string name = "FF2_"+UniqueNum + "_" + mode +"_"+tf+"_"+txt;
ObjectCreate(name, OBJ_TEXT, WindowOnDropped(), iTime(NULL,0,0)+dif*3, gp + 0.7);
ObjectSetText(name, txt,8,"Verdana", TextColor);
}
//-------------------------------2----------------------------------------
datetime TimeArray_4[], TimeArray_3[], TimeArray_2[], TimeArray_1[];
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;
}
macd0 = iMACD(NULL, prd, MaFastPeriod, MaSlowPeriod, 9, price, MODE_MAIN, yy);
macd1 = iMACD(NULL, prd, MaFastPeriod, MaSlowPeriod, 9, price, MODE_MAIN, yy+1);
switch (tf)
{ case 1: if (macd1>macd0) buf1_down[i] = 1 + mode * 4; else buf1_up[i] = 1 + mode * 4; break;
case 2: if (macd1>macd0) buf2_down[i] = 1 + mode * 4 + Gap * 1; else buf2_up[i] = 1 + mode * 4 + Gap * 1; break;
case 3: if (macd1>macd0) buf3_down[i] = 1 + mode * 4 + Gap * 2; else buf3_up[i] = 1 + mode * 4 + Gap * 2; break;
case 4: if (macd1>macd0) buf4_down[i] = 1 + mode * 4 + Gap * 3; else buf4_up[i] = 1 + mode * 4 + Gap * 3; break;
}
}
}
return(0);
}
//+------------------------------------------------------------------+
void getPeriod()
{
if(mode == 1)
{
switch(Period())
{
case 1:
Period_1=60; Period_2=240; Period_3=1440; Period_4=10080;
break;
case 5:
Period_1=240; Period_2=1440; Period_3=10080; Period_4=43200;
break;
case 15:
Period_1=1440; Period_2=10080; Period_3=43200; Period_4=43200;
break;
case 30:
Period_1=10080; Period_2=43200; Period_3=43200; Period_4=43200;
break;
case 60:
Period_1=43200; Period_2=43200; Period_3=43200; Period_4=43200;
break;
case 240:
Period_1=43200; Period_2=43200; Period_3=43200; Period_4=43200;
break;
case 1440:
Period_1=43200; Period_2=43200; Period_3=43200; Period_4=43200;
break;
case 10080:
Period_1=43200; 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;
}
}
else
{
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");
return("??");
}
/*bool NewBar()
{
static datetime dt = 0;
if (Time[0] != dt)
{
dt = Time[0];
return(true);
}
return(false);
}
*/
Comments