_255eDyn_Range
Download scriptThis script is designed to identify and plot key price levels on a trading chart, specifically focusing on "Pivot" points based on the previous day's price action. By analyzing historical data, it automatically calculates specific price markers that can help traders understand the market's structural boundaries.
Core Logic Overview
The script operates by looking back at completed trading sessions to establish significant levels for the current day. It functions through several distinct logical steps:
1. Time and Day Detection The system first monitors the timeframe of the chart. If the timeframe is higher than 4 hours, the indicator remains inactive. When it is active on lower timeframes, it identifies the transition between days. Every time a new day begins, the script triggers a calculation to establish that day's specific price levels.
2. Historical Data Analysis To determine where these levels should be placed, the script scans the price data of the previous full trading day. It looks for three key pieces of information:
- The highest price reached during that day.
- The lowest price reached during that day.
- The closing price of that day.
3. Level Calculations Based on the data collected from the previous day, the script calculates three distinct price levels using two different mathematical formulas (determined by user settings):
- Pivot Point (FP): The central equilibrium level. It is calculated by balancing the high, low, and closing prices of the previous day.
- Resistance Level (FR1): A projected upper boundary. This is calculated by measuring the distance between the Pivot Point and the previous day's low and projecting it upward.
- Support Level (FS1): A projected lower boundary. This is calculated by measuring the distance between the Pivot Point and the previous day's high and projecting it downward.
4. Dynamic Chart Updates The script handles the visual representation of these levels dynamically:
- Historical Tracking: It places these levels on the chart so you can see how the boundaries shifted from day to day.
- Real-Time Adjustment: On the current "live" candle, it performs a specialized check. If the market is currently in the middle of a trading session, it recalculates and updates the levels to ensure they remain accurate as new price information comes in.
- Data Cleanup: The script includes logic to ensure that these levels are only displayed when relevant, preventing "ghost" lines or overlapping data from cluttering the chart where they no longer apply.
Summary of Purpose
Essentially, this tool takes the "extremes" of yesterday's trading (the highest and lowest points) and uses them to project a roadmap for today. It provides a visual guide of where price might face resistance (ceiling) or find support (floor) based on the mathematical average of the previous day's performance.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| ^Dyn_Pivot.mq4 |
//| Modest, Rosh conversed only |
//| http://forexsystems.ru/phpBB/index.php |
//+------------------------------------------------------------------+
#property copyright "Modest, Rosh conversed only"
#property link "http://forexsystems.ru/phpBB/index.php"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- input parameters
extern int Formula=0;
int i=1, j=1, shift=0;
double FP=0.0;
double FH=0.0, FL=0.0;
bool result;
//---- buffers
double ExtMapBuffer1[];
double FR1Buffer[];
double FS1Buffer[];
//+------------------------------------------------------------------+
//| Ïðîâåðêà íîâîãî äíÿ |
//+------------------------------------------------------------------+
bool isNewDay(int _shift)
{
//----
result=false;
if ( (TimeHour(Time[_shift])==0) && (TimeMinute(Time[_shift])==0) ) result=true;
//Print("Äàòà=",TimeToStr(Time[_shift])," isNewDay=",result);
//----
return(result);
}
//+------------------------------------------------------------------+
//| Óñòàíîâèòü óðîâíè FP, FR1 è FS1 ïðîøåäøåãî äíÿ |
//+------------------------------------------------------------------+
void SetLevels1(int _shift)
{
int prevDay=TimeDay(Time[_shift+1]);
//----
i=1;
while (TimeDay(Time[_shift+i])==prevDay) i++;
i--;
FH=High[Highest(NULL,0,MODE_HIGH,i,_shift+1)];
FL=Low[Lowest(NULL,0,MODE_LOW,i,_shift+1)];
if (Formula==0) FP=NormalizeDouble((FH+FL+Close[_shift+1])/3.0,Digits); else FP=NormalizeDouble((FH+FL+2*Close[_shift+1])/4.0,Digits);
//----
ExtMapBuffer1[_shift]=FP;
FR1Buffer[_shift]=NormalizeDouble(FP+(FP-FL),Digits);
FS1Buffer[_shift]=NormalizeDouble(FP-(FH-FP),Digits);
}
//+------------------------------------------------------------------+
//| Óñòàíîâèòü óðîâíè FP, FR1 è FS1 â íîëü |
//+------------------------------------------------------------------+
void SetLevels1Empty(int _shift)
{
ExtMapBuffer1[_shift]=0.0;
FR1Buffer[_shift]=0.0;
FS1Buffer[_shift]=0.0;
}
//+------------------------------------------------------------------+
//| Óñòàíîâêà óðîâíåé â íóëåâîì áàðå |
//+------------------------------------------------------------------+
void SetNullBarLevels(int _shift)
{
int cnt;
int currDay=TimeDay(Time[_shift]);
//----
i=1;
while (TimeDay(Time[_shift+i])==currDay) i++;
if (i>=2)
{
i=i-2;
for (cnt=i;cnt>0;cnt--)
{
ExtMapBuffer1[shift+cnt]=0.0;
FR1Buffer[_shift]=0.0;
FS1Buffer[_shift]=0.0;
}
FH=High[Highest(NULL,0,MODE_HIGH,i+1,_shift)];
FL=Low[Lowest(NULL,0,MODE_LOW,i+1,_shift)];
if (Formula==0) FP=NormalizeDouble((FH+FL+Close[_shift+1])/3.0,Digits); else FP=NormalizeDouble((FH+FL+2*Close[_shift+1])/4.0,Digits);
ExtMapBuffer1[_shift]=FP;
FR1Buffer[_shift]=NormalizeDouble(FP+(FP-FL),Digits);
FS1Buffer[_shift]=NormalizeDouble(FP-(FH-FP),Digits);
}
//----
return;
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2);
if (Formula!=0)Formula=1;
string label1="FR1("+Formula+")";
string label2="FS1("+Formula+")";
//---- indicators
SetIndexStyle(0,DRAW_SECTION);
SetIndexBuffer(0,FR1Buffer);
SetIndexEmptyValue(0,0.0);
SetIndexLabel(0,label1);
SetIndexStyle(1,DRAW_SECTION);
SetIndexBuffer(1,FS1Buffer);
SetIndexEmptyValue(1,0.0);
SetIndexLabel(1,label2);
SetIndexBuffer(2,ExtMapBuffer1);
SetIndexEmptyValue(2,0.0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit,firstDay;
int counted_bars=IndicatorCounted();
if (counted_bars<0) return(-1);
if (counted_bars==0)
{
limit=Bars-1;
i=1;
firstDay=TimeDay(Time[limit]);
while (TimeDay(Time[limit-i])==firstDay) i++;
limit=limit-i-PERIOD_D1/Period();
}
if (counted_bars>0) limit=Bars-counted_bars;
//----
if (Period()>PERIOD_H4) return;
for (shift=limit;shift>=0;shift--)
{
if (isNewDay(shift)) SetLevels1(shift); else SetLevels1Empty(shift);
if (shift==0) SetNullBarLevels(shift);
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments