DFC Next
Download scriptThis script is designed to create a dynamic visual channel on a trading chart, utilizing Fibonacci principles to help traders identify potential price boundaries. It automatically calculates and plots specific "High" and "Low" price levels based on historical market data.
Core Logic and Functionality
Timeframe Awareness & Synchronization The script is intelligent enough to recognize different timeframes (such as 5-minute, Hourly, Daily, or Weekly charts). It identifies "Delimiter" bars—specific points in time where the market structure resets or shifts based on the timeframe being used. This ensures that the calculations are synchronized correctly with standard trading sessions and calendar cycles.
Dynamic Channel Calculation Instead of relying on a static range, the script looks back at a user-defined period of "Delimiter" bars to analyze price action. It identifies the highest high and lowest low within these sections to establish a price range.
- The Center Point: It calculates a central value (TV) by averaging the highest high, the lowest low, and the previous closing price.
- Fibonacci Projection: It then projects two boundaries (MaH and MaL) above and below this center point. The distance of these boundaries is determined by a specific Fibonacci ratio (defaulting to 0.786), which provides a mathematical perspective on potential support and resistance zones.
Visual Presentation Modes The script offers two distinct ways to display this information on your chart:
- Sectional Display: By default, it draws the channel in segments. This allows you to see how the price boundaries have shifted over time as new "Delimiters" are reached.
- Continuous Flow: If the "SetAllBars" option is enabled, the script uses linear interpolation. This means that instead of showing broken segments, it connects the data points smoothly, creating a continuous moving channel across the entire chart history.
Real-Time Updates The logic is designed to update dynamically. As each new candle forms, the script checks if it has hit a new boundary marker. If it has, it recalculates the highs and lows for the new section. Additionally, it contains a specialized function to handle the "Current" bar (the one currently moving in real-time), ensuring that the most recent price data is always accounted for in the displayed levels.
Summary for the User
In simple terms, this tool looks at the market's past moves, finds the extremes (highest and lowest points) over a set period, and draws a "Fibonacci corridor" around them. It helps you visualize where the price might be reacting based on mathematical proportions rather than just guessing where the next wall might be.
//+------------------------------------------------------------------------------------+
//| 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://forexsystems.ru/phpBB/index.php"
#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