Author: Copyright � 2005, MetaQuotes Software Corp.
gStdPivots

Technical Overview: Historical Pivot Point Indicator

This script is designed to automatically calculate and display key price levels—known as Standard Pivot Points—on your trading charts. These levels act as visual benchmarks, helping traders identify potential areas of support and resistance based on historical price action.

Core Logic and Functionality

1. Automated Data Tracking The script constantly monitors the market's price movement to identify the "High," "Low," and "Close" prices for each preceding trading day. By capturing these specific data points, the tool can establish a baseline for the current day's price movement.

2. The Pivot Calculation Engine Once the previous day's data is secured, the script uses mathematical formulas to project seven distinct price levels for the current session:

  • The Central Pivot: The "fair value" balance point of the market for the day.
  • Resistance Levels (R1, R2, R3): These represent price ceilings where the market may face selling pressure or struggle to move higher.
  • Support Levels (S1, S2, S3): These represent "floors" where the market may find buying interest or struggle to drop further.

3. Historical Mapping Unlike simple tools that only show today's levels, this script is built to map these lines across historical data. It looks back through previous days and draws the corresponding pivot lines on your chart, allowing you to see how price reacted to these levels in the past.

4. Visual Presentation To ensure ease of use for the trader, the script performs the following visual tasks:

  • Line Drawing: It plots the seven levels as distinct lines on your chart window.
  • Dynamic Labeling: It automatically places text labels (e.g., "R1", "S2") near the price levels so you can instantly identify which level is which.
  • Timezone Synchronization: The logic includes a GMT shift setting to ensure that the "Daily" transition occurs correctly based on your specific time zone, preventing errors during day transitions.

Usage Constraints

For the logic to remain accurate and visible, the script is optimized for intraday viewing. It includes a built-in check that alerts the user if they attempt to apply it to a timeframe larger than 4 hours, as the daily pivot calculations are intended to provide detail on a shorter time scale.

Price Data Components
Series array that contains open time of each bar
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
14 Views
0 Downloads
0 Favorites
gStdPivots
//+------------------------------------------------------------------+
//|              cam_H2_H5_Historical_V4.mq4           gStdPivots.mq4|
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//| Modified to chart historical camarilla pivots by MrPip           |
//| 3/28/06 Fixed problem of Sunday/Monday pivots                    |
//|         and added some ideas from goodtiding5 (Kenneth Z.) 
//| 10/18/06 Modified by Stache to convert to std pivots      |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 7
#property indicator_color1 Yellow
#property indicator_width1 1
#property indicator_style1 3
#property indicator_color2 DodgerBlue
#property indicator_width2 1
#property indicator_style2 3
#property indicator_color3 FireBrick
#property indicator_width3 1
#property indicator_style3 3
#property indicator_color4 Magenta
#property indicator_width4 1
#property indicator_style4 1
#property indicator_color5 FireBrick
#property indicator_width5 1
#property indicator_style5 3
#property indicator_color6 DodgerBlue
#property indicator_width6 1
#property indicator_style6 3
#property indicator_color7 Yellow
#property indicator_width7 1
#property indicator_style7 3



//---- input parameters

extern int  GMTshift=0;
extern color RColor = Green;
extern color SColor= Red;
extern int fontsize=10;
extern int LabelShift=20;


double R3Buffer[];
double R2Buffer[];
double R1Buffer[];
double PivotBuffer[];
double S1Buffer[];
double S2Buffer[];
double S3Buffer[];

double P, R1,R2,R3,S1,S2,S3;

double prev_high=0;
double prev_low=0;
double prev_close=0;
double cur_day=0;
double prev_day=0;
double day_high=0;
double day_low=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(7);
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,R3Buffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,R2Buffer);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,R1Buffer);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,PivotBuffer);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexBuffer(4,S1Buffer);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexBuffer(5,S2Buffer);
   SetIndexStyle(6,DRAW_LINE);
   SetIndexBuffer(6,S3Buffer);
   SetIndexLabel(0,"S3");
   SetIndexLabel(1,"S2");
   SetIndexLabel(2,"S1");
   SetIndexLabel(3,"Pivot");
   SetIndexLabel(4,"R1");
   SetIndexLabel(5,"R2");
   SetIndexLabel(6,"R3");
   
//----
//   IndicatorShortName("gStdPivots);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
   ObjectDelete("CamPivot");
   ObjectDelete("ResH2");
   ObjectDelete("ResH3");
   ObjectDelete("ResH4");
   ObjectDelete("ResH5");  
   ObjectDelete("ResH4");
   ObjectDelete("ResH5"); 
