Auto-Pivot Plotter Weekly V1-00
Download scriptThis script is designed for MetaTrader 4 to automatically identify and plot key technical support and resistance levels based on weekly price action. Instead of requiring a trader to manually calculate significant price milestones, the tool automates this process by analyzing historical data to project potential turning points for the current trading week.
Core Logic Overview
The indicator operates by looking back at the completed preceding week to establish "Pivot Points." These points represent the central balance of price. From that central point, the script calculates three levels of resistance (ceiling) and three levels of support (floor).
How it Works
The logic follows a specific sequence of steps for every bar on your chart:
- Data Retrieval: The script automatically identifies the high, low, and closing prices of the previous full week. This historical data serves as the foundation for all current calculations.
- Pivot Calculation: It determines a central "Pivot" price based on the average of the previous week's high, low, and close.
- Support & Resistance Mapping: Based on that central Pivot, the script generates two different types of mathematical models depending on your preference:
- Standard Mode: Uses a traditional arithmetic progression to project levels based on the range between the previous week's high and low.
- Fibonacci Mode: Uses specific golden ratio multipliers (such as 0.382 and 0.618) to determine the distance of the support and resistance lines.
- Visual Plotting: Finally, the script draws these levels directly onto your chart. These lines act as visual guides, helping traders identify areas where the price might encounter difficulty moving higher (resistance) or falling lower (support).
Key Features
- Automation: It handles all the math instantly, ensuring that levels are consistent and based on objective historical data rather than subjective feeling.
- Dual Methodologies: It allows users to toggle between traditional pivot math and Fibonacci-based levels, catering to different trading styles.
- Dynamic Updating: As the chart progresses, the script maintains these lines to provide a clear map of the weekly price "geography."
//+------------------------------------------------------------------+
//| Auto-Pivot Plotter Weekly V1-00.mq4 |
//| Copyright © 2007, BundyRaider |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, BundyRaider"
#property link ""
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 RoyalBlue
#property indicator_color2 RoyalBlue
#property indicator_color3 RoyalBlue
#property indicator_color4 Goldenrod
#property indicator_color5 Red
#property indicator_color6 Red
#property indicator_color7 Red
#property indicator_color8 LimeGreen
#property indicator_width4 3
//---- input parameters
extern bool ChangeToFibonacci=False;
//---- buffers
double Res3[];
double Res2[];
double Res1[];
double Pivot[];
double Supp1[];
double Supp2[];
double Supp3[];
double Extra1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID);
SetIndexBuffer(0,Res3);
SetIndexStyle(1,DRAW_LINE,STYLE_SOLID);
SetIndexBuffer(1,Res2);
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID);
SetIndexBuffer(2,Res1);
SetIndexStyle(3,DRAW_LINE,STYLE_SOLID);
SetIndexBuffer(3,Pivot);
SetIndexStyle(4,DRAW_LINE,STYLE_SOLID);
SetIndexBuffer(4,Supp1);
SetIndexStyle(5,DRAW_LINE,STYLE_SOLID);
SetIndexBuffer(5,Supp2);
SetIndexStyle(6,DRAW_LINE,STYLE_SOLID);
SetIndexBuffer(6,Supp3);
SetIndexStyle(7,DRAW_LINE,STYLE_SOLID);
SetIndexBuffer(7,Extra1);
IndicatorDigits(Digits);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
int limit=Bars-counted_bars;
//****************************
for(int i=0; i<limit; i++)
{
//if ( (i<((DaysToPlot+1)*BarsInDay))||DaysToPlot==0) // Used to limit the number of days
{ // that are mapped out. Less waiting ;)
// *****************************************************
// Find previous day's opening and closing bars.
// *****************************************************
//Find Our Week date.
datetime WeekDate=Time[i];
int WeeklyBar = iBarShift( NULL, PERIOD_W1, WeekDate,false)+1;
double PreviousHigh = iHigh(NULL, PERIOD_W1,WeeklyBar);
double PreviousLow = iLow(NULL, PERIOD_W1,WeeklyBar);
double PreviousClose = iClose(NULL, PERIOD_W1,WeeklyBar);
/*
int PreviousClosingBar = FindLastTimeMatchFast(CloseMinutesIntoDay,i+1);
int PreviousOpeningBar = FindLastTimeMatchFast(StartMinutesIntoDay,PreviousClosingBar+1);
double PreviousHigh= High[PreviousClosingBar];
double PreviousLow = Low [PreviousClosingBar];
double PreviousClose = Close[PreviousClosingBar];
*/
// *****************************************************
// Find previous day's high and low.
// *****************************************************
// ************************************************************************
// Calculate Pivot lines and map into indicator buffers.
// ************************************************************************
if(ChangeToFibonacci==False)
{
double P = (PreviousHigh+PreviousLow+PreviousClose)/3;
double R1 = (2*P)-PreviousLow;
double S1 = (2*P)-PreviousHigh;
double R2 = P+(PreviousHigh - PreviousLow);
double S2 = P-(PreviousHigh - PreviousLow);
double R3 = (2*P)+(PreviousHigh-(2*PreviousLow));
double S3 = (2*P)-((2* PreviousHigh)-PreviousLow);
//NormalizeDouble( P, Digits);
}
else
{
P = (PreviousHigh+PreviousLow+PreviousClose)/3;
R1 = P + ((PreviousHigh-PreviousLow) * 0.382);
S1 = P - ((PreviousHigh-PreviousLow) * 0.382);
R2 = P + ((PreviousHigh-PreviousLow) * 0.618);
S2 = P - ((PreviousHigh-PreviousLow) * 0.618);
R3 = P + ((PreviousHigh-PreviousLow) * 1.000);
S3 = P - ((PreviousHigh-PreviousLow) * 1.000);
//NormalizeDouble( P, Digits);
}
Pivot[i]= NormalizeDouble( P, Digits);
Res1[i] =R1;
Res2[i] =R2;
Res3[i] =R3;
Supp1[i]=S1;
Supp2[i]=S2;
Supp3[i]=S3;
// Extra1[i]=OpenPriceAt+i;
// **********************************************
// Calculate the mid-levels in to the buffers.
// (for mid-levels version)
// **********************************************(Twe)
// Res1[i] =((R1-P)/2)+P; //M3
// Res2[i] =((R2-R1)/2)+R1; //M4
// Res3[i] =((R3-R2)/2)+R2;
// Supp1[i]=((P-S1)/2)+S1; //M2
// Supp2[i]=((S1-S2)/2)+S2; //M1
// Supp3[i]=((S2-S3)/2)+S3;
} //End of 'DaysToPlot 'if' statement.
}
// ***************************************************************************************
// End of Main Loop
// ***************************************************************************************
// *****************************************
// Return from Start() (Main Routine)
return(0);
}
//+-------------------------------------------------------------------------------------------------------+
// END Custom indicator iteration function
//+-------------------------------------------------------------------------------------------------------+
// *****************************************************************************************
// *****************************************************************************************
// -----------------------------------------------------------------------------------------
// The following routine will use "StartingBar"'s time and use it to find the
// general area that SHOULD contain the bar that matches "TimeToLookFor"
// -----------------------------------------------------------------------------------------
Comments