cam_H2_H5_Historical_v1

Download script
Author: Copyright � 2005, MetaQuotes Software Corp.
cam_H2_H5_Historical_v1

This script is designed for the MetaTrader platform to automatically calculate and display historical Camarilla Pivot levels on a price chart. These levels are technical analysis tools used by traders to identify potential areas of support and resistance, specifically helping to gauge where the market might react based on previous price action.

Core Functionality

The tool scans the historical data of a currency pair or asset to calculate five specific price points for every trading day: H2, H3, H4, H5, and a central Pivot point.

Instead of being static numbers, these levels are dynamic; they are recalculated automatically based on the high, low, and closing prices of the previous trading session. This ensures that the lines on your chart accurately reflect the most recent market volatility and price range.

How the Logic Works

The script follows a structured process to determine these values:

  • Time Management: It monitors the passage of time to recognize when a new day begins. It includes specific logic to handle weekend transitions (like Sunday/Monday) to ensure the data remains consistent during market gaps.
  • Data Collection: For every day, the script identifies three key pieces of information:
    1. The highest price reached (High).
    2. The lowest price reached (Low).
    3. The price at which the session ended (Close).
  • Calculation Engine: Once it has these figures from the previous day, it applies specific mathematical formulas to project the "Camarilla" levels:
    • Pivot Point: Calculated as the simple average of the previous high, low, and close.
    • H2 through H5 Levels: These are calculated using specific percentages (ratios) of the previous day's range. They represent different zones of resistance.
  • Visual Mapping: Once the numbers are calculated, the script draws them as horizontal lines across your chart. This allows you to see exactly where these levels sat in the past and how current price action interacts with them.

User Interface & Experience

To make the data easy to read for a human user, the script includes several "Quality of Life" features:

  • Dynamic Labeling: The script places text labels (like "H2", "H3", etc.) directly on the chart near the lines. These labels move automatically so they stay visible as new price data appears.
  • Chart Compatibility: The tool is optimized for intraday trading. If you try to view it on a timeframe larger than 4 hours, the script will alert you, as the daily pivot logic is intended for shorter-term perspective analysis.
  • Visual Distinction: The different levels are color-coded (Green for the primary Camarilla levels and Yellow for the central Pivot), helping you quickly differentiate between various types of resistance at a glance.
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
cam_H2_H5_Historical_v1
//+------------------------------------------------------------------+
//|                                      cam_H2_H5_Historical_V4.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.)       |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 Green
#property indicator_color2 Green
#property indicator_color3 Green
#property indicator_color4 Green
#property indicator_color5 Yellow
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 1

//---- input parameters

extern int  GMTshift=0;
extern color HColor = Green;
extern int fontsize=10;
extern int LabelShift=20;

double H5Buffer[];
double H4Buffer[];
double H3Buffer[];
double H2Buffer[];
double PivotBuffer[];

double P, H2, H3, H4, H5;

double D1=0.091667;
double D2=0.183333;
double D3=0.2750;
double D4=0.55;

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(5);
//---- indicators
   SetIndexStyle(0,DRAW_LINE, 0,2,Green);
   SetIndexBuffer(0,H5Buffer);
   SetIndexStyle(1,DRAW_LINE, 0,2,Green);
   SetIndexBuffer(1,H4Buffer);
   SetIndexStyle(2,DRAW_LINE, 0,2,Green);
   SetIndexBuffer(2,H3Buffer);
   SetIndexStyle(3,DRAW_LINE, 0,2,Green);
   SetIndexBuffer(3,H2Buffer);
   SetIndexStyle(4,DRAW_LINE, STYLE_DASH, 1, Yellow);
   SetIndexBuffer(4,PivotBuffer);
   
   SetIndexLabel(0,"H5");
   SetIndexLabel(1,"H4");
   SetIndexLabel(2,"H3");
   SetIndexLabel(3,"H2");
   SetIndexLabel(4,"Pivot");

   
//----
//   IndicatorShortName("Cam H Pivots");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
   ObjectDelete("CamPivot");
   ObjectDelete("ResH2");
   ObjectDelete("ResH3");
   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
//---- To display all 8 Camarilla pivots remove comment symbols below and
// add the appropriate object functions below
H5 = (prev_high/prev_low)*prev_close;
H4 = ((prev_high - prev_low)* D4) + prev_close;
H3 = ((prev_high - prev_low)* D3) + prev_close;
H2 = ((prev_high - prev_low) * D2) + prev_close;
//H1 = ((prev_high - prev_low) * D1) + prev_close;


		   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;
      H5Buffer[cnt]=H5;
      H4Buffer[cnt]=H4;
      H3Buffer[cnt]=H3;
      H2Buffer[cnt]=H2;
      
   }

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

void DisplayLabels()
{
      if(ObjectFind("CamPivot") != 0)
      {
        ObjectCreate("CamPivot", OBJ_TEXT, 0, 0,0);
        ObjectSetText("CamPivot", "                 Pivot",fontsize,"Arial",Yellow);
      }
      else
      {
        ObjectMove("CamPivot", 0, Time[20],P);
      }
      
      if(ObjectFind("ResH2") != 0)
      {
      ObjectCreate("ResH2", OBJ_TEXT, 0, 0, 0);
      ObjectSetText("ResH2", "      H 2",fontsize,"Arial",HColor);
      }
      else
      {
         ObjectMove("ResH2", 0, Time[20],H2);
      }
      
      if(ObjectFind("ResH3") != 0)
      {
      ObjectCreate("ResH3", OBJ_TEXT, 0, 0, 0);
      ObjectSetText("ResH3", "      H 3",fontsize,"Arial",HColor);
      }
      else
      {
         ObjectMove("ResH3", 0, Time[20],H3);
      }
      
      if(ObjectFind("ResH4") != 0)
      {
      ObjectCreate("ResH4", OBJ_TEXT, 0, 0, 0);
      ObjectSetText("ResH4", "      H 4",fontsize,"Arial",HColor);
      }
      else
      {
         ObjectMove("ResH4", 0, Time[20],H4);
      }
      
      if(ObjectFind("ResH5") != 0)
      {
      ObjectCreate("ResH5", OBJ_TEXT, 0, 0, 0);
      ObjectSetText("ResH5", "      H 5",fontsize,"Arial",HColor);
      }
      else
      {
         ObjectMove("ResH5", 0, Time[20],H5);
      }
}
//+------------------------------------------------------------------+

Comments