//----
   return(0);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int cnt, limit;

//---- exit if period is greater than 4 hr charts
   if(Period() > 240)
   {
      Alert("Error - Chart period is greater than 4 Hr.");
      return(-1); // then exit
   }
   if(counted_bars<0) return(-1);

//---- last counted bar will be recounted
//   if(counted_bars>0) counted_bars--;

//   limit=(Bars-counted_bars)-1;
   limit=counted_bars;

//---- Get new daily prices & calculate pivots

   for (cnt=limit;cnt >=0;cnt--)
   {
   	if (TimeDayOfWeek(Time[cnt]) == 0)
	   {
        cur_day = prev_day;
	   }
	   else
	   {
        cur_day = TimeDay(Time[cnt]- (GMTshift*3600));
	   }
	   
   	if (prev_day != cur_day)
   	{
	   	prev_close = Close[cnt+1];
		   prev_high = day_high;
		   prev_low = day_low;

	      day_high = High[cnt];
 	      day_low  = Low[cnt];

   P  = (prev_high + prev_low + prev_close)/3;//Pivot
   R1 = (2*P)-prev_low;
   S1 = (2*P)-prev_high;
   R2 = P+(prev_high - prev_low);
   S2 = P-(prev_high - prev_low);
   R3 = (2*P)+(prev_high-(2*prev_low));
   S3 = (2*P)-((2* prev_high)-prev_low); 


		   prev_day = cur_day;
	   }
      if (High[cnt]>day_high)
      {
         day_high = High[cnt];
      }
      if (Low[cnt]<day_low)
      {
         day_low = Low[cnt];
      }
      
      
      
//         day_low=Open[cnt]; day_high=Open[cnt];
      
      

//---  Draw  Pivot lines on chart

      PivotBuffer[cnt]=P;
      R3Buffer[cnt]=R3;
      R2Buffer[cnt]=R2;
      R1Buffer[cnt]=R1;
      S1Buffer[cnt]=S1;
      S2Buffer[cnt]=S2;
      S3Buffer[cnt]=S3;
   }

   if (cur_day == TimeDay(CurTime()))   DisplayLabels();
//----
   return(0);
  }

void DisplayLabels()
{
      if(ObjectFind("CamPivot") != 0)
      {
        ObjectCreate("StsPivot", OBJ_TEXT, 0, 0,0);
        ObjectSetText("StdPivot", "                 Pivot",fontsize,"Arial",Yellow);
      }
      else
      {
        ObjectMove("StdPivot", 0, Time[20],P);
      }
      
      if(ObjectFind("Res 3") != 0)
      {
      ObjectCreate("Res 3", OBJ_TEXT, 0, 0, 0);
      ObjectSetText("Res 3", "      R 3",fontsize,"Arial",RColor);
      }
      else
      {
         ObjectMove("Res 3", 0, Time[20],R3);
      }
      
      if(ObjectFind("Res 2") != 0)
      {
      ObjectCreate("Res 2", OBJ_TEXT, 0, 0, 0);
      ObjectSetText("Res 2", "      R 2",fontsize,"Arial",RColor);
      }
      else
      {
         ObjectMove("Res 2", 0, Time[20],R2);
      }
      
      if(ObjectFind("Res 1") != 0)
      {
      ObjectCreate("Res 1", OBJ_TEXT, 0, 0, 0);
      ObjectSetText("Res 1", "      R 1",fontsize,"Arial",RColor);
      }
      else
      {
         ObjectMove("Res 1", 0, Time[20],R1);
      }
      
      if(ObjectFind("Sup 1") != 0)
      {
      ObjectCreate("Sup 1", OBJ_TEXT, 0, 0, 0);
      ObjectSetText("Sup 1", "      S 1",fontsize,"Arial",SColor);
      }
      else
      {
         ObjectMove("Sup 1", 0, Time[20],S1);
      }
      
      if(ObjectFind("Sup 2") != 0)
      {
      ObjectCreate("Sup 2", OBJ_TEXT, 0, 0, 0);
      ObjectSetText("Sup 2", "      S 2",fontsize,"Arial",SColor);
      }
      else
      {
         ObjectMove("Sup 2", 0, Time[20],S2);
      }
      if(ObjectFind("Sup 3") != 0)
      {
      ObjectCreate("Sup 3", OBJ_TEXT, 0, 0, 0);
      ObjectSetText("Sup 3", "      S 3",fontsize,"Arial",SColor);
      }
      else
      {
         ObjectMove("Sup 3", 0, Time[20],S3);
      }
      
      
}
//+------------------------------------------------------------------+

Comments