Pivot-Calculator_001

Download script
Author:
Pivot-Calculator_001

This script is designed to function as a visual Pivot Point calculator for traders using the MetaTrader platform. Its primary purpose is to automatically identify and draw key price levels—specifically Support and Resistance zones—directly onto your trading chart based on historical price data.

Core Functionality

The logic operates by analyzing the "High," "Low," and "Close" prices of previous trading sessions. By processing this information, it generates a series of horizontal lines that help traders identify potential areas where the market might encounter difficulty moving higher (Resistance) or lower (Support).

Key Features and Logic Flow:

  • Historical Data Analysis: The script automatically looks back at previous price action. It includes specific logic to handle weekend gaps (such as identifying the correct "previous" trading day if the current day is Monday), ensuring that the levels drawn remain accurate even during market closures.
  • Pivot Point Calculation: It calculates a standard "Pivot" point, which serves as the central balance of the market for the current period.
  • Support and Resistance Levels: Based on the Pivot Point, the script generates multiple layers of data:
    • Primary Levels (R1, R2, R3 and S1, S2, S3): These are the main boundaries used to identify significant price ceilings and floors.
    • Mid-Levels (MR and MS series): The script goes further by calculating "mid-points" between the primary levels. This provides a more granular view of the market's structure, helping traders see smaller fluctuations within the larger zones.
    • Double Mid-Levels: It even calculates secondary subdivisions (the "mm" series), offering extremely detailed price targets for precise entry and exit planning.
  • Visual Organization: To ensure the chart remains readable, the script distinguishes between different types of levels using visual styles:
    • Solid Lines: Used for the primary Pivot and main Support/Resistance levels to highlight high-importance zones.
    • Dashed/Dotted Lines: Used for the various mid-point levels, allowing you to see the "fine print" of the market structure without cluttering your view of the main trends.
    • Dynamic Labeling: Every line is automatically labeled (e.g., "R1", "S2", "Pivot"), so you can identify exactly which price level you are looking at in real-time.

User Experience:

When applied to a chart, the script clears out any old lines and redraws the entire structure based on the most recent daily data. It automatically handles the math and the drawing, providing a clean, organized map of potential trading boundaries every time the market moves into a new session.

Price Data Components
Series array that contains open time of each bar
9 Views
0 Downloads
0 Favorites
Pivot-Calculator_001
//+------------------------------------------------------------------+
//|           Included is the PRICE based Pivot calculator           |
//|                (Daily Pivot,R1,R2,R3 & S1,S2,S3)                 |
//|                                                                  |
//|                                 Email: Xard777@connectfree.co.uk |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property indicator_chart_window


extern int P = 5; //How many days back /0 = curr day/ 1 = yesterday/ 2= 2days ago
extern color PivotColor = Black; // Color of both the label and level
extern color MidColor = Black; // Color of both the label and level
extern color MidMidColor = Black; // Color of both the label and level

