Author: unknown author, get from kaizer, conversed by Rosh
DFC_Next

This script is designed as a technical analysis tool for the MetaTrader platform, specifically aimed at traders who use Fibonacci-based price levels and time-based market structures. It automatically calculates and plots specific upper and lower price boundaries (MaH and MaL) based on historical price extremes and defined ratios.

The core logic can be broken down into several key functional areas:

Timeframe Awareness and Delimiters

One of the primary features of this tool is its "time awareness." It recognizes standard trading periods (such as 15-minute, Hourly, Daily, Weekly, and Monthly) and identifies specific "delimiter" points within those timeframes. These delimiters act as anchors—logical breaks in the data where the script resets or recalculates its primary price boundaries. This ensures that the analysis is synchronized with standard market sessions rather than just flowing continuously without context.

Dynamic Price Boundary Calculation

The script focuses on identifying significant highs and lows over a specific number of bars (defined by the user). Once these extremes are found, it calculates a central reference point. From this center, it projects two boundaries:

  • Upper Boundary (MaH): Calculated using a specific Fibonacci-style ratio relative to the distance between the high and low points.
  • Lower Boundary (MaL): Calculated similarly but projected downwards.

These boundaries help traders visualize potential "channels" or zones of interest where price might react or experience resistance and support.

Data Projection and Continuity

The script offers two different ways to display this data on a chart, depending on the user's preference:

  1. Sectional View: In its default mode, it creates distinct sections of data. It draws the calculated boundaries only for specific segments of the chart, allowing traders to see clear, segmented "blocks" of price action.
  2. Continuous Flow (Moving Projection): If the user chooses to activate the "SetAllBars" option, the script changes its behavior significantly. Instead of just showing the calculated points, it calculates the linear trajectory between two delimiter points and projects a continuous line across the intervening bars. This fills in the gaps, creating a smooth, connected visual channel for the price.

Real-Time Updating

The logic is designed to remain current as new price data arrives. It constantly checks the most recent candle (the "current" bar) to update the very end of the plotted lines. This ensures that even as the market moves, the most recent upper and lower boundaries are calculated dynamically based on the latest available high, low, and closing prices.

In summary, this tool translates raw price movements into a structured visual channel by identifying key historical extremes at specific time intervals and projecting Fibonacci-inspired boundaries either as distinct segments or as continuous lines.

Miscellaneous
Implements a curve of type %1
16 Views
0 Downloads
0 Favorites
DFC_Next
//+------------------------------------------------------------------------------------+
//| Din_fibo_Next.mq4                                                                  |
//| unknown author, get from kaizer, conversed by Rosh                                 |
//| link to kaizer: http://forum.alpari-idc.ru/profile.php?mode=viewprofile&u=4196161  |
//| http://forexsystems.ru/phpBB/index.php                                             |
//+------------------------------------------------------------------------------------+
#property copyright "unknown author, get from kaizer, conversed by Rosh"
#property link      "http://fx.winm.ru/book.htm"
//----
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Red
//---- input parameters
extern int       Fibo_Channel_Period=3;
extern double    Ratio=0.786;
extern bool      SetAllBars=false;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double tvBuffer[];
int hh,ll,first,counterPeriod;
double tv,MaH,MaL;
//+------------------------------------------------------------------+
//| Ïîëó÷èì ñëåäóþùèé ïåðèîä                                         |
//+------------------------------------------------------------------+
string GetNextPeriod(int _Period)
  {
   string nextPeriod="";
//---- 
   switch(_Period)
     {
      case 5: nextPeriod="H1"; break;
      case 15: nextPeriod="H1"; break;
      case 30: nextPeriod="H4"; break;
      case 60: nextPeriod="H4"; break;
      case 240: nextPeriod="D1"; break;
      case 1440: nextPeriod="W1"; break;
      case 10080: nextPeriod="M"; break;
      default: Print("Íåäîïóñòèìûé ïåðèîä!!!");
     }
//----
   return(nextPeriod);
  }
