MTF_NonLagMAv7.1_4TF_Bar

Author: Copyright � 2006, Eli hayun
MTF_NonLagMAv7.1_4TF_Bar

This script is designed as a multi-timeframe visual analysis tool for MetaTrader. Its primary purpose is to provide a snapshot of market trends across four different time horizons simultaneously, allowing a trader to see the "big picture" without having to manually switch between various charts.

Core Logic and Functionality

1. Multi-Timeframe Synchronization The script automatically identifies which timeframe you are currently viewing (e.g., 5-minute, 1-hour, or Daily) and establishes a logical hierarchy of four higher timeframes relative to your current view. This ensures that the data presented is always relevant to the specific chart the user is analyzing.

2. Trend Detection via "Non-Lag" Analysis The logic relies on an external calculation called a "Non-Lag Moving Average." Instead of just looking at one price point, it compares two specific values (an "Open" and a "Close" equivalent) derived from this moving average.

  • If the calculated "Open" value is higher than the "Close" value, the script identifies a downward trend.
  • If the "Open" value is lower than the "Close" value, it identifies an upward trend.

3. Visual Representation Rather than drawing complex lines that might clutter the screen, the script uses distinct visual markers (arrows/bars) to represent these trends. To keep the data organized and readable:

  • Layering: Each of the four timeframes is assigned its own vertical "lane" or position in a separate window. This prevents the indicators from overlapping each other.
  • Color Coding: The script uses contrasting colors (typically Turquoise for upward trends and Violet for downward trends) to make it immediately obvious whether the trend is bullish or bearish across all four timeframes at a single glance.
  • Labeling: It automatically places text labels on the chart to identify which row corresponds to which timeframe (e.g., M15, H1, H4, etc.), ensuring the user always knows exactly what they are looking at.

4. Dynamic Data Refresh The script includes logic to ensure that as new price data arrives, the visual markers update accurately. It manages "buffer" memory to make sure that even if a bar hasn't closed yet, the trend information remains consistent and visually stable on your screen.

Summary for the User

Essentially, this tool acts like a "dashboard." Instead of you having to open four different charts to see if the 15-minute, 1-hour, 4-hour, and Daily trends are all moving in the same direction, this script summarizes all that information into one clean, organized window. It tells you instantly if the market is in harmony (all markers pointing the same way) or in conflict (some markers pointing up while others point down).

Miscellaneous
Implements a curve of type %1
11 Views
0 Downloads
0 Favorites
MTF_NonLagMAv7.1_4TF_Bar
//+------------------------------------------------------------------+
//|MTF NonLagMAv7.1_4TF_Bar  based on    MTF_MegaTrend_Bar_4TFNextM5 | 
//|                 from STEINITZ lee_yan_cn mod N4TF HAS Bar.mq4    |
//|                  Modified by Matsu, from #MTF Supertrend Bar.mq4 |
//| Forex-TSD.com                        Copyright © 2006, Eli hayun |
//|                                          http://www.elihayun.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Eli hayun"
#property link      "http://www.elihayun.com"

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 5
#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

//---- parameters
extern int Length = 9;
//extern int method  = 3;
extern int Price = 0;
//extern int MaMetod2  = 3;
//extern int MaPeriod2 = 2;
extern int BarWidth = 0;
extern color BarColorUp = DarkTurquoise;
extern color BarColorDown = DarkViolet;
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 haOpen;
//double haClose;
double haOpenN;
double haCloseN;


string shortname = "";


