PIVOTS cja
Download scriptThis tool is designed to automatically calculate and display key price levels, known as Pivot Points, directly on your trading chart. It serves as a visual guide for traders who want to identify potential support and resistance zones based on historical price action.
Core Logic Overview
The script functions by analyzing the price data from the previous daily session (specifically looking at the high, low, and closing prices of the 24-hour period). Using these three data points, it performs a series of mathematical calculations to project several different levels for the current trading day.
Key Features and Components
1. Standard Pivot Levels The tool calculates a central "Pivot" point, which acts as the equilibrium for the market. From this center, it projects:
- Resistance Levels (R1, R2, R3): These indicate price areas where the market may face selling pressure or struggle to move higher.
- Support Levels (S1, S2, S3): These indicate price areas where the market may find a "floor" and experience buying interest.
2. Mid-Point Calculations (M0 - M5) In addition to the primary levels, the script calculates several intermediate "Mid-Points." These are derived by finding the averages between the main Pivot, Support, and Resistance lines. These extra markers help traders identify more granular transition zones within the larger price movements.
3. Daily High and Low Tracking With an optional setting enabled, the tool can also project horizontal lines marking the exact high and low prices reached during the previous day's trading session. This allows you to see how the current price relates to yesterday's boundaries.
Visual Behavior
- Dynamic Labeling: The script automatically places text labels on the chart (e.g., "R1", "S2", "M3") so you can instantly identify what each line represents without confusion.
- Historical Projection: The tool creates horizontal lines that extend backward over a specific number of bars. This provides a clean look, showing only the relevant historical area rather than cluttering the entire chart with infinite lines.
- Customization: You can toggle different groups of lines (such as the Mid-Points or Daily High/Low) on or off, and you have full control over the colors, thicknesses, and styles of all lines to match your preferred trading layout.
Summary for the Trader
Instead of manually calculating complex formulas to find where the market might turn, this script does the heavy lifting for you. It takes yesterday's data and instantly draws a map of potential "battlegrounds" (Support and Resistance) for today’s session, allowing you to spot entries and exits more clearly.
//+------------------------------------------------------------------+
//| PIVOTS.mq4 |
//| Copyright © 2006, cjatradingtools.com|
//+------------------------------------------------------------------+
#property copyright " By cja - http://cjatradingtools.com/"
#property indicator_chart_window
extern bool Show_PivotLines = true;
extern bool Show_M_PivotLines = true;
extern int Shift_Lines_START = -20;
extern int Shift_Lines_END = -100;
extern int SHIFT_PivotPointText = -30;
extern int SHIFT_M_PivotText = -30;
extern color PivotLabel_Col = DimGray;
extern color CentralPivot_Color = DarkSlateGray;
extern int CentralPivot_width = 2;
extern int Pivots_width = 1;
extern int Pivots_style= 0;
extern color MainLabel_Col= DimGray;
extern color R3_Color = DarkSlateGray;
extern color R2_Color = DarkSlateGray;
extern color R1_Color = DarkSlateGray;
extern color S1_Color = DarkSlateGray;
extern color S2_Color = DarkSlateGray;
extern color S3_Color = DarkSlateGray;
extern int MPivots_width = 1;
extern int MPivots_style= 2;
extern color MLabel_Col = DimGray;
extern color M5_Color = DarkSlateGray;
extern color M4_Color = DarkSlateGray;
extern color M3_Color = DarkSlateGray;
extern color M2_Color = DarkSlateGray;
extern color M1_Color = DarkSlateGray;
extern color M0_Color = DarkSlateGray;
extern string txt = "----edit text here---";
extern string S1txt = "S1 ";
extern string S2txt = "S2 ";
extern string S3txt = "S3 ";
extern string Ptxt = "Pivot ";
extern string R1txt = "R1 ";
extern string R2txt = "R1 ";
extern string R3txt = "R1 ";
extern bool Show_Daily_HILOW = false;
#define PP1 "PP1"
#define RR3 "RR3"
#define RR2 "RR2"
#define RR1 "RR1"
#define SS1 "SS1"
#define SS2 "SS2"
#define SS3 "SS3"
#define MM1 "MM1"
#define MM2 "MM2"
#define MM3 "MM3"
#define MM4 "MM4"
#define MM5 "MM5"
#define MM0 "MM0"
#define HI "DailyHI"
#define LO "DailyLO"
double x;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorShortName("PIVOTS");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
ObjectDelete(PP1);ObjectDelete(RR3); ObjectDelete(RR3);ObjectDelete(RR2); ObjectDelete(RR1);ObjectDelete(SS1);
ObjectDelete(SS2);ObjectDelete(SS3);ObjectDelete(MM1);ObjectDelete(MM2);ObjectDelete(MM3);ObjectDelete(MM4);
ObjectDelete(MM5); ObjectDelete(MM0);
ObjectDelete(HI);ObjectDelete(LO);
ObjectDelete("P");ObjectDelete("R3"); ObjectDelete("R2"); ObjectDelete("R1");ObjectDelete("S1");
ObjectDelete("S2");ObjectDelete("S3");ObjectDelete("M1");ObjectDelete("M2");ObjectDelete("M3");ObjectDelete("M4");
ObjectDelete("M5"); ObjectDelete("M0");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars= IndicatorCounted();
x = Period();
if(x > 240) return(-1);
//----
CreatePVT();
}
void CreatePivot(string Pivot, double start, double end,double w, double s,color clr)
{
ObjectCreate(Pivot, OBJ_TREND, 0, CustomTime(Shift_Lines_END), start, CustomTime(Shift_Lines_START), end);
ObjectSet(Pivot, OBJPROP_COLOR, clr);
ObjectSet(Pivot,OBJPROP_RAY,false);
ObjectSet(Pivot,OBJPROP_WIDTH,w);
ObjectSet(Pivot,OBJPROP_STYLE,s);
}
void DeletePivot()
{
ObjectDelete(PP1); ObjectDelete(RR3); ObjectDelete(RR2); ObjectDelete(RR1); ObjectDelete(SS1); ObjectDelete(SS2);
ObjectDelete(SS3);
ObjectDelete(MM1); ObjectDelete(MM2); ObjectDelete(MM3); ObjectDelete(MM4); ObjectDelete(MM5); ObjectDelete(MM0);
ObjectDelete(HI);ObjectDelete(LO);
}
void CreatePVT()
{
DeletePivot();
double P = (iHigh(NULL,1440,1) + iLow(NULL,1440,1) + iClose(NULL,1440,1)) / 3;
double rr3 = ( 2 * P ) + ( iHigh(NULL,1440,1) - ( 2 * iLow(NULL,1440,1) ));
double rr2 = P + ( iHigh(NULL,1440,1) - iLow(NULL,1440,1) );
double rr1 = ( 2 * P ) - iLow(NULL,1440,1);
double ss1 = ( 2 * P ) - iHigh(NULL,1440,1);
double ss2 = P - ( iHigh(NULL,1440,1)- iLow(NULL,1440,1));
double ss3 = ( 2 * P ) - ( ( 2 * iHigh(NULL,1440,1) ) - iLow(NULL,1440,1) );
double mm0 = (ss2 + ss3)/2;
double mm1 = (ss1 + ss2)/2;
double mm2 = (P + ss1)/2;
double mm3 = (P + rr1)/2;
double mm4 = (rr1 + rr2)/2;
double mm5 = (rr2 + rr3)/2;
double D_HI=iHigh(NULL,1440,1);
double D_LO=iLow(NULL,1440,1);
{
if (Show_PivotLines==true)
{
ObjectDelete("P");
if(ObjectFind("P") != 0){
ObjectCreate("P", OBJ_TEXT, 0, CustomTime(SHIFT_PivotPointText), P);
ObjectSetText("P", Ptxt+DoubleToStr(P,Digits)+"", 8, "Arial", PivotLabel_Col);
}else{ObjectMove("P", 0, CustomTime(SHIFT_PivotPointText), P);}
ObjectDelete("S3");
if(ObjectFind("S3") != 0){
ObjectCreate("S3", OBJ_TEXT, 0, CustomTime(SHIFT_PivotPointText), ss3);
ObjectSetText("S3", S3txt+DoubleToStr(ss3,Digits)+"", 8, "Arial", MainLabel_Col);
}else{ObjectMove("S3", 0, CustomTime(SHIFT_PivotPointText), ss3);}
ObjectDelete("S2");
if(ObjectFind("S2") != 0){
ObjectCreate("S2", OBJ_TEXT, 0, CustomTime(SHIFT_PivotPointText), ss2);
ObjectSetText("S2", S2txt+DoubleToStr(ss2,Digits)+"", 8, "Arial", MainLabel_Col);
}else{ObjectMove("S2", 0, CustomTime(SHIFT_PivotPointText), ss2);}
ObjectDelete("S1");
if(ObjectFind("S1") != 0){
ObjectCreate("S1", OBJ_TEXT, 0, CustomTime(SHIFT_PivotPointText), ss1);
ObjectSetText("S1", S1txt+DoubleToStr(ss1,Digits)+"", 8, "Arial", MainLabel_Col);
}else{ObjectMove("S1", 0, CustomTime(SHIFT_PivotPointText), ss1);}
ObjectDelete("R1");
if(ObjectFind("R1") != 0){
ObjectCreate("R1", OBJ_TEXT, 0, CustomTime(SHIFT_PivotPointText), rr1);
ObjectSetText("R1", R1txt+DoubleToStr(rr1,Digits)+"", 8, "Arial", MainLabel_Col);
}else{ObjectMove("R1", 0, CustomTime(SHIFT_PivotPointText), rr1);}
ObjectDelete("R2");
if(ObjectFind("R2") != 0){
ObjectCreate("R2", OBJ_TEXT, 0, CustomTime(SHIFT_PivotPointText), rr2);
ObjectSetText("R2", R2txt+DoubleToStr(rr2,Digits)+"", 8, "Arial", MainLabel_Col);
}else{ObjectMove("R2", 0, CustomTime(SHIFT_PivotPointText), rr2);}
ObjectDelete("R3");
if(ObjectFind("R3") != 0){
ObjectCreate("R3", OBJ_TEXT, 0, CustomTime(SHIFT_PivotPointText), rr3);
ObjectSetText("R3", R3txt+DoubleToStr(rr3,Digits)+"", 8, "Arial", MainLabel_Col);
}else{ObjectMove("R3", 0, CustomTime(SHIFT_PivotPointText), rr3);}
}
if (Show_M_PivotLines==true)
{
ObjectDelete("M5");
if(ObjectFind("M5") != 0){
ObjectCreate("M5", OBJ_TEXT, 0, CustomTime(SHIFT_M_PivotText), mm5);
ObjectSetText("M5", "M5 "+DoubleToStr(mm5,Digits)+"", 8, "Arial", MLabel_Col);
}else{ObjectMove("M5", 0, CustomTime(SHIFT_M_PivotText), mm5);}
ObjectDelete("M4");
if(ObjectFind("M4") != 0){
ObjectCreate("M4", OBJ_TEXT, 0, CustomTime(SHIFT_M_PivotText), mm4);
ObjectSetText("M4", "M4 "+DoubleToStr(mm4,Digits)+"", 8, "Arial", MLabel_Col);
}else{ObjectMove("M4", 0, CustomTime(SHIFT_M_PivotText), mm4);}
ObjectDelete("M3");
if(ObjectFind("M3") != 0){
ObjectCreate("M3", OBJ_TEXT, 0, CustomTime(SHIFT_M_PivotText), mm3);
ObjectSetText("M3", "M3 "+DoubleToStr(mm3,Digits)+"", 8, "Arial", MLabel_Col);
}else{ObjectMove("M3", 0, CustomTime(SHIFT_M_PivotText), mm3);}
ObjectDelete("M2");
if(ObjectFind("M2") != 0){
ObjectCreate("M2", OBJ_TEXT, 0, CustomTime(SHIFT_M_PivotText), mm2);
ObjectSetText("M2", "M2 "+DoubleToStr(mm2,Digits)+"", 8, "Arial", MLabel_Col);
}else{ObjectMove("M2", 0, CustomTime(SHIFT_M_PivotText), mm2);}
ObjectDelete("M1");
if(ObjectFind("M1") != 0){
ObjectCreate("M1", OBJ_TEXT, 0, CustomTime(SHIFT_M_PivotText), mm1);
ObjectSetText("M1", "M1 "+DoubleToStr(mm1,Digits)+"", 8, "Arial", MLabel_Col);
}else{ObjectMove("M1", 0, CustomTime(SHIFT_M_PivotText), mm1);}
ObjectDelete("M0");
if(ObjectFind("M0") != 0){
ObjectCreate("M0", OBJ_TEXT, 0, CustomTime(SHIFT_M_PivotText), mm0);
ObjectSetText("M0", "M0 "+DoubleToStr(mm0,Digits)+"", 8, "Arial", MLabel_Col);
}else{ObjectMove("M0", 0, CustomTime(SHIFT_M_PivotText), mm0);}
}
if(Show_Daily_HILOW==true){
CreatePivot(HI,D_HI,D_HI,1,2, Lime);
CreatePivot(LO,D_LO,D_LO,1,2, Red);}
CreatePivot(PP1,P,P,CentralPivot_width,0,CentralPivot_Color);
CreatePivot(RR3,rr3,rr3,Pivots_width,Pivots_style, R3_Color );
CreatePivot(RR2,rr2,rr2,Pivots_width,Pivots_style, R2_Color );
CreatePivot(RR1,rr1,rr1,Pivots_width,Pivots_style, R1_Color );
CreatePivot(SS1,ss1,ss1,Pivots_width,Pivots_style, S1_Color);
CreatePivot(SS2,ss2,ss2,Pivots_width,Pivots_style, S2_Color);
CreatePivot(SS3,ss3,ss3,Pivots_width,Pivots_style, S3_Color);
}
if (Show_M_PivotLines==true)
{
CreatePivot(MM1,mm1,mm1,MPivots_width,MPivots_style, M1_Color);
CreatePivot(MM2,mm2,mm2,MPivots_width,MPivots_style, M2_Color);
CreatePivot(MM3,mm3,mm3,MPivots_width,MPivots_style, M3_Color);
CreatePivot(MM4,mm4,mm4,MPivots_width,MPivots_style, M4_Color);
CreatePivot(MM5,mm5,mm5,MPivots_width,MPivots_style, M5_Color);
CreatePivot(MM0,mm0,mm0,MPivots_width,MPivots_style, M0_Color);
}
//----
return(0);
}
int CustomTime(int a)
{
if(a<0)
return(Time[0]+Period()*60*MathAbs(a));
else return(Time[a]);
}
//+------------------------------------------------------------------+
Comments