This script is designed for the MetaTrader platform and helps traders identify potential buying and selling opportunities based on the Parabolic SAR (SAR) indicator across different timeframes. Think of the Parabolic SAR as a dynamic trailing stop that moves along with the price.
Here's a breakdown:
-
Purpose: The script calculates the Parabolic SAR indicator on the current chart's timeframe (let's call it the "main" timeframe) and optionally on up to three higher timeframes, and then uses these to generate signals.
-
Timeframes: The script allows the user to select whether to consider up to three additional timeframes above the current chart's timeframe. For example, if the chart is on the 15-minute timeframe, the script can look at the 30-minute, 60-minute, and 240-minute timeframes.
-
Parabolic SAR Calculation: The core of the script is the Parabolic SAR indicator. It's calculated for the main timeframe and, if enabled, for the higher timeframes as well. The SAR is a dot on the chart that indicates the potential direction of the price. When the price is above the SAR, it suggests an uptrend. When the price is below the SAR, it suggests a downtrend. Two user-defined parameters, "Step" and "Maximum," control the sensitivity of the SAR.
-
Signal Generation: The script generates buy (bullish) and sell (bearish) signals based on the relationship between the Parabolic SAR values on the different timeframes and the current price. It looks for situations where the SAR on multiple timeframes suggests a potential trend change and checks if current or previous candle close above or below the SAR.
-
Alerts: When a buy or sell signal is generated, the script can trigger an alert (if enabled by the user). The alert notifies the trader that a potential opportunity has been identified.
-
Visualization: The script displays arrow indicators on the chart to visually represent the buy and sell signals. Different colors are used for SAR values ??of different time frames.
In simpler terms:
Imagine you're trying to predict which way a ball will bounce. This script is like having multiple sensors (the Parabolic SAR) tracking the ball's movement on different levels. One sensor is close to the ball (main timeframe), while others are further away (higher timeframes).
The script looks at all these sensors and checks if they agree on which way the ball is likely to bounce (trend direction). If multiple sensors suggest the ball is about to bounce up, the script signals a "buy" opportunity. If they suggest it's about to bounce down, it signals a "sell" opportunity. The script can then alert you so you don't miss a potential bouncing opportunity.
//+------------------------------------------------------------------+
//| ProjectName |
//| Copyright 2012, CompanyName |
//| http://www.companyname.net |
//+------------------------------------------------------------------+
/*------------------------------------------------------------------+
| Nik_PSAR_2B_Guillermo.mq4 |
| Copyright © 2010 |
| basisforex@gmail.com |
+------------------------------------------------------------------*/
#property copyright "Copyright © 2010, basisforex@gmail.com"
#property link "basisforex@gmail.com"
//-----
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 White
#property indicator_color2 Yellow
#property indicator_color3 Blue
#property indicator_color4 Black
#property indicator_color5 Green
#property indicator_color6 Red
//-----
extern int VisualBars = 30;
extern bool AlertsEnabled = false;
extern bool TF4 = true;
extern bool TF3 = true;
extern bool TF2 = true;
extern bool TF1 = true;
//-----
extern double Step = 0.02;
extern double Maximum = 0.2;
//-----
double s1[];
double s2[];
double s3[];
double s4[];
double bullish[];
double bearish[];
double sarUp[];
double sarDn[];
double alertBar;
bool sar4,sar3,sar2;
//+------------------------------------------------------------------+
int init()
{
SetIndexBuffer(0,s1);
SetIndexBuffer(1,s2);
SetIndexBuffer(2,s3);
SetIndexBuffer(3,s4);
//-----
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,159);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,159);
SetIndexStyle(2,DRAW_ARROW);
SetIndexArrow(2,159);
SetIndexStyle(3,DRAW_ARROW);
SetIndexArrow(3,159);
//------
SetIndexStyle(4,DRAW_ARROW);// UP___UP___UP
SetIndexArrow(4,233);
SetIndexBuffer(4,bullish);
//-----
SetIndexStyle(5,DRAW_ARROW);// DOWN____DOWN
SetIndexArrow(5,234);
SetIndexBuffer(5,bearish);
//-----
return(0);
}
//+------------------------------------------------------------------+
void GetBool()
{
if(TF4==true)
{
sar4=true; sar3=true; sar2=true;
}
else if(TF3==true && TF4==false)
{
sar4=false; sar3=true; sar2=true;
}
else if(TF2==true && TF4==false && TF3==false)
{
sar4=false; sar3=false; sar2=true;
}
else if(TF2==false && TF4==false && TF3==false)
{
sar4=false; sar3=false; sar2=false;
}
}
//+------------------------------------------------------------------+
void GetNextTF(int curTF, int &tf1, int &tf2, int &tf3)
{
switch(curTF)
{
case 1:
//return("5=15#30");
tf1=5; tf2=15; tf3=30;
break;
case 5:
//return("15=30#60");
tf1=15; tf2=30; tf3=60;
break;
case 15:
//return("30=60#240");
tf1=30; tf2=60; tf3=240;
break;
case 30:
//return("60=240#1440");
tf1=60; tf2=240; tf3=1440;
break;
case 60:
//return("240=1440#10080");
tf1=240; tf2=1440; tf3=10080;
break;
case 240:
//return("1440=10080#43200");
tf1=1440; tf2=10080; tf3=43200;
break;
}
}
int limit;
//+------------------------------------------------------------------+
void AlertDn(double sar)
{
//----
for(int i=0; i<limit;i++)
{
if(sar>=iHigh(Symbol(),0,i))
{
if(AlertsEnabled==true && sarUp[i]==0 && Bars>alertBar)
{
Alert("PSAR Going Down on ",Symbol()," - ",Period()," min");
alertBar=Bars;
}
sarUp[i] = sar;
sarDn[i] = 0;
}
}
}
//+------------------------------------------------------------------+
void AlertUp(double sar)
{
//----
for(int i=0; i<limit;i++)
{
if(sar<=iLow(Symbol(),0,i))
{
if(AlertsEnabled==true && sarDn[i]==0 && Bars>alertBar)
{
Alert("PSAR Going Up on ",Symbol()," - ",Period()," min");
alertBar=Bars;
}
sarUp[i] = 0;
sarDn[i] = sar;
}
}
}
//+------------------------------------------------------------------+
int start()
{
int counted_bars = IndicatorCounted();
if(counted_bars < 0) return(-1);
if(counted_bars > 0) counted_bars--;
limit = Bars - counted_bars;
if(counted_bars==0) limit-=1+1;
//-----
int tf1,tf2,tf3;
GetNextTF(Period(),tf1,tf2,tf3);
//-----
GetBool();
//-----
for(int i=limit-1; i>=0; i--)
{
//=============================================== __________________________________________________ sar1 & sar2 & sar3 & sar4
if(sar2==true && sar3==true && sar4==true)
{
Comment(Period()," White","\n",tf1," Yellow","\n",tf2," Blue","\n",tf3," Black");
int v1=tf1 / Period();
int v2=tf2 / Period();
int v3=tf3 / Period();
s1[i]=iSAR(NULL,Period(),Step,Maximum,i);
if(v1!=0)
s2[i]=iSAR(NULL,tf1,Step,Maximum,i/(tf1/Period()));
else s2[i]=EMPTY_VALUE;
if(v1!=0)
s3[i]=iSAR(NULL,tf2,Step,Maximum,i/(tf2/Period()));
else s3[i]=EMPTY_VALUE;
if(v1!=0)
s4[i]=iSAR(NULL,tf3,Step,Maximum,i/(tf3/Period()));
else s4[i]=EMPTY_VALUE;
//============================================================
if((s1[i]>High[i] && s2[i]>High[i] && s3[i]>High[i] && s4[i+1]<Low[i+1] && s4[i]>High[i]) ||
(s1[i]>High[i] && s2[i]>High[i] && s3[i+1]<Low[i+1] && s3[i]>High[i] && s4[i]>High[i]) ||
(s1[i]>High[i] && s2[i+1]<Low[i+1] && s2[i]>High[i] && s3[i]>High[i] && s4[i]>High[i]) ||
(s1[i+1]<Low[i+1] && s1[i]>High[i] && s2[i]>High[i] && s3[i]>High[i] && s4[i]>High[i]))
{
bearish[i]=s1[i]+5*Point;// SELL__SELL__SELL
AlertDn(s1[i]);
}
//-----
if((s1[i]<Low[i] && s2[i]<Low[i] && s3[i]<Low[i] && s4[i+1]>High[i+1] && s4[i]<Low[i]) ||
(s1[i]<Low[i] && s2[i]<Low[i] && s3[i+1]>High[i+1] && s3[i]<Low[i] && s4[i]<Low[i]) ||
(s1[i]<Low[i] && s2[i+1]>High[i+1] && s2[i]<Low[i] && s3[i]<Low[i] && s4[i]<Low[i]) ||
(s1[i+1]>High[i+1] && s1[i]<Low[i] && s2[i]<Low[i] && s3[i]<Low[i] && s4[i]<Low[i]))
{
bullish[i]=s1[i]-5*Point;// BUY___BUY___BUY
AlertUp(s1[i]);
}
}
//=============================================== __________________________________________________ sar1 & sar2 & sar3
else if(sar2==true && sar3==true && sar4==false)
{
Comment(Period()," White","\n",tf1," Yellow ","\n",tf2," Blue");
s1[i] = iSAR(NULL, Period(), Step, Maximum, i);
s2[i] = iSAR(NULL, tf1, Step, Maximum, i / (tf1 / Period()));
s3[i] = iSAR(NULL, tf2, Step, Maximum, i / (tf2 / Period()));
//============================================================
if((s1[i]>High[i] && s2[i]>High[i] && s3[i+1]<Low[i+1] && s3[i]>High[i]) ||
(s1[i]>High[i] && s2[i+1]<Low[i+1] && s2[i]>High[i] && s3[i]>High[i]) ||
(s1[i+1]<Low[i+1] && s1[i]>High[i] && s2[i]>High[i] && s3[i]>High[i]))
{
bearish[i]=s1[i]+5*Point;// SELL__SELL__SELL
AlertDn(s1[i]);
}
//-----
if((s1[i]<Low[i] && s2[i]<Low[i] && s3[i+1]>High[i+1] && s3[i]<Low[i]) ||
(s1[i]<Low[i] && s2[i+1]>High[i+1] && s2[i]<Low[i] && s3[i]<Low[i]) ||
(s1[i+1]>High[i+1] && s1[i]<Low[i] && s2[i]<Low[i] && s3[i]<Low[i]))
{
bullish[i]=s1[i]-5*Point;// BUY___BUY___BUY
AlertUp(s1[i]);
}
}
//=============================================== __________________________________________________ sar1 & sar2
else if(sar2==true && sar3==false && sar4==false)
{
Comment(Period()," White","\n",tf1," Yellow");
s1[i] = iSAR(NULL, Period(), Step, Maximum, i);
s2[i] = iSAR(NULL, tf1, Step, Maximum, i / (tf1 / Period()));
//============================================================
if((s1[i]>High[i] && s2[i+1]<Low[i+1] && s2[i]>High[i]) ||
(s1[i+1]<Low[i+1] && s1[i]>High[i] && s2[i]>High[i]))
{
bearish[i]=s1[i]+5*Point;// SELL__SELL__SELL
AlertDn(s1[i]);
}
//-----
if((s1[i]<Low[i] && s2[i+1]>High[i+1] && s2[i]<Low[i]) ||
(s1[i+1]>High[i+1] && s1[i]<Low[i] && s2[i]<Low[i]))
{
bullish[i]=s1[i]-5*Point;// BUY___BUY___BUY
AlertUp(s1[i]);
}
}
//=============================================== __________________________________________________ sar1
else if(sar2==false && sar3==false && sar4==false)
{
Comment(Period()," White");
s1[i]=iSAR(NULL,Period(),Step,Maximum,i);
//============================================================
if(s1[i+1]<Low[i+1] && s1[i]>High[i])
{
bearish[i]=s1[i]+5*Point;// SELL__SELL__SELL
AlertDn(s1[i]);
}
//-----
if(s1[i+1]>High[i+1] && s1[i]<Low[i])
{
bullish[i]=s1[i]-5*Point;// BUY___BUY___BUY
AlertUp(s1[i]);
}
}
}
//==============================================================================================================================================
Comment("IndicatorCounted= ",IndicatorCounted()," counted_bars= ",counted_bars," limit= ",limit);
return(0);
}
//+------------------------------------------------------------------+
Comments