^Pivot_AllLevels_v1

Download script
Author: Modest, Rosh conversed only
^Pivot_AllLevels_v1

This script is designed to identify and display specific price levels on a trading chart based on the previous day's market activity. It focuses on calculating "Pivot Points," which are commonly used by traders to determine potential support and resistance zones for the current trading session.

Core Logic Overview

The tool operates by looking back at the completed data of the previous day to project five distinct price levels onto your current chart. Instead of relying on real-time fluctuations, it uses the highest price (High), lowest price (Low), and the closing price from the prior 24-hour cycle to establish a framework for the current day.

How the Calculations Work

  1. Day Detection: The script constantly monitors the chart timeline. Every time it detects a shift into a new trading day, it triggers a recalculation of the levels based on the completed data from the day that just ended.
  2. Reference Point Calculation (Pivot Point): It first identifies the "Pivot Point" (the center of the range). The user can choose between two different mathematical formulas to determine this:
    • A standard method using the average of the high, low, and previous close.
    • An alternative weighted method that gives more importance to the previous day's closing price.
  3. Support and Resistance Projection: Once the central Pivot Point is established, the script uses it as an anchor to calculate four additional levels:
    • Resistance Levels: These project upward from the Pivot Point to indicate areas where price might face selling pressure.
    • Support Levels: These project downward from the Pivot Point to identify areas where price might find buying interest.

Visual Behavior on the Chart

  • Persistence: Once the levels are calculated for a new day, they remain "fixed" as horizontal markers throughout that day's session. They do not move or shift until the next day begins.
  • Timeframe Sensitivity: The script is specifically designed to work on lower timeframes (it automatically stops if you view a timeframe larger than 4 hours) to ensure the daily levels remain relevant and visible as discrete markers.
  • Visual Markers: Rather than drawing solid lines that might clutter the screen, the script places specific symbols (arrows/points) at each calculated level, allowing traders to see exactly where the technical "floors" and "ceilings" are located for the current session.
Price Data Components
Miscellaneous
Implements a curve of type %1
17 Views
0 Downloads
0 Favorites
^Pivot_AllLevels_v1
//+------------------------------------------------------------------+
//|                                                ^Pivot_ResSup.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"
//// Ñòðîèì Pivot è Res/Supp ïî FibonacciTrader Journal Issue 6
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 LightBlue
#property indicator_color2 Blue
#property indicator_color3 DarkGreen
#property indicator_color4 Red
#property indicator_color5 Magenta
//---- input parameters
extern int       Formula=0;
int i=1, shift;
double FP=0.0;
double FH=0.0, FL=0.0;
bool result;
//---- buffers
double ResBuffer2[];
double ResBuffer[];
double ExtMapBuffer1[];
double SupBuffer[];
double SupBuffer2[];

//+------------------------------------------------------------------+
//| Ïðîâåðêà íîâîãî äíÿ                                              |
//+------------------------------------------------------------------+
bool isNewDay(int _shift)
  {
//---- 
   result=false;
   //if (  (TimeHour(Time[_shift])==0)  && (TimeMinute(Time[_shift])==0)   ) result=true;
   // òàê^^ íå ðàáîòàåò ïðè îòñóòñòâèè áàðà 0:00 . Òàêîå èçðåäêà áûâàåò
   
   if (  TimeDay(Time[_shift])!=TimeDay(Time[_shift+1])  ) result=true;

//----
   return(result);
  }
//+------------------------------------------------------------------+
//| Ïîëó÷èòü óðîâíè FP,Res1,Sup1,Res2 è Sup2 ïðîøåäøåãî äíÿ          |
//+------------------------------------------------------------------+
void GetRSofDay(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;
   ResBuffer[_shift]=NormalizeDouble(FP+(FP-FL),Digits);
   SupBuffer[_shift]=NormalizeDouble(FP-(FH-FP),Digits);
   ResBuffer2[_shift]=NormalizeDouble(FP+(FH-FL),Digits);
   SupBuffer2[_shift]=NormalizeDouble(FP-(FH-FL),Digits);
//----
  }

//+------------------------------------------------------------------+
//| Êîïèðîâàòü FP,Res1,Sup1,Res2 è Sup2 ïðîøåäøåãî äíÿ               |
//+------------------------------------------------------------------+
void CopyLevelsDay(int _shift)
  {
   ExtMapBuffer1[_shift]=ExtMapBuffer1[_shift+1];
   ResBuffer[_shift]=ResBuffer[_shift+1];
   SupBuffer[_shift]=SupBuffer[_shift+1];
   ResBuffer2[_shift]=ResBuffer2[_shift+1];
   SupBuffer2[_shift]=SupBuffer2[_shift+1];
  }



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   if (Formula!=0)Formula=1;
   string label1="Pivot_Res2("+Formula+")";
   string label2="Pivot_Res("+Formula+")";
   string label3="Pivot_Point("+Formula+")";
   string label4="Pivot_Sup("+Formula+")";
   string label5="Pivot_Sup2("+Formula+")";
//---- indicators
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,160); 
   SetIndexBuffer(0,ResBuffer2);
   SetIndexEmptyValue(0,0.0);
   SetIndexLabel(0,label1);

   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,160); 
   SetIndexBuffer(1,ResBuffer);
   SetIndexEmptyValue(1,0.0);
   SetIndexLabel(1,label2);

   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,160); 
   SetIndexBuffer(2,ExtMapBuffer1);
   SetIndexEmptyValue(2,0.0);
   SetIndexLabel(2,label3);

   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,160); 
   SetIndexBuffer(3,SupBuffer);
   SetIndexEmptyValue(3,0.0);
   SetIndexLabel(3,label4);

   SetIndexStyle(4,DRAW_ARROW);
   SetIndexArrow(4,160); 
   SetIndexBuffer(4,SupBuffer2);
   SetIndexEmptyValue(4,0.0);
   SetIndexLabel(4,label5);

//----
   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(0);
   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)) GetRSofDay(shift); else CopyLevelsDay(shift);
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+

Comments