BLines_Profi_v1

Download script
Author: Copyright � 2005, MetaQuotes Software Corp.
BLines_Profi_v1

This script is designed to provide traders with a sophisticated visual aid that identifies key structural price levels—specifically balance points, support zones, and resistance zones—by analyzing data across multiple timeframes simultaneously.

Core Functionality

The tool operates on the principle of "Lines of Balance." Instead of looking at just the current price action on your immediate chart, it synchronizes data from a higher timeframe (which you can customize) to determine where the market is finding equilibrium. It then projects these levels onto your current view to help identify where the "weight" of the market lies.

Key Components of the Logic

1. Multi-Timeframe Synchronization The script automatically calculates the relationship between your current chart timeframe and a larger, higher timeframe. This allows it to "see" the bigger picture without you having to manually switch windows. It ensures that the data being pulled is accurately aligned with the current price movement.

2. Balance Point Identification (Static & Dynamic) The logic identifies specific "Balance Points" based on high and low price extremes over a set range.

  • Static Levels: These represent fixed points of equilibrium derived from historical highs and lows within a specific timeframe window.
  • Dynamic Levels: These are more fluid, adjusting as the market moves to reflect current shifting momentum.

3. Support and Resistance Projection Using a Fibonacci-based calculation (defaulting to 61.8%), the script automatically projects support and resistance zones relative to the identified balance points. This helps traders visualize not just where the price is balanced, but the specific boundaries where it might encounter pushback or acceleration.

4. "Step" Averaging for Smoothing To prevent the indicator from reacting too wildly to minor price fluctuations ("noise"), the script employs a smoothing logic called "Steps." It takes a sample of data points over a user-defined range and calculates an average value. This produces a more stable, reliable line that reflects the broader trend rather than erratic short-term movements.

Visual Output

The indicator renders several distinct types of lines on your chart:

  • Balance Levels: Solid lines showing the central equilibrium of the market.
  • Support & Resistance: Dotted lines indicating potential reversal or breakout zones based on Fibonacci proportions.
  • Stepped Trends: Averages that provide a smoothed visualization of price movement, helping to filter out market "noise" and identify the underlying price structure.

Summary for the User

In essence, this tool acts as an automated "structural map." It looks at the higher timeframe data, calculates where the market is balanced, identifies the Fibonacci boundaries for that balance, and smooths those results into easy-to-read lines on your current chart. This allows you to see significant structural support and resistance levels that might otherwise be hidden by the noise of smaller price movements.

Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
13 Views
0 Downloads
0 Favorites
BLines_Profi_v1
//+------------------------------------------------------------------+
//|                                              BLines_Profi_v1.mq4 |
//|                                                          Profi_R |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "Profi_R"

#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Blue
#property indicator_color2 DodgerBlue
#property indicator_color3 Yellow
#property indicator_color4 Yellow
#property indicator_color5 Black
#property indicator_color6 White
#property indicator_color7 Black
#property indicator_color8 White
//---- input parameters
extern int       Range=5;
extern int       NextTF=240;
extern double    FiboLevel=0.618;
//---- buffers
double StBPoint[];
double DBPoint[];
double StBStep[];
double DBStep[];
double StSupport[];
double DSupport[];
double StResistance[];
double DResistance[];
//----
int d_b,Displacement;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);
   SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,2);
   SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,2);
   SetIndexStyle(4,DRAW_LINE,STYLE_DOT);
   SetIndexStyle(5,DRAW_LINE,STYLE_DOT);
   SetIndexStyle(6,DRAW_LINE,STYLE_DOT);
   SetIndexStyle(7,DRAW_LINE,STYLE_DOT);
   SetIndexBuffer(0,StBPoint);
   SetIndexBuffer(1,DBPoint);
   SetIndexBuffer(2,StBStep);
   SetIndexBuffer(3,DBStep);
   SetIndexBuffer(4,StSupport);
   SetIndexBuffer(5,DSupport);
   SetIndexBuffer(6,StResistance);
   SetIndexBuffer(7,DResistance);
   SetIndexLabel(0,"Ñòàòè÷åñêèé óðîâåíü áàëàíñà");
   SetIndexLabel(1,"Äèíàìè÷åñêèé óðîâåíü áàëàíñà");
   SetIndexLabel(2,"Ñòàòè÷åñêèå ñòóïåíè áàëàíñà");
   SetIndexLabel(3,"Äèíàìè÷åñêèå ñòóïåíè áàëàíñà");
   SetIndexLabel(4,"Ñòàòè÷åñêèé óðîâåíü ïîääåðæêè (Ôèáî "+FiboLevel*100+"%)");
   SetIndexLabel(5,"Äèíàìè÷åñêèé óðîâåíü ïîääåðæêè (Ôèáî "+FiboLevel*100+"%)");
   SetIndexLabel(6,"Ñòàòè÷åñêèé óðîâåíü ñîïðîòèâëåíèÿ (Ôèáî "+FiboLevel*100+"%)");
   SetIndexLabel(7,"Äèíàìè÷åñêèé óðîâåíü ñîïðîòèâëåíèÿ (Ôèáî "+FiboLevel*100+"%)");
   string short_name;
   short_name="Lines of balance ("+Range+","+NextTF+","+FiboLevel*100+")";
   IndicatorShortName(short_name);
   if( NextTF>Period() )
   {
      d_b=Range*NextTF/Period();
      if( NextTF<10080)
      {
         Displacement=NextTF/Period();
      }
      else
      {
         if( NextTF==10080 )
         {
            Displacement=7200/Period();
         }
         else
         {
            if( NextTF==43200 )
            {
               Displacement=31680/Period();
            }
         }
      }
   }
   else
   {
      return(-1);
   }
   SetIndexDrawBegin(0,d_b);
   SetIndexDrawBegin(1,d_b);
   SetIndexDrawBegin(2,d_b);
   SetIndexDrawBegin(3,d_b);
   SetIndexDrawBegin(4,d_b);
   SetIndexDrawBegin(5,d_b);
   SetIndexDrawBegin(6,d_b);
   SetIndexDrawBegin(7,d_b);
   SetIndexShift(0,Displacement);
   SetIndexShift(2,Displacement);
   SetIndexShift(4,Displacement);
   SetIndexShift(6,Displacement);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int cb,limit,sbb_index,sbb_Aux_i,sbe_Aux_i,i;
   int counted_bars=IndicatorCounted();
   datetime Corresp_bbbnTime;
   double StHigh,StLow,DHigh,DLow,SStBStep,SDBStep;