//+------------------------------------------------------------------+
//| Ïðîâåðèì - ðàçäåëèòåëü äèàïàçîíà èëè íåò                         |
//+------------------------------------------------------------------+
bool isDelimeter(int _Period, int _shift)
  {
   bool result=false;
//---- 
   switch(_Period)
     {
      case 5:result=(TimeMinute(Time[_shift])==0); break;
      case 15:result=(TimeMinute(Time[_shift])==0); break;
      case 30:result=(TimeMinute(Time[_shift])==0)&& MathMod(TimeHour(Time[_shift]),4.0)==0.0; break;
      case 60:result=(TimeMinute(Time[_shift])==0)&& MathMod(TimeHour(Time[_shift]),4.0)==0.0;break;
      case 240:result=(TimeMinute(Time[_shift])==0)&&(TimeHour(Time[_shift])==0); break;
      case 1440:result=(TimeDayOfWeek(Time[_shift])==1)&&(TimeHour(Time[_shift])==0); break;
      case 10080:result=(TimeDay(Time[_shift])==1)||((TimeDay(Time[_shift])==2 && TimeDay(Time[_shift+1])!=1))||((TimeDay(Time[_shift])==3 && TimeDay(Time[_shift+1])!=2)); break;
      default: Print("Íåäîïóñòèìûé ïåðèîä!!!");
     }
//----
   return(result);
  }
//+------------------------------------------------------------------+
//| Óñòàíîâèì MaH è MaL íà ãðàíèöå äèàïàçîíà                         |
//+------------------------------------------------------------------+
void SetHnL(int _shift)
  {
//---- 
   int i=_shift+1;
   counterPeriod=0;
   first=0;
   while(counterPeriod<Fibo_Channel_Period)
     {
      while(tvBuffer[i]==0.0 && i<Bars) i++;
      if (first==0) first=i;
      counterPeriod++;
      i++;
     }
   i--;
   hh=Highest(NULL,0,MODE_HIGH,i-_shift,_shift+1);
   ll=Lowest(NULL,0,MODE_LOW,i-_shift,_shift+1);
   tv=NormalizeDouble((High[hh]+Low[ll]+Close[_shift+1])/3.0,Digits);
   MaH=tv+NormalizeDouble((High[hh]-Low[ll])/2.0*Ratio,Digits);
   MaL=tv-NormalizeDouble((High[hh]-Low[ll])/2.0*Ratio,Digits);
   tvBuffer[_shift]=tv;
   ExtMapBuffer1[_shift]=MaH;
   ExtMapBuffer2[_shift]=MaL;
   if (SetAllBars) SetMovingHnL(first, _shift);
//----
   return;
  }
//+------------------------------------------------------------------+
//| Óñòàíîâèì MaH è MaL âíóòðè äèàïàçîíà                             |
//+------------------------------------------------------------------+
void SetMovingHnL(int _DelimeterBar,int CurBar)
  {
   int m_cnt;
   double deltaH,deltaL;
//---- 
   deltaH=(ExtMapBuffer1[_DelimeterBar]-ExtMapBuffer1[CurBar])/(_DelimeterBar-CurBar);
   deltaL=(ExtMapBuffer2[_DelimeterBar]-ExtMapBuffer2[CurBar])/(_DelimeterBar-CurBar);
   for(m_cnt=_DelimeterBar-1;m_cnt>CurBar;m_cnt--)
     {
      ExtMapBuffer1[m_cnt]=ExtMapBuffer1[m_cnt+1]-deltaH;
      ExtMapBuffer2[m_cnt]=ExtMapBuffer2[m_cnt+1]-deltaL;
     }
   for(m_cnt=_DelimeterBar-1;m_cnt>CurBar;m_cnt--)
     {
      ExtMapBuffer1[m_cnt]=NormalizeDouble(ExtMapBuffer1[m_cnt],Digits);
      ExtMapBuffer2[m_cnt]=NormalizeDouble(ExtMapBuffer2[m_cnt],Digits);
     }
//----
   return;
  }
