cam_H1_H5_Historical_v1
Download scriptThis script is designed to automatically calculate and display specific price levels on a trading chart, known as Camarilla Pivot Points. These levels are used by traders to identify potential support and resistance areas based on the price action of the previous trading session.
Core Functionality
The primary purpose of this tool is to take the high, low, and closing prices from the previous day and use them to project five distinct horizontal lines onto the current day's chart. These lines help traders visualize where the market might face pressure or find stability.
How the Logic Works
1. Data Collection and Time Tracking The script constantly monitors the "History" of the market to identify when a new day begins. It keeps track of the previous day's highest price, lowest price, and final closing price. It is specifically designed to handle the nuances of the trading calendar, including the transition between Sunday and Monday.
2. Pivot Point Calculations Once the script identifies a new day, it performs a series of mathematical calculations to generate different levels:
- The Pivot Point: This is the central "balance" price calculated by averaging the previous high, low, and close.
- Resistance Levels (H1 through H5): The script calculates five specific heights above the pivot point. Each level (H1, H2, H3, H4, and H5) represents a different degree of resistance.
- Lower numbers (like H1) are closer to the current price action.
- Higher numbers (like H5) represent more extreme price targets or boundaries.
3. Visual Representation The script handles all the "heavy lifting" of drawing on your chart:
- Automatic Lines: It draws six distinct lines automatically so you don't have to plot them manually.
- Dynamic Labeling: To make the chart easy to read, the script places text labels (e.g., "Pivot", "H1", "H2") next to the lines. These labels move automatically as new price data arrives, ensuring they stay aligned with the correct price levels.
User Constraints & Experience
- Timeframe Compatibility: For the best accuracy and to ensure the math aligns correctly with daily cycles, the script is designed to work on charts that are 4 hours or shorter. If a user tries to view this on a Daily or Weekly chart, the script will provide an alert notification.
- Visual Clarity: The script uses specific colors (Green for resistance levels and Yellow for the Pivot) and customizable font sizes to ensure that the technical data remains clear and does not clutter the visual workspace.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| 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 Yellow
#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];
//--- Draw Pivot lines on chart
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