//---- 
   if( NextTF<=Period() )
   {
      Alert("Íåâåðíî óêàçàí ïàðàìåòð NextTF, îí äîëæåí áûòü áîëüøå òåêóùåãî ò-ô!");
      return(-1);
   }
   if( counted_bars<0 )
   {
      return(-1);
   }
   else
   {
      if( Bars-1-counted_bars>Bars-1-d_b )
      {
         limit=Bars-1-d_b;
      }
      else
      {
         if( Bars-1-counted_bars>=0 )
         {
            limit=Bars-1-counted_bars;
         }
         else
         {
            limit=0;
         }
      }
   }
   limit=Bars-1-counted_bars;
//---- 
   for(cb=limit;cb>=0;cb--)
   {
      Corresp_bbbnTime=NormTimeBarBegin(Time[cb],NextTF);
      sbb_index=n_iBarShift(Corresp_bbbnTime,Period());
      StHigh=High[Highest(NULL,0,MODE_HIGH,sbb_index-cb+1,cb)];
      StLow=Low[Lowest(NULL,0,MODE_LOW,sbb_index-cb+1,cb)];
      StBPoint[cb]=MathRound((Close[cb]+StHigh+StLow)/3/Point)*Point;
      StSupport[cb]=StBPoint[cb]-MathRound((StHigh-StLow)*FiboLevel/Point)*Point;
      StResistance[cb]=StBPoint[cb]+MathRound((StHigh-StLow)*FiboLevel/Point)*Point;
      if( cb<sbb_index )
      {
         for(i=cb+1;i<=sbb_index;i++)
         {
            StBPoint[i]=StBPoint[cb];
            StSupport[i]=StSupport[cb];
            StResistance[i]=StResistance[cb];
         }
      }
      DHigh=High[Highest(NULL,0,MODE_HIGH,Displacement,cb)];
      DLow=Low[Lowest(NULL,0,MODE_LOW,Displacement,cb)];
      DBPoint[cb]=MathRound((Close[cb]+DHigh+DLow)/3/Point)*Point;
      DSupport[cb]=DBPoint[cb]-MathRound((DHigh-DLow)*FiboLevel/Point)*Point;
      DResistance[cb]=DBPoint[cb]+MathRound((DHigh-DLow)*FiboLevel/Point)*Point;
      SStBStep=StBPoint[cb];
      sbe_Aux_i=sbb_index+1;
      for(i=1;i<Range;i++)
      {
         Corresp_bbbnTime=NormTimeBarBegin(Time[sbe_Aux_i],NextTF);
         sbb_Aux_i=n_iBarShift(Corresp_bbbnTime,Period());
         SStBStep+=StBPoint[sbb_Aux_i];
         sbe_Aux_i=sbb_Aux_i+1;
      }
      StBStep[cb]=MathRound(SStBStep/Range/Point)*Point;
      if( cb<sbb_index )
      {
         for(i=cb+1;i<=sbb_index;i++)
         {
            StBStep[i]=StBStep[cb];
         }
      }
      SDBStep=DBPoint[cb];
      datetime sbbt_dif,bbbt_aux_b,bbbt_aux_s,t_aux;
      int i_aux;
      sbbt_dif=NormTimeBarBegin(Time[cb],Period())-NormTimeBarBegin(Time[cb],NextTF);
      for(i=1;i<Range;i++)
      {
         bbbt_aux_b=NormTimeBarBegin(iTime(NULL,NextTF,n_iBarShift(Time[cb],NextTF)+i),NextTF);
         bbbt_aux_s=NormTimeBarBegin(Time[cb+i*Displacement],NextTF);
         if( bbbt_aux_b!=bbbt_aux_s )
         {
            t_aux=MathMax(bbbt_aux_b,bbbt_aux_s);
            i_aux=n_iBarShift(t_aux+sbbt_dif,Period());
         }
         else
         {
            i_aux=n_iBarShift(bbbt_aux_b+sbbt_dif,Period());
         }
         SDBStep+=DBPoint[i_aux];
      }
      DBStep[cb]=MathRound(SDBStep/Range/Point)*Point;      
   }
//----
   return(0);
  }

datetime NormTimeBarBegin(datetime intime, int TF)
  {
//---- 
   datetime outtime;
   if(TF!=10080)
   {
      outtime=MathFloor(intime/TF/60)*TF*60;
   }
   else
   {
      outtime=MathFloor((intime+345600)/TF/60)*TF*60-345600;
   }
   
//----
   return(outtime);
  }

int n_iBarShift(datetime intime, int TF)
  {
//---- 
   int bindex,b_count;
   datetime TArray[];
   b_count=ArrayCopySeries(TArray,MODE_TIME,Symbol(),TF);
   if( b_count<1 )
   {
      Alert("Íåõâàòêà äàííûõ!");
   }
   else
   {
      bindex=ArrayBsearch(TArray,NormTimeBarBegin(intime,TF),0,0,MODE_ASCEND) ;
   }
//----
   return(bindex);
  }

Comments