cam_L2_L5_Historical_001

Author: Copyright � 2005, MetaQuotes Software Corp.
cam_L2_L5_Historical_001

This script is designed for the MetaTrader 4 platform to provide traders with visual price levels known as Camarilla Pivots. These levels are technical analysis tools used to identify potential support and resistance areas based on historical price action from the previous trading day.

Core Functionality

The primary purpose of this tool is to automatically calculate and plot four specific pivot lines (L2, L3, L4, and L5) on your chart. By analyzing the High, Low, and Close prices of the preceding day, the script projects these levels forward onto the current trading session. This helps traders visualize "pivot points" where price might react, stall, or reverse.

How the Logic Works

The script follows a specific set of logical steps to ensure the data is displayed accurately:

  • Timeframe Validation: To maintain accuracy, the script includes a safety check. It will only function on charts with a timeframe of 4 hours or less. If you try to run it on a daily or weekly chart, it will provide an alert notification, as the pivot logic is intended for intraday analysis.
  • Historical Data Processing: The script scans through historical price data to identify where one day ends and another begins. It specifically handles the transition between days to ensure that the "Previous High," "Previous Low," and "Previous Close" are captured correctly.
  • Smart Date Handling: It includes a specific logic fix for the weekend. Since markets often close on Saturdays and Sundays, the script ensures that the pivots remain consistent when transitioning from Friday to Monday, preventing errors in the calculation sequence.
  • The Calculation Engine: Once it identifies the previous day's data, it applies specific mathematical multipliers (D2, D3, and D4) to the difference between that day's high and low. It then subtracts these values from the previous closing price to generate the L2, L3, L4, and L5 levels.
  • Dynamic Visualization:
    • Lines: The script draws four distinct red lines on the chart representing the calculated pivots.
    • Labels: To make the chart easy to read, it dynamically places text labels (L2 through L5) next to the lines. These labels move with the price action to ensure you always know which line corresponds to which level.

Summary for the User

Essentially, this script takes the "memory" of yesterday's trading range and translates it into visible boundaries for today's trade. It automates the heavy math required to find Camarilla levels, allowing you to see potential turning points at a glance without having to calculate them manually or switch between different timeframes.

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
13 Views
0 Downloads
0 Favorites
cam_L2_L5_Historical_001
//+------------------------------------------------------------------+
//|                                      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=12;
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