_MTF_Heiken Ashi Freedom Bar
Download scriptTechnical Overview: Forex Freedom Multi-Timeframe Indicator
This script is designed to provide traders with a synchronized view of market momentum across multiple timeframes simultaneously. Rather than forcing a trader to switch between different charts to see the "big picture," it consolidates four different periods into a single visual window.
Core Logic and Functionality
1. Multi-Timeframe Synchronization The script monitors four specific timeframes at once (for example: 5-minute, 15-minute, 30-minute, and 1-hour charts). It automatically calculates the data for these periods regardless of which chart you currently have open on your screen. This allows for a "top-down" analysis where you can see if shorter-term trends align with longer-term movements.
2. Heiken Ashi Integration The indicator utilizes "Heiken Ashi" price action logic as its primary engine. Heiken Ashi is a modified candlestick style that filters out market noise to show clearer trends. The script checks the direction of these candles across all four selected timeframes to determine the overall market sentiment.
3. Visual Representation The script creates a dedicated visual space (a separate window) on your platform. In this space, it displays indicators for each timeframe stacked vertically:
- Each timeframe is represented by an arrow-like symbol.
- The symbols are positioned at different heights based on a "Gap" setting, ensuring that the data from one timeframe does not overlap with another.
- The visual layout remains organized and easy to read, providing a snapshot of the trend for all four periods at a glance.
4. Automated Intelligence (AutoDisplay) To make the tool user-friendly, it includes an "AutoDisplay" feature. This logic detects which timeframe you are currently viewing on your main chart and automatically adjusts the four monitored timeframes to be relative to your view. For instance, if you move to a Daily chart, the script will automatically shift its focus to higher timeframes (like 1-hour, 4-hour, and Weekly) to maintain context.
5. Confluence Alerts (The "Freeway" Signal) The primary goal of this script is identifying "confluence"—when multiple timeframes agree on a single direction.
- Bullish Signal: If the price action on all four monitored timeframes shows an upward trend simultaneously, the script identifies this as a strong "Up" signal.
- Bearish Signal: Conversely, if all four timeframes show a downward trend, it identifies a "Down" signal.
- Notifications: When this rare alignment occurs (a "Forex Freeway"), the script triggers an audible alert sound and prints a notification in the platform's log to notify the trader immediately.
Summary for the User
This tool acts as a "trend filter." It removes the guesswork of trying to figure out if a small price move on a 5-minute chart is part of a larger trend or just a temporary flicker. By requiring all four timeframes to align before sounding an alert, it helps traders identify high-probability moments where the market momentum is strongest and most consistent.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| #MTF HA Freedom Bar.mq4 |
//| Copyright © 2006, Eli hayun |
//| Heiken Ashi conversion by Rupp |
//| http://www.elihayun.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Eli hayun"
#property link "http://www.elihayun.com"
#property indicator_separate_window
#property indicator_minimum -0.5
//#property indicator_maximum 5
#property indicator_buffers 8
#property indicator_color1 Red
#property indicator_color2 White
#property indicator_color3 Red
#property indicator_color4 White
#property indicator_color5 Red
#property indicator_color6 White
#property indicator_color7 Red
#property indicator_color8 White
//---- 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_M5;//M15
extern int Period_2 = PERIOD_M15;//M30
extern int Period_3 = PERIOD_M30;//H1
extern int Period_4 = PERIOD_H1;//H4
//extern int cci_1 = 34;//50
//extern int cci_2 = 34;//14
//extern int cci_3 = 14;
//extern int cci_4 = 14;
extern bool AutoDisplay = false;
string shortname = "";
bool firstTime = true;
int UniqueNum = 228;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
SetAutoDisplay();
shortname = "# Forex Freedom("+Period_1+","+Period_2+","+Period_3+","+Period_4+")";
firstTime = true;
IndicatorShortName(shortname);
//---- indicators
SetIndexStyle(0,DRAW_ARROW,0,3);
SetIndexArrow(0,167);
SetIndexBuffer(0,buf4_up);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW,0,3);
SetIndexArrow(1,167);
SetIndexBuffer(1,buf4_down);
SetIndexEmptyValue(1,0.0);
SetIndexStyle(2,DRAW_ARROW,0,3);
SetIndexArrow(2,167);
SetIndexBuffer(2,buf3_up);
SetIndexEmptyValue(2,0.0);
SetIndexStyle(3,DRAW_ARROW,0,3);
SetIndexArrow(3,167);
SetIndexBuffer(3,buf3_down);
SetIndexEmptyValue(3,0.0);
SetIndexStyle(4,DRAW_ARROW,0,3);
SetIndexArrow(4,167);
SetIndexBuffer(4,buf2_up);
SetIndexEmptyValue(4,0.0);
SetIndexStyle(5,DRAW_ARROW,0,3);
SetIndexArrow(5,167);
SetIndexBuffer(5,buf2_down);
SetIndexEmptyValue(5,0.0);
SetIndexStyle(6,DRAW_ARROW,0,3);
SetIndexArrow(6,167);
SetIndexBuffer(6,buf1_up);
SetIndexEmptyValue(6,0.0);
SetIndexStyle(7,DRAW_ARROW,0,3);
SetIndexArrow(7,167);
SetIndexBuffer(7,buf1_down);
SetIndexEmptyValue(7,0.0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
SetAutoDisplay();
shortname = "# HA 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, y5m=0, y1h=0, y30m=0, y15m=0, yy;
int limit=Bars-counted_bars;
datetime TimeArray_1H[], TimeArray_30M[], TimeArray_15M[], TimeArray_5M[];
//----
if (firstTime || NewBar())
{
firstTime = false;
int win = UniqueNum; // WindowFind(shortname);
double dif = Time[0] - Time[1];
for (int ii=ObjectsTotal()-1; ii>-1; ii--)
{
if (StringFind(ObjectName(ii),"FF_"+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 = "FF_"+win+"_"+ii+"_"+txt;
ObjectCreate(name, OBJ_TEXT, WindowFind(shortname), iTime(NULL,0,0)+dif*3, gp);
ObjectSetText(name, txt,8,"Arial", Silver);
}
}
ArrayCopySeries(TimeArray_1H,MODE_TIME,Symbol(),Period_4);
ArrayCopySeries(TimeArray_30M,MODE_TIME,Symbol(),Period_3);
ArrayCopySeries(TimeArray_15M,MODE_TIME,Symbol(),Period_2);
ArrayCopySeries(TimeArray_5M,MODE_TIME,Symbol(),Period_1);
for(i=0, y5m=0, y1h=0, y30m=0, y15m=0;i<limit;i++)
{
if (Time[i]<TimeArray_5M[y5m]) y5m++;
if (Time[i]<TimeArray_1H[y1h]) y1h++;
if (Time[i]<TimeArray_30M[y30m]) y30m++;
if (Time[i]<TimeArray_15M[y15m]) y15m++;
// int cci_n = cci_1;
for (int tf = 0; tf < 4; tf++)
{
int prd;
switch (tf)
{
case 0: prd = Period_1; yy = y5m; break;
case 1: prd = Period_2; yy = y15m; break;
case 2: prd = Period_3; yy = y30m; break;
case 3: prd = Period_4; yy = y1h; break;
}
double HA = iCustom(NULL,prd,"Heiken Ashi-Overlay",0,yy) ;
double dUp = EMPTY_VALUE; // iCustom(NULL, prd, "SuperTrend", false, 1, yy);
double dDn = EMPTY_VALUE; //iCustom(NULL, prd, "SuperTrend", false, 0, yy);
if (HA == 1) dUp = 1; else dDn = 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;
}
if (NewBar())
{
string sDir = "";
if (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)
sDir = "Up";
if (buf1_down[0] + buf2_down[0] + buf3_down[0] + buf4_down[0] == 4)
sDir = "Down";
if (sDir != "")
{
PlaySound("alert1.wav");
Print("Forex freeway - Direction ",sDir);
}
}
}
}
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