Pivot_Support_Historical2
Download scriptThis script is designed for traders who use the MetaTrader platform to identify potential price "floors" or support levels based on historical daily price action. It automatically calculates and draws four specific support levels (labeled S1 through S4) directly onto your trading chart.
Core Functionality
The tool looks back at historical data—specifically the previous day's price movements—to calculate key technical pivot points. Instead of just showing you a single line, it provides a tiered range of support. These levels help traders visualize where price might encounter resistance to falling further or where it could potentially "bounce" upward.
How the Logic Works
To determine these levels, the script performs the following logic automatically:
- Data Collection: The script scans through previous daily candles to identify three critical pieces of information: the highest price reached (High), the lowest price reached (Low), and the final price at the end of the day (Close).
- Pivot Calculation: Using these three figures, it calculates a "Pivot Point," which is the mathematical average of the previous day's activity.
- Support Level Generation: From that central Pivot Point, the script applies specific formulas to project four distinct support levels:
- S1 & S2: These represent primary support zones closer to the current price action.
- S3 & S4: These represent deeper, more significant support zones used for identifying major structural floors in the market.
- Dynamic Updating: The script is programmed to recognize when a new day begins (taking into account time zone adjustments). When the day flips, it recalculates all four levels based on the new data provided by the previous session.
Visual Presentation
The script is designed for ease of use and clarity:
- Historical Mapping: It draws these support lines back over a historical period (defined by the user), allowing you to see how price reacted to these levels in the past.
- Real-Time Labels: It places text labels on the right side of your chart, clearly marking the exact price value for S1, S2, S3, and S4 so you don't have to guess the price at the line.
- Current Price Focus: You can toggle whether the script shows the lines for the current day, helping keep your chart clean or providing more context depending on your trading style.
User Requirements & Constraints
For the script to function correctly, it requires specific chart settings:
- Timeframe: The script is optimized for intraday charts and will display an alert if used on timeframes larger than 4 hours (as it relies on daily price data).
- Customization: Users can easily adjust the color of the lines, the size of the text labels, and how many days of historical data they wish to see displayed at one time.
//+------------------------------------------------------------------+
//| Pivot Support Historical_V1.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.) |
//| Modified 4/14/07 to chart historical Pivot supports by Traden4x |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Magenta
#property indicator_color2 Magenta
#property indicator_color3 Magenta
#property indicator_color4 Magenta
//---- input parameters
extern int GMTshift=0;
extern color LColor = Magenta;
extern int fontsize=8;
extern int LabelShift=11;
extern int DaysDrawBack=15;
extern bool DisplayCurrentLines = true;
double S1Buffer[];
double S2Buffer[];
double S3Buffer[];
double S4Buffer[];
double S1, S2, S3, S4, P, Q, D;
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, STYLE_DASH);
SetIndexBuffer(0,S1Buffer);
SetIndexStyle(1,DRAW_LINE, STYLE_DASH);
SetIndexBuffer(1,S2Buffer);
SetIndexStyle(2,DRAW_LINE, STYLE_DASH);
SetIndexBuffer(2,S3Buffer);
SetIndexStyle(3,DRAW_LINE, STYLE_DASH);
SetIndexBuffer(3,S4Buffer);
SetIndexLabel(0,"S1");
SetIndexLabel(1,"S2");
SetIndexLabel(2,"S3");
SetIndexLabel(3,"S4");
//----
// IndicatorShortName("Support Pivots");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
ObjectDelete("SupS1");
ObjectDelete("SupS2");
ObjectDelete("SupS3");
ObjectDelete("SupS4");
ObjectDelete("SupS1Line");
ObjectDelete("SupS2Line");
ObjectDelete("SupS3Line");
ObjectDelete("SupS4Line");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=DaysDrawBack*1440/Period();
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;
S1 = (2*P)-prev_high;
S2 = P-(prev_high-prev_low);
S3 = P-2*(prev_high-prev_low);
S4 = P-3*(prev_high-prev_low);
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
S1Buffer[cnt]=S1;
S2Buffer[cnt]=S2;
S3Buffer[cnt]=S3;
S4Buffer[cnt]=S4;
}
if (cur_day == TimeDay(CurTime())) DisplayLabels();
//----
return(0);
}
void DisplayLabels()
{
SetLabel("SupS1", "S 1", S1, LColor, LabelShift);
SetLabel("SupS2", "S 2", S2, LColor, LabelShift);
SetLabel("SupS3", "S 3", S3, LColor, LabelShift);
SetLabel("SupS4", "S 4", S4, LColor, LabelShift);
// Display Current Lines
if (DisplayCurrentLines)
{
SetLine("SupS1Line", S1, LColor);
SetLine("SupS2Line", S2, LColor);
SetLine("SupS3Line", S3, LColor);
SetLine("SupS4Line", S4, LColor);
}
}
// put a label on the line
void SetLabel(string textname, string text, double level, color col1, int LabelShift)
{
double myLevel;
int digits = MarketInfo(Symbol(), MODE_DIGITS);
myLevel = NormalizeDouble(level, digits);
if(ObjectFind(textname) != 0)
{
ObjectCreate(textname, OBJ_TEXT, 0, Time[LabelShift], myLevel);
ObjectSetText(textname, " " + text + " " + DoubleToStr(myLevel, digits), fontsize,"Arial",col1);
}
else
{
ObjectSetText(textname, " " + text + " " + DoubleToStr(myLevel, digits), fontsize,"Arial",col1);
ObjectMove(textname, 0, Time[LabelShift],myLevel);
}
}
// create or move the horizontal line
void SetLine(string linename, double level, color col1)
{
if(ObjectFind(linename) != 0)
{
ObjectCreate(linename, OBJ_TREND, 0, Time[1], level, Time[0], level);
// ObjectSet(linename, OBJPROP_STYLE, STYLE_DASHDOTDOT);
ObjectSet(linename, OBJPROP_STYLE, STYLE_DASHDOTDOT);
ObjectSet(linename, OBJPROP_COLOR, col1);
ObjectSet(linename, OBJPROP_WIDTH, 1);
}
else
{
ObjectMove(linename, 1, Time[0], level);
ObjectMove(linename, 0, Time[1], level);
}
}
//+------------------------------------------------------------------+
Comments