int ArrSize = 110;//159;
int UniqueNum = 2282;
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);
   
   SetIndexLabel(0,NULL);
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
   SetIndexLabel(3,NULL);
   SetIndexLabel(4,NULL);
   SetIndexLabel(5,NULL);
   SetIndexLabel(6,NULL);
   SetIndexLabel(7,NULL);
   
   IndicatorDigits(0);
   getPeriod();
   
   shortname = "NLMA_4TF("+Period_1+","+Period_2+","+Period_3+","+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--;
   int limit=Bars-counted_bars+Period_4/Period();
   int i,tf;

   //-------------------------------1----------------------------------------   
   double dif = Time[0] - Time[1];
   for ( i=ObjectsTotal()-1; i>-1; i--)
      {
         if (StringFind(ObjectName(i),"FF_"+UniqueNum+"_") >= 0)  ObjectDelete(ObjectName(i));
      }
      
   double shift = 0.2;
   for ( tf=1; tf<=4; tf++)
      {  
         string txt = "??";
         double gp;
         switch (tf)
         {
            case 1: txt = tf2txt(Period_1);  gp = 1 + shift; break;
            case 2: txt = tf2txt(Period_2);  gp = 1 + Gap + shift; break;
            case 3: txt = tf2txt(Period_3);  gp = 1 + Gap*2 + shift; break;
            case 4: txt = tf2txt(Period_4);  gp = 1 + Gap*3 + shift; break;
         }
         string name = "FF_"+UniqueNum+"_"+tf+"_"+txt;
         ObjectCreate(name, OBJ_TEXT, WindowFind(shortname), iTime(NULL,0,0)+dif*3, gp);
         ObjectSetText(name, txt,8,"Arial", 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;
         }
      
         haOpenN = iCustom(NULL,prd,"NonLagMA_v7.1",Price,Length,0,0,1,1,yy) ;
         haCloseN = iCustom(NULL,prd,"NonLagMA_v7.1",Price,Length, 0,0,1,2,yy) ;
            
         switch (tf)
         {  case 1: buf4_down[i]=EMPTY_VALUE;buf4_up[i]=EMPTY_VALUE;  if (haOpenN>=haCloseN)  buf4_down[i] = 1;           else buf4_up[i] = 1;           break;
            case 2: buf3_down[i]=EMPTY_VALUE;buf3_up[i]=EMPTY_VALUE; if (haOpenN>=haCloseN)  buf3_down[i] = 1 + Gap * 1; else buf3_up[i] = 1 + Gap * 1; break;
            case 3: buf2_down[i]=EMPTY_VALUE;buf2_up[i]=EMPTY_VALUE; if (haOpenN>=haCloseN)  buf2_down[i] = 1 + Gap * 2; else buf2_up[i] = 1 + Gap * 2; break;
            case 4: buf1_down[i]=EMPTY_VALUE;buf1_up[i]=EMPTY_VALUE; if (haOpenN>=haCloseN)  buf1_down[i] = 1 + Gap * 3; else buf1_up[i] = 1 + Gap * 3; break;
         }
      }
   }

   return(0);
  }
  
  
  
//+------------------------------------------------------------------+
void getPeriod()
{
   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");
  
  
  
  //
  //----  Refresh buffers ++++++++++++++++++++ upgrade by Raff  
   int TimeFrame,TimeArray[],i;
   if (TimeFrame>Period()) {
     int PerINT=TimeFrame/Period()+1;
     datetime TimeArr[]; ArrayResize(TimeArr,PerINT);
     ArrayCopySeries(TimeArr,MODE_TIME,Symbol(),Period()); 
     for(i=0;i<PerINT+1;i++) {if (TimeArr[i]>=TimeArray[0]) {
//----
 /********************************************************  
    Refresh buffers:         buffer[i] = buffer[0];
 ********************************************************/  

buf4_up[i]=buf4_up[0];
buf4_down[i]=buf4_down[0];
buf3_up[i]=buf3_up[0];
buf3_down[i]=buf3_down[0];
 buf2_up[i]= buf2_up[0];
 buf2_down[i]= buf2_down[0];
 buf1_up[i]=buf1_up[0];
 buf1_down[i]= buf1_down[0];

//----
   } } }
//+++++++++++++++++++++++++++++++++++++++++++++++ Raff  
 
  
//+-------------
  
  
  
   
   return("??");
}


Comments