Author: Adapted by Lakshmi Inc.
4TF_ADX

Overview of The Forex Freedom Bars Logic

This script is a multi-timeframe analysis tool designed to help traders identify the prevailing market direction by synchronizing data from four different time periods simultaneously. Instead of looking at just one chart, it gathers "momentum" information from multiple scales to give you a clearer picture of where the price is headed.

How It Works

1. Multi-Timeframe Synchronization The core logic of this tool relies on analyzing four specific timeframes at once. Depending on which chart you are currently viewing, the script automatically selects the most relevant surrounding timeframes. For example, if you are looking at a 5-minute chart, it will pull data from the 5m, 15m, 30m, and 1-hour marks to provide a comprehensive view of the current market environment.

2. Momentum Tracking (ADX Analysis) The tool uses an indicator called ADX (Average Directional Index) to determine the strength and direction of the trend. Specifically, it looks at two components:

  • Positive Momentum: The upward push of the price.
  • Negative Momentum: The downward push of the price.

For each of the four timeframes, the script compares these two forces. If the upward force is stronger than the downward force, it registers a bullish signal; if the downward force is stronger, it registers a bearish signal.

3. Visual Representation The script displays this information in a separate window on your platform using color-coded arrows and text labels:

  • It creates distinct "bars" or levels for each of the four timeframes.
  • The vertical spacing between these levels is adjustable (via the "Gap" setting), ensuring the data remains organized and easy to read.
  • You can quickly see at a glance which timeframes are trending up and which are trending down based on the arrow positions.

4. Automated Alerts and Signals The script is designed to help you identify "confluence"—which is when multiple timeframes agree on the same direction.

  • Full Agreement: If all four timeframes simultaneously show a strong upward trend, or if all four show a strong downward trend, the script recognizes this as a high-confidence signal.
  • Notifications: When this perfect alignment occurs (all four levels matching), the tool will trigger an audible alert and print a notification on your screen indicating the direction of the move (e.g., "Up" or "Down").

Summary for the Trader

Essentially, this script acts as a "trend filter." Rather than guessing based on a single candle, it tells you if the "big picture" across multiple timeframes is moving in harmony. It simplifies complex market analysis by condensing four different charts into one clear visual display, alerting you only when all timeframes are aligned in the same direction.

Indicators Used
Movement directional index
Miscellaneous
Implements a curve of type %1It plays sound alerts
13 Views
1 Downloads
0 Favorites
4TF_ADX
//+------------------------------------------------------------------+
//|                                           #The Forex Freedom Bars
//|                                           
//+------------------------------------------------------------------+
#property copyright "Programmed by Eli hayun"
#property copyright "Adapted by Lakshmi Inc."
#property indicator_separate_window
#property indicator_minimum -0.5
//#property indicator_maximum 5
#property indicator_buffers 8
#property indicator_color1 Red
#property indicator_color2 DodgerBlue
#property indicator_color3 Red
#property indicator_color4 DodgerBlue
#property indicator_color5 Red
#property indicator_color6 DodgerBlue
#property indicator_color7 Red
#property indicator_color8 DodgerBlue
//---- 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 ADX_Period =14;
extern int BarsCount=300;
bool AutoDisplay      = false;

string shortname = "";
bool firstTime = true;

int UniqueNum = 228;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  
  
   SetAutoDisplay();
  
   shortname = "#4TF ADX("+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 = "# 4TF ADX ("+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=BarsCount;

   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++;
      
      
      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 PDI = iADX(Symbol(),prd, ADX_Period, PRICE_CLOSE, MODE_PLUSDI,yy);
         double MDI = iADX(Symbol(),prd, ADX_Period, PRICE_CLOSE, MODE_MINUSDI,yy);
                  
         switch (tf)
         {
            case 0: if (MDI<PDI)  buf1_down[i] = 1;           if (MDI>PDI) buf1_up[i] = 1; break;
            case 1: if (MDI<PDI)  buf2_down[i] = 1 + Gap * 1; if (MDI>PDI) buf2_up[i] = 1 + Gap * 1; break;
            case 2: if (MDI<PDI)  buf3_down[i]  = 1 + Gap * 2; if (MDI>PDI) buf3_up[i]  = 1 + Gap * 2; break;
            case 3: if (MDI<PDI)  buf4_down[i]  = 1  + Gap * 3; if (MDI>PDI) 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("RSI Signal - 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