Pivot(23JUL05)
Download scriptThis script is designed as a technical analysis tool for the MetaTrader trading platform. Its primary purpose is to automatically calculate and display "Pivot Points" on a price chart, which are key levels used by traders to identify potential areas of support and resistance.
How the Logic Works
The script operates by analyzing historical price data to establish specific horizontal reference points. Here is a breakdown of how it processes this information:
1. Data Collection The tool scans the price action of previous trading sessions. Specifically, it looks for the highest price reached, the lowest price reached, and the closing price during a completed period (such as a full day).
2. The Pivot Point Calculation When a new day begins, the script captures the high, low, and close of the previous day to calculate the "Pivot Point" (P). This serves as the central baseline for that trading session. The formula essentially averages these three key price points to find a "fair value" center for the current day.
3. Support and Resistance Levels Based on that central Pivot Point, the script automatically generates six additional levels:
- Resistance Levels (R1, R2, R3): These are calculated as prices above the Pivot Point where sellers might enter the market or buyers might take profits.
- Support Levels (S1, S2, S3): These are calculated as prices below the Pivot Point where buyers might enter the market or sellers might take profits.
As the numbers increase (from 1 to 3), these levels move further away from the central Pivot Point, representing more extreme potential price boundaries.
4. Visual Representation Once these values are calculated, the script performs two actions simultaneously:
- Dynamic Plotting: It draws continuous lines across your chart so you can visually track how these levels change over time.
- Labeling: It places text labels on the chart (such as "S1", "R1", etc.) to ensure the user knows exactly which level they are looking at without having to guess.
Summary for the User
Essentially, this tool removes the manual work of calculating complex price levels. It looks at what happened yesterday to predict the "boundaries" of today. By identifying these floors (Support) and ceilings (Resistance), it helps you see where the market might stall, reverse, or break out, allowing for more structured decision-making during your trading sessions.
//+------------------------------------------------------------------+
//| Pivot.mq4 |
//| Copyright © 2004, Poul_Trade_Forum |
//| Aborigen |
//| http://forex.kbpauk.ru/ |
//+------------------------------------------------------------------+
#property copyright "Poul Trade Forum"
#property link "http://forex.kbpauk.ru/"
#property indicator_chart_window
//#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1 Aqua
#property indicator_color2 DodgerBlue
#property indicator_color3 Tan
#property indicator_color4 DodgerBlue
#property indicator_color5 Tan
#property indicator_color6 Bisque
#property indicator_color7 Bisque
//---- input parameters
//---- buffers
double PBuffer[];
double S1Buffer[];
double R1Buffer[];
double S2Buffer[];
double R2Buffer[];
double S3Buffer[];
double R3Buffer[];
string Pivot="Pivot Point",Sup1="S 1", Res1="R 1";
string Sup2="S 2", Res2="R 2", Sup3="S 3", Res3="R 3";
int fontsize=10;
double P,S1,R1,S2,R2,S3,R3;
double LastHigh,LastLow,x;
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
ObjectDelete("Pivot");
ObjectDelete("Sup1");
ObjectDelete("Res1");
ObjectDelete("Sup2");
ObjectDelete("Res2");
ObjectDelete("Sup3");
ObjectDelete("Res3");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);
SetIndexStyle(2,DRAW_LINE);
SetIndexStyle(3,DRAW_LINE);
SetIndexStyle(4,DRAW_LINE);
SetIndexStyle(5,DRAW_LINE);
SetIndexStyle(6,DRAW_LINE);
SetIndexBuffer(0,PBuffer);
SetIndexBuffer(1,S1Buffer);
SetIndexBuffer(2,R1Buffer);
SetIndexBuffer(3,S2Buffer);
SetIndexBuffer(4,R2Buffer);
SetIndexBuffer(5,S3Buffer);
SetIndexBuffer(6,R3Buffer);
//---- name for DataWindow and indicator subwindow label
short_name="Pivot Point";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);
//----
SetIndexDrawBegin(0,1);
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
int limit, i;
//---- indicator calculation
if (counted_bars==0)
{
x=Period();
if (x>240) return(-1);
ObjectCreate("Sup1", OBJ_TEXT, 0, 0, 0);
ObjectSetText("Sup1", " S 1",fontsize,"Arial", Aqua);
ObjectCreate("Res1", OBJ_TEXT, 0, 0, 0);
ObjectSetText("Res1", " R 1",fontsize,"Arial", Aqua);
ObjectCreate("Sup2", OBJ_TEXT, 0, 0, 0);
ObjectSetText("Sup2", " S 2",fontsize,"Arial", Aqua);
ObjectCreate("Res2", OBJ_TEXT, 0, 0, 0);
ObjectSetText("Res2", " R 2",fontsize,"Arial", Aqua);
ObjectCreate("Sup3", OBJ_TEXT, 0, 0, 0);
ObjectSetText("Sup3", " S 3",fontsize,"Arial", Aqua);
ObjectCreate("Res3", OBJ_TEXT, 0, 0, 0);
ObjectSetText("Res3", " R 3",fontsize,"Arial", Aqua);
}
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
// if(counted_bars>0) counted_bars--;
limit=(Bars-counted_bars)-1;
for (i=limit; i>=0;i--)
{
if (High[i+1]>LastHigh) LastHigh=High[i+1];
if (Low[i+1]<LastLow) LastLow=Low[i+1];
if (TimeDay(Time[i])!=TimeDay(Time[i+1]))
{
P=(LastHigh+LastLow+Close[i+1])/3;
R1 = (2*P)-LastLow;
S1 = (2*P)-LastHigh;
R2 = P+(LastHigh - LastLow);
S2 = P-(LastHigh - LastLow);
R3 = (2*P)+(LastHigh-(2*LastLow));
S3 = (2*P)-((2* LastHigh)-LastLow);
LastLow=Open[i]; LastHigh=Open[i];
ObjectMove("Pivot", 0, Time[i],P);
ObjectMove("Sup1", 0, Time[i],S1);
ObjectMove("Res1", 0, Time[i],R1);
ObjectMove("Sup2", 0, Time[i],S2);
ObjectMove("Res2", 0, Time[i],R2);
ObjectMove("Sup3", 0, Time[i],S3);
ObjectMove("Res3", 0, Time[i],R3);
}
PBuffer[i]=P;
S1Buffer[i]=S1;
R1Buffer[i]=R1;
S2Buffer[i]=S2;
R2Buffer[i]=R2;
S3Buffer[i]=S3;
R3Buffer[i]=R3;
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments