Author: Copyright � 2006, Eli hayun
#MTF SR_v1

This script is a Multi-Timeframe (MTF) analysis tool designed to help traders visualize key price levels across different time horizons simultaneously on a single chart. Instead of forcing you to switch back and forth between different tabs to see what is happening on larger trends, this tool brings that data directly to your current view.

Core Functionality

The primary logic of the script relies on identifying "Fractals"—which are specific structural points in price action where the market has reached a local high or low. The script automatically detects these points across four different timeframes at once:

  • 1-Minute (M1)
  • 5-Minute (M5)
  • 15-Minute (M15)
  • 30-Minute (M30)

How the Logic Works

  1. Time Synchronization: Because different timeframes (like 1-minute vs. 30-minute) have different numbers of bars, the script performs a background calculation to align the time data correctly. It ensures that a high or low price point identified on a 30-minute chart is mapped accurately onto your current chart's timeline.
  2. Data Extraction: The script "scans" the history for each of the four timeframes. It looks for the most recent significant peaks (highs) and valleys (lows).
  3. Gap Filling: A unique feature of this logic is how it handles data visibility. In technical analysis, fractals don't appear on every single bar; they only appear when a price peak or valley is confirmed. To ensure the chart remains readable and informative, the script uses "persistence logic." This means that once a significant high or low is identified on a higher timeframe, the script carries that value forward until a new, higher/lower point is formed.
  4. Visual Representation: The results are plotted as distinct markers (arrows) on your chart. These serve as visual cues for potential support and resistance levels.

Key Benefits for the User

  • Multi-Dimensional Awareness: You can see "the big picture" while trading the small details. For example, you can see where the 30-minute resistance lies while you are actively watching the 1-minute price movement.
  • Customizable Visibility: The script allows you to toggle specific timeframes on or off, letting you declutter your chart and only view the data that is relevant to your current trading strategy.
  • Automated Analysis: It removes the manual labor of identifying structural highs and lows across multiple windows, providing a consistent set of levels to guide your entries and exits.
Indicators Used
Fractals
Miscellaneous
Implements a curve of type %1
10 Views
0 Downloads
0 Favorites
#MTF SR_v1
//+------------------------------------------------------------------+
//|                                                      #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