cam_L2_L5_Historical_v1
Download scriptThis script is designed to automatically calculate and display specific historical price levels known as Camarilla Pivots directly on your trading chart. These pivots are technical analysis tools used by traders to identify potential support and resistance zones based on the previous day's price action.
Core Functionality
The primary role of this tool is to take the high, low, and closing prices from one trading day and use them to project four specific price levels (labeled as L2, L3, L4, and L5) for the current day. These lines help traders visualize where the market might react or reverse.
How the Logic Works
- Time Management: The script monitors the passage of time to distinguish between different trading days. It accounts for various time zones (via a GMT shift setting) and ensures that the calculations remain accurate even during transitions, such as moving from Sunday to Monday.
- Price Data Collection: To generate the pivots, the logic "looks back" at the completed trading day. It captures the highest price reached (High), the lowest price reached (Low), and the final price of the day (Close).
- Mathematical Calculations: Once the previous day's data is collected, the script applies specific mathematical formulas to generate the four lines:
- L2, L3, and L4: These are calculated by taking a percentage of the difference between the previous day's high and low, then subtracting that value from the previous close. Each line represents a different "depth" of the price range.
- L5: This is calculated using a slightly different formula involving the ratio between the high and low prices relative to the closing price.
- Visual Representation: The script draws these levels as horizontal lines on your chart so you can see them clearly. Additionally, it places text labels next to the lines to identify which level is which (e.g., "L2", "L3").
User Constraints and Features
- Timeframe Restriction: For the data to remain accurate and relevant, the script includes a built-in safety check. It will notify you if you attempt to use it on a chart timeframe larger than 4 hours, as the daily pivot logic requires a more granular view of price movement.
- Dynamic Updating: The lines are not static; they update automatically as new price data becomes available, ensuring that the levels displayed always reflect the most recent completed trading day's behavior.
//+------------------------------------------------------------------+
//| cam_L2_L5_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 4
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Red
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
//---- input parameters
extern int GMTshift=0;
extern color LColor = Red;
extern int fontsize=10;
extern int LabelShift=20;
double L2Buffer[];
double L3Buffer[];
double L4Buffer[];
double L5Buffer[];
double L2, L3, L4, L5;
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(4);
//---- indicators
SetIndexStyle(0,DRAW_LINE, 0,2,Red);
SetIndexBuffer(0,L2Buffer);
SetIndexStyle(1,DRAW_LINE, 0,2,Red);
SetIndexBuffer(1,L3Buffer);
SetIndexStyle(2,DRAW_LINE, 0,2,Red);
SetIndexBuffer(2,L4Buffer);
SetIndexStyle(3,DRAW_LINE, 0, 2, Red);
SetIndexBuffer(3,L5Buffer);
SetIndexLabel(0,"L2");
SetIndexLabel(1,"L3");
SetIndexLabel(2,"L4");
SetIndexLabel(3,"L5");
//----
// IndicatorShortName("Cam Pivots");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
ObjectDelete("SupL3");
ObjectDelete("SupL2");
ObjectDelete("SupL4");
ObjectDelete("SupL5");
//----
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];
//L1 = prev_close - ((prev_high - prev_low)*(D1));
L2 = prev_close - ((prev_high - prev_low)*(D2));
L3 = prev_close - ((prev_high - prev_low)*(D3));
L4 = prev_close - ((prev_high - prev_low)*(D4));
L5 = prev_close - ((prev_high/prev_low)*prev_close - 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
L2Buffer[cnt]=L2;
L3Buffer[cnt]=L3;
L4Buffer[cnt]=L4;
L5Buffer[cnt]=L5;
}
if (cur_day == TimeDay(CurTime())) DisplayLabels();
//----
return(0);
}
void DisplayLabels()
{
if(ObjectFind("SupL2") != 0)
{
ObjectCreate("SupL2", OBJ_TEXT, 0, 0, 0);
ObjectSetText("SupL2", " L 2",fontsize,"Arial",LColor);
}
else
{
ObjectMove("SupL2", 0, Time[20],L2);
}
if(ObjectFind("SupL3") != 0)
{
ObjectCreate("SupL3", OBJ_TEXT, 0, 0, 0);
ObjectSetText("SupL3", " L 3",fontsize,"Arial",LColor);
}
else
{
ObjectMove("SupL3", 0, Time[20],L3);
}
if(ObjectFind("SupL4") != 0)
{
ObjectCreate("SupL4", OBJ_TEXT, 0, 0, 0);
ObjectSetText("SupL4", " L 4",fontsize,"Arial",LColor);
}
else
{
ObjectMove("SupL4", 0, Time[20],L4);
}
if(ObjectFind("SupL5") != 0)
{
ObjectCreate("SupL5", OBJ_TEXT, 0, 0, 0);
ObjectSetText("SupL5", " L 5",fontsize,"Arial",LColor);
}
else
{
ObjectMove("SupL5", 0, Time[20],L5);
}
}
//+------------------------------------------------------------------+
Comments