//+------------------------------------------------------------------+
//| Óñòàíîâèì MaH è MaL íà ïðàâîì êðàþ                               |
//+------------------------------------------------------------------+
void SetValuesNullBar(int _shift)
  {
//---- 
   int i=_shift;
   while(tvBuffer[i]==0.0) i++;
   for(int j=i-1;j>_shift;j--)
     {
      ExtMapBuffer1[j]=0.0;
      ExtMapBuffer2[j]=0.0;
     }
   first=0;
   i=_shift;
   counterPeriod=0;
   while(counterPeriod<Fibo_Channel_Period)
     {
      while(tvBuffer[i]==0.0 && i<Bars) i++;
      if (first==0) first=i;
      counterPeriod++;
      i++;
     }
   i--;
   hh=Highest(NULL,0,MODE_HIGH,i-_shift,_shift);
   ll=Lowest(NULL,0,MODE_LOW,i-_shift,_shift);
   tv=NormalizeDouble((High[hh]+Low[ll]+Close[_shift])/3.0,Digits);
   MaH=tv+NormalizeDouble((High[hh]-Low[ll])/2.0*Ratio,Digits);
   MaL=tv-NormalizeDouble((High[hh]-Low[ll])/2.0*Ratio,Digits);
   ExtMapBuffer1[_shift]=MaH;
   ExtMapBuffer2[_shift]=MaL;
   if (SetAllBars) SetMovingHnL(first,_shift);
//----
   return;
  }//-------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   string label;
   if (SetAllBars)
     {
      SetIndexStyle(0,DRAW_LINE);
      SetIndexBuffer(0,ExtMapBuffer1);
      label="DFC Next "+GetNextPeriod(Period())+"("+Fibo_Channel_Period+") MaH";
      SetIndexLabel(0,label);
      SetIndexEmptyValue(0,0.0);
//----
      SetIndexStyle(1,DRAW_LINE);
      SetIndexBuffer(1,ExtMapBuffer2);
      label="DFC Next "+GetNextPeriod(Period())+"("+Fibo_Channel_Period+") MaL";
      SetIndexLabel(1,label);
      SetIndexEmptyValue(1,0.0);
     }
   else
     {
      SetIndexStyle(0,DRAW_SECTION);
      SetIndexBuffer(0,ExtMapBuffer1);
      label="DFC Next "+GetNextPeriod(Period())+"("+Fibo_Channel_Period+") MaH";
      SetIndexLabel(0,label);
      SetIndexEmptyValue(0,0.0);
//----
      SetIndexStyle(1,DRAW_SECTION);
      SetIndexBuffer(1,ExtMapBuffer2);
      label="DFC Next "+GetNextPeriod(Period())+"("+Fibo_Channel_Period+") MaL";
      SetIndexLabel(1,label);
      SetIndexEmptyValue(1,0.0);
     }
   SetIndexBuffer(2,tvBuffer);
   SetIndexEmptyValue(2,0.0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int cnt,limit;
//---- 
   if (Period()==10080) return;
   if (counted_bars<0) return(-1);
   if (counted_bars>0) limit=Bars-counted_bars;
   if (counted_bars==0)
     {
      // íàéòè ïåðâûé è âòîðîé ðàçäåëèòåëü è óñòàíîâèòü limit
      cnt=Bars-1;
      while(!isDelimeter(Period(),cnt)) cnt--;
      first=cnt;
      cnt--;
      counterPeriod=0;
      while(counterPeriod<Fibo_Channel_Period)
        {
         while(!isDelimeter(Period(),cnt)) cnt--;
         cnt--;
         counterPeriod++;
        }
      cnt++;
      hh=Highest(NULL,0,MODE_HIGH,first-cnt,cnt+1);
      ll=Lowest(NULL,0,MODE_LOW,first-cnt,cnt+1);
      tv=NormalizeDouble((High[hh]+Low[ll]+Close[cnt+1])/3.0,Digits);
      MaH=tv+NormalizeDouble((High[hh]-Low[ll])/2.0*Ratio,Digits);
      MaL=tv-NormalizeDouble((High[hh]-Low[ll])/2.0*Ratio,Digits);
      tvBuffer[cnt]=tv;
      ExtMapBuffer1[cnt]=MaH;
      ExtMapBuffer2[cnt]=MaL;
      limit=cnt-1;
     }
//----
   for(int shift=limit;shift>=0;shift--)
     {
      if (isDelimeter(Period(),shift)) SetHnL(shift);// else SetMovingHnL(shift);
      if (shift==0) SetValuesNullBar(shift);
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments