Author: Copyright � 2006, Eli hayun
#MTF SR

This script is a Multi-Timeframe (MTF) analysis tool designed to project significant historical price levels onto a single trading chart. By analyzing multiple time horizons simultaneously, it helps traders identify key support and resistance zones that might otherwise be hidden when looking at only one timeframe.

Core Functionality

The primary purpose of this indicator is to "bridge the gap" between different trading speeds. For example, while you may be trading on a fast 1-minute chart, there are much larger price movements occurring on 30-minute, 1-hour, 4-hour, and daily charts. This script automatically detects those major price extremes and displays them as visual markers (arrows) on your current screen.

How the Logic Works

The indicator operates through a three-step process:

1. Multi-Timeframe Synchronization The script looks at four specific timeframes simultaneously (which can be configured by the user). It captures the chronological data for each of these periods and aligns them with your current chart. This ensures that even if you are zoomed into a very small timeframe, the script knows exactly where the price peaks and valleys were on the larger scales.

2. Fractal Detection The logic utilizes a "Fractal" calculation method. In trading terms, a fractal is a high or low point that stands out relative to the candles immediately surrounding it. The script scans each of the four timeframes to find:

  • High Fractals: Significant price peaks (Resistance).
  • Low Fractals: Significant price valleys (Support).

3. Persistent Level Projection Because market data can be "noisy," a raw fractal might only appear for a moment. This script uses a "carry-forward" logic. Once a significant peak or valley is identified on a higher timeframe (like the 4-hour chart), the script remembers that specific price level and projects it forward across your current chart until a new, more recent peak or valley is formed.

Visual Elements

  • Dynamic Markers: The script places distinct arrows on your chart to represent these key levels. These are color-coded (Red and Blue) to differentiate between "Highs" and "Lows."
  • Customizable Visibility: You have the ability to toggle the display of specific timeframes on or off. This allows you to declutter your screen, showing only the higher timeframes that are most relevant to your specific trading strategy.
  • Labeling: Each set of levels is automatically labeled (e.g., "M1," "M5," etc.) so you can immediately identify which timeframe each price level belongs to.

Summary for the Trader

Instead of switching back and forth between different tabs to see where the "big players" are providing support or resistance, this script brings that information to you. It provides a visual map of major historical price boundaries across four different timeframes, plotted directly on your active chart to help with more informed entry and exit decisions.

Indicators Used
Fractals
Miscellaneous
Implements a curve of type %1
8 Views
0 Downloads
0 Favorites
#MTF SR
//+------------------------------------------------------------------+
//|                                                      #MTF SR.mq4 |
//|                                      Copyright © 2006, Eli hayun |
//|                                          http://www.elihayun.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Eli hayun"
#property link      "http://www.elihayun.com"

#property indicator_chart_window
#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
//---- buffers
double buf_up1D[];
double buf_down1D[];

double buf_up4H[];
double buf_down4H[];

double buf_up1H[];
double buf_down1H[];

double buf_up30M[];
double buf_down30M[];

extern int Period_1 = PERIOD_M1;
extern int Period_2 = PERIOD_M5;
extern int Period_3 = PERIOD_M15;
extern int Period_4 = PERIOD_M30;


extern bool display_Period_1 = true;
extern bool display_Period_2 = true;
extern bool display_Period_3 = true;
extern bool display_Period_4 = true;

extern bool Play_Sound = true;

int UniqueNum = 2284;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators

   
   int draw = DRAW_LINE; if (!display_Period_4) draw = DRAW_NONE;
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,169);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,169);
   
   SetIndexBuffer(0,buf_up1D);
   SetIndexBuffer(1,buf_up1D);
   SetIndexBuffer(1,buf_down1D);
   SetIndexLabel(0, tf2txt(Period_4)); SetIndexLabel(1, tf2txt(Period_4));
   
   draw = DRAW_LINE; if (!display_Period_3) draw = DRAW_NONE;
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,170);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,170);

   SetIndexBuffer(2,buf_up4H);
   SetIndexBuffer(3,buf_down4H);
   SetIndexLabel(2, tf2txt(Period_3)); SetIndexLabel(3, tf2txt(Period_3));


   draw = DRAW_LINE; if (!display_Period_2) draw = DRAW_NONE;
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexArrow(4,171);
   SetIndexStyle(5,DRAW_ARROW);
   SetIndexArrow(5,171);

   SetIndexBuffer(4,buf_up1H);
   SetIndexBuffer(5,buf_down1H);
   SetIndexLabel(4, tf2txt(Period_2)); SetIndexLabel(5, tf2txt(Period_2));

   draw = DRAW_LINE; if (!display_Period_1) draw = DRAW_NONE;
   SetIndexStyle(6,DRAW_ARROW);
   SetIndexArrow(6,172);
   SetIndexStyle(7,DRAW_ARROW);
   SetIndexArrow(7,172);

   SetIndexBuffer(6,buf_up30M);
   SetIndexBuffer(7,buf_down30M);
   SetIndexLabel(6, tf2txt(Period_1)); SetIndexLabel(7, tf2txt(Period_1));
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int i=0, y1d=0, y4h=0, y1h=0, y30m=0;
   int limit=Bars-counted_bars;

   double pd_1=0, pd_2=0, pd_3=0, pd_4=0;
   double pu_1=0, pu_2=0, pu_3=0, pu_4=0;
   
   datetime TimeArray_1D[] ,TimeArray_4H[], TimeArray_1H[], TimeArray_30M[];
//----
   ArrayCopySeries(TimeArray_1D,MODE_TIME,Symbol(),Period_4); 
   ArrayCopySeries(TimeArray_4H,MODE_TIME,Symbol(),Period_3); 
   ArrayCopySeries(TimeArray_1H,MODE_TIME,Symbol(),Period_2); 
   ArrayCopySeries(TimeArray_30M,MODE_TIME,Symbol(),Period_1);
      
   for(i=0, y1d=0,  y4h=0,  y1h=0,  y30m=0;i<limit;i++)
   {
      if (Time[i]<TimeArray_1D[y1d]) y1d++;
      if (Time[i]<TimeArray_4H[y4h]) y4h++;
      if (Time[i]<TimeArray_1H[y1h]) y1h++;
      if (Time[i]<TimeArray_30M[y30m]) y30m++;
      
      double fh = iFractals( NULL, Period_4, MODE_HIGH, y1d);
            
      buf_up1D[i] = fh; 
      buf_down1D[i] = iFractals( NULL, Period_4, MODE_LOW, y1d);
      
      buf_up4H[i] = iFractals( NULL, Period_3, MODE_HIGH, y4h); 
      buf_down4H[i] = iFractals( NULL, Period_3, MODE_LOW, y4h);

      
      buf_up1H[i] = iFractals( NULL, Period_2, MODE_HIGH, y1h);
      buf_down1H[i] = iFractals( NULL, Period_2, MODE_LOW, y1h);
      
      
      buf_up30M[i] = iFractals( NULL, Period_1, MODE_HIGH, y30m);
      buf_down30M[i] = iFractals( NULL, Period_1, MODE_LOW, y30m);

   }
   
   for (i=limit; i>=0; i--)
   {
      if (   buf_up1D[i] == 0 )   buf_up1D[i] = pu_1; else  pu_1 = buf_up1D[i];
      if (   buf_down1D[i] == 0 ) buf_down1D[i] = pd_1; else  pd_1 = buf_down1D[i];

      if (   buf_up4H[i] == 0 )   buf_up4H[i] = pu_2; else  pu_2 = buf_up4H[i];
      if (   buf_down4H[i] == 0 ) buf_down4H[i] = pd_2; else  pd_2 = buf_down4H[i];

      if (   buf_up1H[i] == 0 )   buf_up1H[i] = pu_3; else  pu_3 = buf_up1H[i];
      if (   buf_down1H[i] == 0 ) buf_down1H[i] = pd_3; else  pd_3 = buf_down1H[i];

      if (   buf_up30M[i] == 0 )   buf_up30M[i] = pu_4; else  pu_4 = buf_up30M[i];
      if (   buf_down30M[i] == 0 ) buf_down30M[i] = pd_4; else  pd_4 = buf_down30M[i];
   }

//----
   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("??");
}

Comments