cam_H1_H5_Historical_v2
Download scriptThis script is designed to automatically calculate and display historical Camarilla Pivot Point levels on your trading charts. These levels are a common technical analysis tool used by traders to identify potential support and resistance areas based on the previous day's price action.
Core Logic and Functionality
The script works by analyzing the high, low, and closing prices of each completed trading day to project specific price targets for the current day. Here is a breakdown of how the logic flows:
1. Data Collection & Daily Transitions The tool scans through your historical price data. It identifies when a new day begins (adjusting for your specific GMT time zone). Once it detects a new day, it captures three key pieces of information from the previous day:
- The highest price reached (High)
- The lowest price reached (Low)
- The final price at the end of the session (Close)
2. Mathematical Calculations Using those three data points, the script calculates several distinct price levels:
- Pivot Point: A central "balance" price calculated by averaging the previous day's high, low, and close.
- Camarilla Levels (H1 to H5): These are specific mathematical offsets based on the range of the previous day. Each level (H1, H2, H3, H4, and H5) represents a different price tier. Traders often use these to identify different "zones" of volatility; for example, some traders look at H3 and H4 for breakout signals, while others focus on H1 and H2 for scalp opportunities.
3. Visual Presentation Once the levels are calculated, the script draws them directly onto your chart as horizontal lines:
- The levels are plotted across the chart so you can see where they sit relative to current price movement.
- To keep the chart clean, the script includes a dynamic labeling system. It identifies the specific price points and places text labels (like "H1", "H2", etc.) on the right side of the screen, making it easy to read the exact value of each level at a glance.
4. User Constraints To ensure accuracy, the script includes a safety check: it is specifically designed for lower timeframes (specifically charts 4 hours and smaller). If you attempt to run it on a higher timeframe, such as a Daily or Weekly chart, the tool will alert you that the period is too large for the Camarilla logic to be applied correctly.
Summary of Benefits
By using this script, you remove the manual math required to find pivot points. It automatically handles the transition between days and keeps your historical data updated, allowing you to see exactly where key psychological "walls" (resistance) and "floors" (support) are located based on previous market behavior.
//+------------------------------------------------------------------+
//| cam_H1_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 6
#property indicator_color1 Green
#property indicator_color2 Green
#property indicator_color3 Green
#property indicator_color4 Green
#property indicator_color5 Green
#property indicator_color6 Red
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#property indicator_width5 2
#property indicator_width6 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 H1Buffer[];
double PivotBuffer[];
double P, H1, 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(6);
//---- 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, 0,2,Green);
SetIndexBuffer(4,H1Buffer);
SetIndexStyle(5,DRAW_LINE, STYLE_DASH, 1, Yellow);
SetIndexBuffer(5,PivotBuffer);
SetIndexLabel(0,"H5");
SetIndexLabel(1,"H4");
SetIndexLabel(2,"H3");
SetIndexLabel(3,"H2");
SetIndexLabel(4,"H1");
SetIndexLabel(5,"Pivot");
//---- IndicatorShortName("Cam H Pivots");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
ObjectDelete("CamPivot");
ObjectDelete("ResH1");
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];
PivotBuffer[cnt]=P;
H5Buffer[cnt]=H5;
H4Buffer[cnt]=H4;
H3Buffer[cnt]=H3;
H2Buffer[cnt]=H2;
H1Buffer[cnt]=H1;
}
if (cur_day==TimeDay(CurTime())) DisplayLabels();
//----
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DisplayLabels()
{
datetime LabelShiftTime;
LabelShiftTime=Time[LabelShift];
if(ObjectFind("CamPivot")!=0)
{
ObjectCreate("CamPivot", OBJ_TEXT, 0, 0,0);
ObjectSetText("CamPivot", " Pivot",fontsize,"Arial",Yellow);
}
else
{
ObjectMove("CamPivot", 0, LabelShiftTime,P);
}
if(ObjectFind("ResH1")!=0)
{
ObjectCreate("ResH1", OBJ_TEXT, 0, 0, 0);
ObjectSetText("ResH1", " H 1",fontsize,"Arial",HColor);
}
else
{
ObjectMove("ResH1", 0, LabelShiftTime,H1);
}
if(ObjectFind("ResH2")!=0)
{
ObjectCreate("ResH2", OBJ_TEXT, 0, 0, 0);
ObjectSetText("ResH2", " H 2",fontsize,"Arial",HColor);
}
else
{
ObjectMove("ResH2", 0, LabelShiftTime,H2);
}
if(ObjectFind("ResH3")!=0)
{
ObjectCreate("ResH3", OBJ_TEXT, 0, 0, 0);
ObjectSetText("ResH3", " H 3",fontsize,"Arial",HColor);
}
else
{
ObjectMove("ResH3", 0, LabelShiftTime,H3);
}
if(ObjectFind("ResH4")!=0)
{
ObjectCreate("ResH4", OBJ_TEXT, 0, 0, 0);
ObjectSetText("ResH4", " H 4",fontsize,"Arial",HColor);
}
else
{
ObjectMove("ResH4", 0, LabelShiftTime,H4);
}
if(ObjectFind("ResH5")!=0)
{
ObjectCreate("ResH5", OBJ_TEXT, 0, 0, 0);
ObjectSetText("ResH5", " H 5",fontsize,"Arial",HColor);
}
else
{
ObjectMove("ResH5", 0, LabelShiftTime, H5);
}
}
//+------------------------------------------------------------------+
Comments