//---- input parameters ----
int fontsize = 10;
double LastHigh, LastLow, x;

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{

  ObjectsDeleteAll();   
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
//---- Name for DataWindow and indicator subwindow label
   IndicatorShortName("XA"); 
   SetIndexDrawBegin(0,1);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));

   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{

   int counted_bars = IndicatorCounted();
   int limit, i;
   
   //---- Indicator Calculation ----
   if(counted_bars == 0)
   {
       x = Period();
       if(x > 240) 
           return(-1);       
   }
   if(counted_bars < 0) 
       return(-1);
   
   //---- last counted bar will be recounted
   limit = (Bars - counted_bars) - 1;
   for(i = limit; i >= 0; i--)
   { 
       if(High[i+1] > LastHigh) 
           LastHigh = High[i+1];
       //----
       if(Low[i+1] < LastLow) 
           LastLow=Low[i+1];
       if(TimeDay(Time[i]) != TimeDay(Time[i+1]))
       { 
           LastLow = Open[i]; 
           LastHigh = Open[i];
       }
      
   //---- Pivot Setup ----
   double rates[1][6],yesterday_volume,yesterday_close,yesterday_high,yesterday_low,yesterday_open;
   ArrayCopyRates(rates, Symbol(), PERIOD_D1);

   if(DayOfWeek() == 1)
   {
      if(TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,1)) == 5)
      {
          yesterday_volume = rates[1][5];
          yesterday_close = rates[1][4];
          yesterday_high = rates[1][3];
          yesterday_low = rates[1][2];
          yesterday_open = rates[1][1];
      }
      else
      {
         for(int d = 5;d>=0;d--)
         {
            if(TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,d)) == 5)
            {
                yesterday_volume = rates[d][5];
                yesterday_close = rates[d][4];
                yesterday_high = rates[d][3];
                yesterday_low = rates[d][2];
                yesterday_open = rates[d][1];
            }
         }  
      }
   }
   else
   {
       yesterday_close = rates[1][4];
       yesterday_high = rates[1][3];
       yesterday_low = rates[1][2];
       yesterday_open = rates[1][1];
   }

   //---- Calculate Pivots ----
   double R = yesterday_high - yesterday_low;//range
   double p = (yesterday_high + yesterday_low + yesterday_close)/3;// Standard Pivot
   double r3 = (2*p)+(yesterday_high-(2*yesterday_low));// Resistance 3
   double r2 = p+(yesterday_high - yesterday_low);// Resistance point 2
   double r1 = (2*p)-yesterday_low;// Resistance point 1
   double s1 = (2*p)-yesterday_high;// Support point 1
   double s2 = p-(yesterday_high - yesterday_low);// Support point 2
   double s3 = (2*p)-((2* yesterday_high)-yesterday_low);// Support point 3

   double mr1 = 0.5*(p+r1);
   double mr2 = 0.5*(r1+r2);
   double mr3 = 0.5*(r2+r3);
   double ms1 = 0.5*(p+s1);
   double ms2 = 0.5*(s1+s2);
   double ms3 = 0.5*(s2+s3);
   
   double mmr1 = 0.5*(p+mr1);
   double mmr2 = 0.5*(mr1+r1);
   double mmr3 = 0.5*(r1+mr2);
   double mmr4 = 0.5*(mr2+r2);
   double mmr5 = 0.5*(r2+mr3);
   double mmr6 = 0.5*(mr3+r3);
   
   double mms1 = 0.5*(p+ms1);
   double mms2 = 0.5*(ms1+s1);
   double mms3 = 0.5*(s1+ms2);
   double mms4 = 0.5*(ms2+s2);
   double mms5 = 0.5*(s2+ms3);
   double mms6 = 0.5*(ms3+s3);
   
   //Pivot, Support & Resistance Lines
   ObjectDelete("p_Line");
   ObjectCreate("p_Line", OBJ_HLINE,0, CurTime(),p);
   ObjectSet("p_Line",OBJPROP_COLOR,PivotColor);
   ObjectSet("p_Line",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSet("p_Line",OBJPROP_WIDTH,3);

   ObjectDelete("r1_Line");
   ObjectCreate("r1_Line", OBJ_HLINE,0, CurTime(),r1);
   ObjectSet("r1_Line",OBJPROP_COLOR,PivotColor);
   ObjectSet("r1_Line",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSet("r1_Line",OBJPROP_WIDTH,3);

   ObjectDelete("r2_Line");
   ObjectCreate("r2_Line", OBJ_HLINE,0, CurTime(),r2);
   ObjectSet("r2_Line",OBJPROP_COLOR,PivotColor);
   ObjectSet("r2_Line",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSet("r2_Line",OBJPROP_WIDTH,3);

   ObjectDelete("r3_Line");
   ObjectCreate("r3_Line", OBJ_HLINE,0, CurTime(),r3);
   ObjectSet("r3_Line",OBJPROP_COLOR,PivotColor);
   ObjectSet("r3_Line",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSet("r3_Line",OBJPROP_WIDTH,3);

   ObjectDelete("s1_Line");
   ObjectCreate("s1_Line", OBJ_HLINE,0, CurTime(),s1);
   ObjectSet("s1_Line",OBJPROP_COLOR,PivotColor);
   ObjectSet("s1_Line",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSet("s1_Line",OBJPROP_WIDTH,3);

   ObjectDelete("s2_Line");
   ObjectCreate("s2_Line", OBJ_HLINE,0, CurTime(),s2);
   ObjectSet("s2_Line",OBJPROP_COLOR,PivotColor);
   ObjectSet("s2_Line",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSet("s2_Line",OBJPROP_WIDTH,3);

   ObjectDelete("s3_Line");
   ObjectCreate("s3_Line", OBJ_HLINE,0, CurTime(),s3);
   ObjectSet("s3_Line",OBJPROP_COLOR,PivotColor);
   ObjectSet("s3_Line",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSet("s3_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mr1_Line");
   ObjectCreate("mr1_Line", OBJ_HLINE,0, CurTime(),mr1);
   ObjectSet("mr1_Line",OBJPROP_COLOR,MidColor);
   ObjectSet("mr1_Line",OBJPROP_STYLE,STYLE_DASH);
   ObjectSet("mr1_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mr2_Line");
   ObjectCreate("mr2_Line", OBJ_HLINE,0, CurTime(),mr2);
   ObjectSet("mr2_Line",OBJPROP_COLOR,MidColor);
   ObjectSet("mr2_Line",OBJPROP_STYLE,STYLE_DASH);
   ObjectSet("mr2_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mr3_Line");
   ObjectCreate("mr3_Line", OBJ_HLINE,0, CurTime(),mr3);
   ObjectSet("mr3_Line",OBJPROP_COLOR,MidColor);
   ObjectSet("mr3_Line",OBJPROP_STYLE,STYLE_DASH);
   ObjectSet("mr3_Line",OBJPROP_WIDTH,3);

   ObjectDelete("ms1_Line");
   ObjectCreate("ms1_Line", OBJ_HLINE,0, CurTime(),ms1);
   ObjectSet("ms1_Line",OBJPROP_COLOR,MidColor);
   ObjectSet("ms1_Line",OBJPROP_STYLE,STYLE_DASH);
   ObjectSet("ms1_Line",OBJPROP_WIDTH,3);

   ObjectDelete("ms2_Line");
   ObjectCreate("ms2_Line", OBJ_HLINE,0, CurTime(),ms2);
   ObjectSet("ms2_Line",OBJPROP_COLOR,MidColor);
   ObjectSet("ms2_Line",OBJPROP_STYLE,STYLE_DASH);
   ObjectSet("ms2_Line",OBJPROP_WIDTH,3);

   ObjectDelete("ms3_Line");
   ObjectCreate("ms3_Line", OBJ_HLINE,0, CurTime(),ms3);
   ObjectSet("ms3_Line",OBJPROP_COLOR,MidColor);
   ObjectSet("ms3_Line",OBJPROP_STYLE,STYLE_DASH);
   ObjectSet("ms3_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mmr1_Line");
   ObjectCreate("mmr1_Line", OBJ_HLINE,0, CurTime(),mmr1);
   ObjectSet("mmr1_Line",OBJPROP_COLOR,MidMidColor);
   ObjectSet("mmr1_Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("mmr1_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mmr2_Line");
   ObjectCreate("mmr2_Line", OBJ_HLINE,0, CurTime(),mmr2);
   ObjectSet("mmr2_Line",OBJPROP_COLOR,MidMidColor);
   ObjectSet("mmr2_Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("mmr2_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mmr3_Line");
   ObjectCreate("mmr3_Line", OBJ_HLINE,0, CurTime(),mmr3);
   ObjectSet("mmr3_Line",OBJPROP_COLOR,MidMidColor);
   ObjectSet("mmr3_Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("mmr3_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mmr4_Line");
   ObjectCreate("mmr4_Line", OBJ_HLINE,0, CurTime(),mmr4);
   ObjectSet("mmr4_Line",OBJPROP_COLOR,MidMidColor);
   ObjectSet("mmr4_Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("mmr4_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mmr5_Line");
   ObjectCreate("mmr5_Line", OBJ_HLINE,0, CurTime(),mmr5);
   ObjectSet("mmr5_Line",OBJPROP_COLOR,MidMidColor);
   ObjectSet("mmr5_Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("mmr5_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mmr6_Line");
   ObjectCreate("mmr6_Line", OBJ_HLINE,0, CurTime(),mmr6);
   ObjectSet("mmr6_Line",OBJPROP_COLOR,MidMidColor);
   ObjectSet("mmr6_Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("mmr6_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mms1_Line");
   ObjectCreate("mms1_Line", OBJ_HLINE,0, CurTime(),mms1);
   ObjectSet("mms1_Line",OBJPROP_COLOR,MidMidColor);
   ObjectSet("mms1_Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("mms1_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mms2_Line");
   ObjectCreate("mms2_Line", OBJ_HLINE,0, CurTime(),mms2);
   ObjectSet("mms2_Line",OBJPROP_COLOR,MidMidColor);
   ObjectSet("mms2_Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("mms2_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mms3_Line");
   ObjectCreate("mms3_Line", OBJ_HLINE,0, CurTime(),mms3);
   ObjectSet("mms3_Line",OBJPROP_COLOR,MidMidColor);
   ObjectSet("mms3_Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("mms3_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mms4_Line");
   ObjectCreate("mms4_Line", OBJ_HLINE,0, CurTime(),mms4);
   ObjectSet("mms4_Line",OBJPROP_COLOR,MidMidColor);
   ObjectSet("mms4_Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("mms4_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mms5_Line");
   ObjectCreate("mms5_Line", OBJ_HLINE,0, CurTime(),mms5);
   ObjectSet("mms5_Line",OBJPROP_COLOR,MidMidColor);
   ObjectSet("mms5_Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet("mms5_Line",OBJPROP_WIDTH,3);

   ObjectDelete("mms6_Line");
   ObjectCreate("mms6_Line", OBJ_HLINE,0, CurTime(),mms6);
   ObjectSet("mms6_Line",OBJPROP_COLOR,MidMidColor);
   ObjectSet("mms6_Line",OBJPROP_STYLE,STYLE_SOLID);
   ObjectSet("mms6_Line",OBJPROP_WIDTH,3);

   ObjectsRedraw();

   // ---- Typing Labels ----

   //MR3 Label
   if(ObjectFind("MR3 label") != 0)
   {
      ObjectCreate("MR3 label", OBJ_TEXT, 0, Time[3], mr3);
      ObjectSetText("MR3 label", " MR3 ", 9, "Verdana", MidColor);
   }
   else
   {
      ObjectMove("MR3 label", 0, Time[3], mr3);
   }

   //MR2 Label
   if(ObjectFind("MR2 label") != 0)
   {
      ObjectCreate("MR2 label", OBJ_TEXT, 0, Time[3], mr2);
      ObjectSetText("MR2 label", " MR2 ", 9, "Verdana", MidColor);
   }
   else
   {
      ObjectMove("MR2 label", 0, Time[3], mr2);
   }

   //MR1 Label
   if(ObjectFind("MR1 label") != 0)
   {
      ObjectCreate("MR1 label", OBJ_TEXT, 0, Time[3], mr1);
      ObjectSetText("MR1 label", " MR1 ", 9, "Verdana", MidColor);
   }
   else
   {
      ObjectMove("MR1 label", 0, Time[3], mr1);
   }

   //MS3 Label
   if(ObjectFind("MS3 label") != 0)
   {
      ObjectCreate("MS3 label", OBJ_TEXT, 0, Time[3], ms3);
      ObjectSetText("MS3 label", " MS3 ", 9, "Verdana", MidColor);
   }
   else
   {
      ObjectMove("MS3 label", 0, Time[3], ms3);
   }

   //MS2 Label
   if(ObjectFind("MS2 label") != 0)
   {
      ObjectCreate("MS2 label", OBJ_TEXT, 0, Time[3], ms2);
      ObjectSetText("MS2 label", " MS2 ", 9, "Verdana", MidColor);
   }
   else
   {
      ObjectMove("MS2 label", 0, Time[3], ms2);
   }

   //MS1 Label
   if(ObjectFind("MS1 label") != 0)
   {
      ObjectCreate("MS1 label", OBJ_TEXT, 0, Time[3], ms1);
      ObjectSetText("MS1 label", " MS1 ", 9, "Verdana", MidColor);
   }
   else
   {
      ObjectMove("MS1 label", 0, Time[3], ms1);
   }

   //R3 Label
   if(ObjectFind("R3 label") != 0)
   {
      ObjectCreate("R3 label", OBJ_TEXT, 0, Time[3], r3);
      ObjectSetText("R3 label", " R3 ", 9, "Verdana", PivotColor);
   }
   else
   {
      ObjectMove("R3 label", 0, Time[3], r3);
   }

   //S3 Label   
   if(ObjectFind("S3 label") != 0)
   {
      ObjectCreate("S3 label", OBJ_TEXT, 0, Time[3], s3);
      ObjectSetText("S3 label", " S3 ", 9, "Verdana", PivotColor);
   }
   else
   {
      ObjectMove("S3 label", 0, Time[3], s3);
   }

   //R2 Label 
   if(ObjectFind("R2 label") != 0)
   {
      ObjectCreate("R2 label", OBJ_TEXT, 0, Time[3], r2);
      ObjectSetText("R2 label", " R2 ", 9, "Verdana", PivotColor);
   }
   else
   {
      ObjectMove("R2 label", 0, Time[3], r2);
   }

   //S2 Label 
   if(ObjectFind("S2 label") != 0)
   {
      ObjectCreate("S2 label", OBJ_TEXT, 0, Time[3], s2);
      ObjectSetText("S2 label", " S2 ", 9, "Verdana", PivotColor);
   }
   else
   {
      ObjectMove("S2 label", 0, Time[3], s2);
   }

   //R1 Label
   if(ObjectFind("R1 label") != 0)
   {
      ObjectCreate("R1 label", OBJ_TEXT, 0, Time[3], r1);
      ObjectSetText("R1 label", " R1 ", 9, "Verdana", PivotColor);
   }
   else
   {
      ObjectMove("R1 label", 0, Time[3], r1);
   }

   //S1 Label
   if(ObjectFind("S1 label") != 0)
   {
      ObjectCreate("S1 label", OBJ_TEXT, 0, Time[3], s1);
      ObjectSetText("S1 label", " S1 ", 9, "Verdana", PivotColor);
   }
   else
   {
      ObjectMove("S1 label", 0, Time[3], s1);
   }

   //Pivot Label
   if(ObjectFind("P label") != 0)
   {
      ObjectCreate("P label", OBJ_TEXT, 0, Time[3], p);
      ObjectSetText("P label", " Pivot ", 9, "Verdana", PivotColor);
   }
   else
   {
      ObjectMove("P label", 0, Time[3], p);
   }  
 
   Comment("Pivot Calculator ");

   }

   return(0);
   
}
//Job Done
//+------------------------------------------------------------------+

Comments