pivot_###Auto Pivot_M
Download scriptThe AutoPivotIndicator is a sophisticated charting tool designed to automatically identify and display key psychological price levels—known as Pivot Points—across different timeframes on your trading platform. Instead of requiring you to calculate complex mathematical formulas manually, this script handles the data processing in the background and draws clear, visible lines directly onto your chart.
Core Functionality
The script calculates "Pivot" points, which represent the central balance of price for a specific period. From these center points, it derives several key Support (S) and Resistance (R) levels:
- Support Levels (S1, S2, S3): These represent potential "floor" areas where buying pressure might increase, potentially stopping a downward price trend.
- Resistance Levels (R1, R2, R3): These represent potential "ceiling" areas where selling pressure might increase, potentially stalling an upward price trend.
Multi-Timeframe Analysis
One of the primary strengths of this tool is its ability to overlay data from three distinct timeframes simultaneously, allowing for a comprehensive view of market structure:
- Daily Pivots: Based on the previous day's price action (High, Low, and Close). It identifies the immediate turning points for the current trading day.
- Weekly Pivots: Based on the previous week's performance. These are broader levels that help traders understand the medium-term trend.
- Monthly Pivots: Based on the previous month's data. These represent significant long-term milestones and major structural boundaries in the market.
Intelligent Data Handling
The logic includes a specific correction for weekend trading (the "Sunday Bar problem"). If you choose to exclude Sunday's data, the script is smart enough to look back further into the previous week's history to ensure your daily pivot calculations remain accurate and consistent with standard market behavior.
Customization and Visual Clarity
The script is designed with high visual customization in mind, providing a tailored experience for the user:
- Toggleable Visibility: You can choose exactly which timeframes you want to see. For example, you might prefer to see Daily and Weekly pivots while hiding Monthly data to keep your chart clean.
- Level Customization: You have the option to display only the main Pivot line or include the full suite of Support and Resistance levels (S1-S3 and R1-R3) depending on your trading style.
- Color Coding: Each timeframe has its own unique color profile (e.g., Red/Magenta for Daily, Blue/Peru for Weekly, etc.), making it easy to distinguish between different types of market data at a glance.
- Dynamic Labels: The script automatically places text labels on the chart (such as "Daily R1" or "Monthly Pivot"), ensuring that you always know exactly what price level you are looking at without having to guess based on color alone.
Summary for the Trader
By using this indicator, you eliminate the manual labor of calculating price levels. It provides a "roadmap" of the market, highlighting where historical price action suggests the market might face friction. Whether you are a day trader focusing on daily swings or a swing trader looking at monthly trends, this tool automates the identification of these critical zones to help you make more informed decisions.
//+------------------------------------------------------------------+
//| AutoPivotIndicator.mq4 ver 4.02 by Habeeb |
//| |
//| This version solves the Sunday Bar problem. |
//| Ver4 calculated daily pivots incorrectly when Use_Sunday_Data |
//| was set to "False". Fixed in this version. |
//+------------------------------------------------------------------+
//modexterncolors
#property indicator_chart_window
extern bool Use_Sunday_Data = True;
extern bool Daily = True;
extern bool Daily_SR_Levels = True;
extern bool Weekly = True;
extern bool Weekly_SR_Levels = False;
extern bool Monthly = True;
extern bool Monthly_SR_Levels = False;
extern string ____="PivotColors";
extern color R3_LineColor=Red;
extern color R2_LineColor=Red;
extern color R1_LineColor=Red;
extern color PivotLineColor=Magenta;
extern color S1_LineColor=Green;
extern color S2_LineColor=Green;
extern color S3_LineColor=Green;
extern string ___="WeeklyPivotColors";
extern color WR3_LineColor=Peru;
extern color WR2_LineColor=Peru;
extern color WR1_LineColor=Peru;
extern color WPivotLineColor=DodgerBlue;
extern color WS1_LineColor=SteelBlue;
extern color WS2_LineColor=SteelBlue;
extern color WS3_LineColor=SteelBlue;
extern string __="MonthlyPivotColors";
extern color MR3_LineColor=Maroon;
extern color MR2_LineColor=Maroon;
extern color MR1_LineColor=Maroon;
extern color MPivotLineColor=BlueViolet;
extern color MS1_LineColor=Blue;
extern color MS2_LineColor=Blue;
extern color MS3_LineColor=Blue;
double YesterdayHigh;
double YesterdayLow;
double YesterdayClose;
double Day_Price[][6];
double Pivot,S1,S2,S3,R1,R2,R3;
double WeekHigh;
double WeekLow;
double WeekClose;
double Weekly_Price[][6];
double WeekPivot,WS1,WS2,WS3,WR1,WR2,WR3;
double MonthHigh;
double MonthLow;
double MonthClose;
double Month_Price[][6];
double MonthPivot,MS1,MS2,MS3,MR1,MR2,MR3;
int init()
{
return(0);
}
//--------------------------------------------------------
int deinit()
{
ObjectDelete("PivotLine");
ObjectDelete("R1_Line");
ObjectDelete("R2_Line");
ObjectDelete("R3_Line");
ObjectDelete("S1_Line");
ObjectDelete("S2_Line");
ObjectDelete("S3_Line");
//--------------------------------
ObjectDelete("PivotLabel");
ObjectDelete("R1_Label");
ObjectDelete("R2_Label");
ObjectDelete("R3_Label");
ObjectDelete("S1_Label");
ObjectDelete("S2_Label");
ObjectDelete("S3_Label");
//--------------------------------------------------------
ObjectDelete("WeekPivotLine");
ObjectDelete("WR1_Line");
ObjectDelete("WR2_Line");
ObjectDelete("WR3_Line");
ObjectDelete("WS1_Line");
ObjectDelete("WS2_Line");
ObjectDelete("WS3_Line");
//--------------------------------
ObjectDelete("WeekPivotLabel");
ObjectDelete("WR1_Label");
ObjectDelete("WR2_Label");
ObjectDelete("WR3_Label");
ObjectDelete("WS1_Label");
ObjectDelete("WS2_Label");
ObjectDelete("WS3_Label");
//--------------------------------------------------------
ObjectDelete("MonthPivotLine");
ObjectDelete("MR1_Line");
ObjectDelete("MR2_Line");
ObjectDelete("MR3_Line");
ObjectDelete("MS1_Line");
ObjectDelete("MS2_Line");
ObjectDelete("MS3_Line");
//--------------------------------
ObjectDelete("MonthPivotLabel");
ObjectDelete("MR1_Label");
ObjectDelete("MR2_Label");
ObjectDelete("MR3_Label");
ObjectDelete("MS1_Label");
ObjectDelete("MS2_Label");
ObjectDelete("MS3_Label");
return(0);
}
//---------------------------------------------------------
int start()
{
ArrayCopyRates(Day_Price,(Symbol()), 1440);
YesterdayHigh = Day_Price[1][3];
YesterdayLow = Day_Price[1][2];
YesterdayClose = Day_Price[1][4];
Pivot = ((YesterdayHigh + YesterdayLow + YesterdayClose)/3);
R1 = (2*Pivot)-YesterdayLow;
S1 = (2*Pivot)-YesterdayHigh;
R2 = Pivot+(R1-S1);
S2 = Pivot-(R1-S1);
R3 = (YesterdayHigh + (2*(Pivot-YesterdayLow)));
S3 = (YesterdayLow - (2*(YesterdayHigh-Pivot)));
if (Use_Sunday_Data == false)
{
while (DayOfWeek() == 1)
{
YesterdayHigh = Day_Price[2][3];
YesterdayLow = Day_Price[2][2];
YesterdayClose = Day_Price[2][4];
Pivot = ((YesterdayHigh + YesterdayLow + YesterdayClose)/3);
R1 = (2*Pivot)-YesterdayLow;
S1 = (2*Pivot)-YesterdayHigh;
R2 = Pivot+(R1-S1);
S2 = Pivot-(R1-S1);
R3 = (YesterdayHigh + (2*(Pivot-YesterdayLow)));
S3 = (YesterdayLow - (2*(YesterdayHigh-Pivot)));
break;
}
}
//--------------------------------------------------------
//--------------------------------------------------------
ArrayCopyRates(Weekly_Price, Symbol(), 10080);
WeekHigh = Weekly_Price[1][3];
WeekLow = Weekly_Price[1][2];
WeekClose = Weekly_Price[1][4];
WeekPivot = ((WeekHigh + WeekLow + WeekClose)/3);
WR1 = (2*WeekPivot)-WeekLow;
WS1 = (2*WeekPivot)-WeekHigh;
WR2 = WeekPivot+(WR1-WS1);
WS2 = WeekPivot-(WR1-WS1);
WS3 = (WeekLow - (2*(WeekHigh-WeekPivot)));
WR3 = (WeekHigh + (2*(WeekPivot-WeekLow)));
//--------------------------------------------------------
//--------------------------------------------------------
ArrayCopyRates(Month_Price, Symbol(), 43200);
MonthHigh = Month_Price[1][3];
MonthLow = Month_Price[1][2];
MonthClose = Month_Price[1][4];
MonthPivot = ((MonthHigh + MonthLow + MonthClose)/3);
MR1 = (2*MonthPivot)-MonthLow;
MS1 = (2*MonthPivot)-MonthHigh;
MR2 = MonthPivot+(MR1-MS1);
MS2 = MonthPivot-(MR1-MS1);
MS3 = (MonthLow - (2*(MonthHigh-MonthPivot)));
MR3 = (MonthHigh + (2*(MonthPivot-MonthLow)));
//--------------------------------------------------------
if (Daily==true)
{
TimeToStr(CurTime());
ObjectCreate("PivotLine", OBJ_HLINE,0, CurTime(),Pivot);
ObjectSet("PivotLine", OBJPROP_COLOR, PivotLineColor);
ObjectSet("PivotLine", OBJPROP_STYLE, STYLE_DASH);
if(ObjectFind("PivotLabel") != 0)
{
ObjectCreate("PivotLabel", OBJ_TEXT, 0, Time[20], Pivot);
ObjectSetText("PivotLabel", ("Daily Pivot"), 12, "Arial", PivotLineColor);
}
else
{
ObjectMove("PivotLabel", 0, Time[20], Pivot);
}
ObjectsRedraw();
//--------------------------------------------------------
if (Daily_SR_Levels==true)
{
ObjectCreate("R1_Line", OBJ_HLINE,0, CurTime(),R1);
ObjectSet("R1_Line", OBJPROP_COLOR, R1_LineColor);
ObjectSet("R1_Line", OBJPROP_STYLE, STYLE_DASH);
if(ObjectFind("R1_Label") != 0)
{
ObjectCreate("R1_Label", OBJ_TEXT, 0, Time[20], R1);
ObjectSetText("R1_Label", "Daily R1", 12, "Arial", R1_LineColor);
}
else
{
ObjectMove("R1_Label", 0, Time[20], R1);
}
//--------------------------------------------------------
ObjectCreate("R2_Line", OBJ_HLINE,0, CurTime(),R2);
ObjectSet("R2_Line", OBJPROP_COLOR, R2_LineColor);
ObjectSet("R2_Line", OBJPROP_STYLE, STYLE_DASH);
if(ObjectFind("R2_Label") != 0)
{
ObjectCreate("R2_Label", OBJ_TEXT, 0, Time[20], R2);
ObjectSetText("R2_Label", "Daily R2", 12, "Arial", R2_LineColor);
}
else
{
ObjectMove("R2_Label", 0, Time[20], R2);
}
//---------------------------------------------------------
ObjectCreate("R3_Line", OBJ_HLINE,0, CurTime(),R3);
ObjectSet("R3_Line", OBJPROP_COLOR, R3_LineColor);
ObjectSet("R3_Line", OBJPROP_STYLE, STYLE_DASH);
if(ObjectFind("R3_Label") != 0)
{
ObjectCreate("R3_Label", OBJ_TEXT, 0, Time[20], R3);
ObjectSetText("R3_Label", "Daily R3", 12, "Arial", R3_LineColor);
}
else
{
ObjectMove("R3_Label", 0, Time[20], R3);
}
//---------------------------------------------------------
ObjectCreate("S1_Line", OBJ_HLINE,0, CurTime(),S1);
ObjectSet("S1_Line", OBJPROP_COLOR, S1_LineColor);
ObjectSet("S1_Line", OBJPROP_STYLE, STYLE_DASH);
if(ObjectFind("S1_Label") != 0)
{
ObjectCreate("S1_Label", OBJ_TEXT, 0, Time[20], S1);
ObjectSetText("S1_Label", "Daily S1", 12, "Arial", S1_LineColor);
}
else
{
ObjectMove("S1_Label", 0, Time[20], S1);
}
//---------------------------------------------------------
ObjectCreate("S2_Line", OBJ_HLINE,0, CurTime(),S2);
ObjectSet("S2_Line", OBJPROP_COLOR, S2_LineColor);
ObjectSet("S2_Line", OBJPROP_STYLE, STYLE_DASH);
if(ObjectFind("S2_Label") != 0)
{
ObjectCreate("S2_Label", OBJ_TEXT, 0, Time[20], S2);
ObjectSetText("S2_Label", "Daily S2", 12, "Arial", S2_LineColor);
}
else
{
ObjectMove("S2_Label", 0, Time[20], S2);
}
//---------------------------------------------------------
ObjectCreate("S3_Line", OBJ_HLINE,0, CurTime(),S3);
ObjectSet("S3_Line", OBJPROP_COLOR, S3_LineColor);
ObjectSet("S3_Line", OBJPROP_STYLE, STYLE_DASH);
if(ObjectFind("S3_Label") != 0)
{
ObjectCreate("S3_Label", OBJ_TEXT, 0, Time[20], S3);
ObjectSetText("S3_Label", "Daily S3", 12, "Arial", S3_LineColor);
}
else
{
ObjectMove("S3_Label", 0, Time[20], S3);
}
}
ObjectsRedraw();
}
//---------------------------------------------------------
//---------------------------------------------------------
//---------------------------------------------------------
if (Weekly==true)
{
ObjectCreate("WeekPivotLine", OBJ_HLINE,0, CurTime(),WeekPivot);
ObjectSet("WeekPivotLine", OBJPROP_COLOR, WPivotLineColor);
ObjectSet("WeekPivotLine", OBJPROP_STYLE, STYLE_DASHDOT);
if(ObjectFind("WeekPivotLabel") != 0)
{
ObjectCreate("WeekPivotLabel", OBJ_TEXT, 0, Time[40], WeekPivot);
ObjectSetText("WeekPivotLabel", "WeeklyPivot", 12, "Arial", WPivotLineColor);
}
else
{
ObjectMove("WeekPivotLabel", 0, Time[40], WeekPivot);
}
//--------------------------------------------------------
if (Weekly_SR_Levels==true)
{
ObjectCreate("WR1_Line", OBJ_HLINE,0, CurTime(),WR1);
ObjectSet("WR1_Line", OBJPROP_COLOR, WR1_LineColor);
ObjectSet("WR1_Line", OBJPROP_STYLE, STYLE_DASHDOT);
if(ObjectFind("WR1_Label") != 0)
{
ObjectCreate("WR1_Label", OBJ_TEXT, 0, Time[40], WR1);
ObjectSetText("WR1_Label", " Weekly R1", 12, "Arial", WR1_LineColor);
}
else
{
ObjectMove("WR1_Label", 0, Time[40], WR1);
}
//--------------------------------------------------------
ObjectCreate("WR2_Line", OBJ_HLINE,0, CurTime(),WR2);
ObjectSet("WR2_Line", OBJPROP_COLOR, WR2_LineColor);
ObjectSet("WR2_Line", OBJPROP_STYLE, STYLE_DASHDOT);
if(ObjectFind("WR2_Label") != 0)
{
ObjectCreate("WR2_Label", OBJ_TEXT, 0, Time[40], WR2);
ObjectSetText("WR2_Label", " Weekly R2", 12, "Arial", WR2_LineColor);
}
else
{
ObjectMove("WR2_Label", 0, Time[40], WR2);
}
//---------------------------------------------------------
ObjectCreate("WR3_Line", OBJ_HLINE,0, CurTime(),WR3);
ObjectSet("WR3_Line", OBJPROP_COLOR, WR3_LineColor);
ObjectSet("WR3_Line", OBJPROP_STYLE, STYLE_DASHDOT);
if(ObjectFind("WR3_Label") != 0)
{
ObjectCreate("WR3_Label", OBJ_TEXT, 0, Time[40], WR3);
ObjectSetText("WR3_Label", " Weekly R3", 12, "Arial", WR3_LineColor);
}
else
{
ObjectMove("WR3_Label", 0, Time[40], WR3);
}
//---------------------------------------------------------
ObjectCreate("WS1_Line", OBJ_HLINE,0, CurTime(),WS1);
ObjectSet("WS1_Line", OBJPROP_COLOR, WS1_LineColor);
ObjectSet("WS1_Line", OBJPROP_STYLE, STYLE_DASHDOT);
if(ObjectFind("WS1_Label") != 0)
{
ObjectCreate("WS1_Label", OBJ_TEXT, 0, Time[40], WS1);
ObjectSetText("WS1_Label", "Weekly S1", 12, "Arial", WS1_LineColor);
}
else
{
ObjectMove("WS1_Label", 0, Time[40], WS1);
}
//---------------------------------------------------------
ObjectCreate("WS2_Line", OBJ_HLINE,0, CurTime(),WS2);
ObjectSet("WS2_Line", OBJPROP_COLOR, WS2_LineColor);
ObjectSet("WS2_Line", OBJPROP_STYLE, STYLE_DASHDOT);
if(ObjectFind("WS2_Label") != 0)
{
ObjectCreate("WS2_Label", OBJ_TEXT, 0, Time[40], WS2);
ObjectSetText("WS2_Label", "Weekly S2", 12, "Arial", WS2_LineColor);
}
else
{
ObjectMove("WS2_Label", 0, Time[40], WS2);
}
//---------------------------------------------------------
ObjectCreate("WS3_Line", OBJ_HLINE,0, CurTime(),WS3);
ObjectSet("WS3_Line", OBJPROP_COLOR, WS3_LineColor);
ObjectSet("WS3_Line", OBJPROP_STYLE, STYLE_DASHDOT);
if(ObjectFind("WS3_Label") != 0)
{
ObjectCreate("WS3_Label", OBJ_TEXT, 0, Time[40], WS3);
ObjectSetText("WS3_Label", "Weekly S3", 12, "Arial", WS3_LineColor);
}
else
{
ObjectMove("WS3_Label", 0, Time[40], WS3);
}
}
}
//---------------------------------------------------------
//---------------------------------------------------------
//---------------------------------------------------------
if (Monthly==true)
{
ObjectCreate("MonthPivotLine", OBJ_HLINE,0, CurTime(),MonthPivot);
ObjectSet("MonthPivotLine", OBJPROP_COLOR, MPivotLineColor);
ObjectSet("MonthPivotLine", OBJPROP_STYLE, STYLE_DASH);
if(ObjectFind("MonthPivotLabel") != 0)
{
ObjectCreate("MonthPivotLabel", OBJ_TEXT, 0, Time[60], MonthPivot);
ObjectSetText("MonthPivotLabel", "MonthlyPivot", 12, "Arial", MPivotLineColor);
}
else
{
ObjectMove("MonthPivotLabel", 0, Time[60], MonthPivot);
}
//--------------------------------------------------------
if (Monthly_SR_Levels==true)
{
ObjectCreate("MR1_Line", OBJ_HLINE,0, CurTime(),MR1);
ObjectSet("MR1_Line", OBJPROP_COLOR, MR1_LineColor);
ObjectSet("MR1_Line", OBJPROP_STYLE, STYLE_DASHDOTDOT);
if(ObjectFind("MR1_Label") != 0)
{
ObjectCreate("MR1_Label", OBJ_TEXT, 0, Time[60], MR1);
ObjectSetText("MR1_Label", " Monthly R1", 12, "Arial", MR1_LineColor);
}
else
{
ObjectMove("MR1_Label", 0, Time[60], MR1);
}
//--------------------------------------------------------
ObjectCreate("MR2_Line", OBJ_HLINE,0, CurTime(),MR2);
ObjectSet("MR2_Line", OBJPROP_COLOR, MR2_LineColor);
ObjectSet("MR2_Line", OBJPROP_STYLE, STYLE_DASHDOTDOT);
if(ObjectFind("MR2_Label") != 0)
{
ObjectCreate("MR2_Label", OBJ_TEXT, 0, Time[60], MR2);
ObjectSetText("MR2_Label", " Monthly R2", 12, "Arial", MR2_LineColor);
}
else
{
ObjectMove("MR2_Label", 0, Time[60], MR2);
}
//---------------------------------------------------------
ObjectCreate("MR3_Line", OBJ_HLINE,0, CurTime(),MR3);
ObjectSet("MR3_Line", OBJPROP_COLOR, MR3_LineColor);
ObjectSet("MR3_Line", OBJPROP_STYLE, STYLE_DASHDOTDOT);
if(ObjectFind("MR3_Label") != 0)
{
ObjectCreate("MR3_Label", OBJ_TEXT, 0, Time[60], MR3);
ObjectSetText("MR3_Label", " Monthly R3", 12, "Arial", MR3_LineColor);
}
else
{
ObjectMove("MR3_Label", 0, Time[60], MR3);
}
//---------------------------------------------------------
ObjectCreate("MS1_Line", OBJ_HLINE,0, CurTime(),MS1);
ObjectSet("MS1_Line", OBJPROP_COLOR, MS1_LineColor);
ObjectSet("MS1_Line", OBJPROP_STYLE, STYLE_DASHDOTDOT);
if(ObjectFind("MS1_Label") != 0)
{
ObjectCreate("MS1_Label", OBJ_TEXT, 0, Time[60], MS1);
ObjectSetText("MS1_Label", "Monthly S1", 12, "Arial", MS1_LineColor);
}
else
{
ObjectMove("MS1_Label", 0, Time[60], MS1);
}
//---------------------------------------------------------
ObjectCreate("MS2_Line", OBJ_HLINE,0, CurTime(),MS2);
ObjectSet("MS2_Line", OBJPROP_COLOR, MS2_LineColor);
ObjectSet("MS2_Line", OBJPROP_STYLE, STYLE_DASHDOTDOT);
if(ObjectFind("MS2_Label") != 0)
{
ObjectCreate("MS2_Label", OBJ_TEXT, 0, Time[60], MS2);
ObjectSetText("MS2_Label", "Monthly S2", 12, "Arial", MS2_LineColor);
}
else
{
ObjectMove("MS2_Label", 0, Time[60], MS2);
}
//---------------------------------------------------------
ObjectCreate("MS3_Line", OBJ_HLINE,0, CurTime(),MS3);
ObjectSet("MS3_Line", OBJPROP_COLOR, MS3_LineColor);
ObjectSet("MS3_Line", OBJPROP_STYLE, STYLE_DASHDOTDOT);
if(ObjectFind("MS3_Label") != 0)
{
ObjectCreate("MS3_Label", OBJ_TEXT, 0, Time[60], MS3);
ObjectSetText("MS3_Label", "Monthly S3", 12, "Arial", MS3_LineColor);
}
else
{
ObjectMove("MS3_Label", 0, Time[60], MS3);
}
}
}
//---------------------------------------------------------
ObjectsRedraw();
return(0);
}
Comments