This script is designed to identify potential buying and selling opportunities in a financial market, and to alert the user when these opportunities arise. It does this by analyzing price movements over time and comparing them to recent highs and lows.
Here's a breakdown of how it works:
-
Defining Highs and Lows: The script calculates recent high and low prices over two different time periods, defined by the user as
dist1anddist2. TheHighestandLowestfunctions search within those periods to find the highest high and the lowest low. -
Drawing Arrows: The script then draws arrows on the chart to visually represent these potential buying and selling opportunities. Different colored arrows are used to signify the different signals:
-
Yellow & Red Arrows: Yellow and red arrows are drawn at the highest and lowest of the bigger period defined by the
dist2variable. -
Lime & Aqua Arrows: Green and aqua arrows are drawn at the highest and lowest of the smaller period defined by the
dist1variable.
-
-
ATR Consideration: The script takes into account the Average True Range (ATR), a measure of volatility. ATR values are added to the highs and subtracted from the lows, providing a buffer to avoid false signals due to normal price fluctuations.
-
Alerts: Finally, the script generates alerts based on these arrow positions. These alerts are triggered under different conditions:
- "strong sell/buy": When arrows from both periods (
dist1anddist2) signal the same direction. - "sell/buy": When only the arrows from the bigger period (
dist2) signal a direction. - "minor sell/buy or exit buy/sell": When only the arrows from the smaller period (
dist1) signal a direction.
- "strong sell/buy": When arrows from both periods (
The alerts can be displayed as pop-up messages on the screen, sent via email, and/or played as sound notifications. The user can configure which types of alerts are enabled and whether the alert refers to the current bar or the previous bar. The script also ensures it doesn't send the same alert repeatedly by comparing to the previous alert and the current time.
//+------------------------------------------------------------------+
//| super-signals_v2.mq4 |
//| Copyright ?2006, Nick Bilak, beluck[AT]gmail.com |
//| Modified by mtuppers[AT]gmail.com |
//| took away time, add periods |
//+------------------------------------------------------------------+
#property copyright "Copyright ?2006, Nick Bilak"
#property copyright "alterations by Mark Tomlinson"
#property copyright "alterations by Money Duck @ 4xCampus.com"
#property link "http://www.forex-tsd.com/"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Yellow
#property indicator_color2 Lime
#property indicator_color3 Red
#property indicator_color4 Aqua
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
//input properties
extern int dist2 = 21;
extern int dist1 = 14;
extern bool alertsOn = true;
extern bool alertsOnCurrent = true;
extern bool alertsMessage = true;
extern bool alertsSound = true;
extern bool alertsEmail = false;
double b1[];
double b2[];
double b3[];
double b4[];
int init()
{
SetIndexBuffer(0,b1);
SetIndexBuffer(1,b2);
SetIndexBuffer(2,b3);
SetIndexBuffer(3,b4);
SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,334);
SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,333);
SetIndexStyle(2,DRAW_ARROW); SetIndexArrow(1,233);
SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(0,234);
return(0);
}
int start()
{
int counted_bars=IndicatorCounted();
int i,limit,hhb,llb,hhb1,llb1;
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
limit=MathMax(limit,dist1);
limit=MathMax(limit,dist2);
//
//
//
//
//
for (i=limit;i>=0;i--)
{
hhb1 = Highest(NULL,0,MODE_HIGH,dist1,i-dist1/2);
llb1 = Lowest(NULL,0,MODE_LOW,dist1,i-dist1/2);
hhb = Highest(NULL,0,MODE_HIGH,dist2,i-dist2/2);
llb = Lowest(NULL,0,MODE_LOW,dist2,i-dist2/2);
b1[i] = EMPTY_VALUE;
b2[i] = EMPTY_VALUE;
b3[i] = EMPTY_VALUE;
b4[i] = EMPTY_VALUE;
double tr = iATR(NULL,0,50,i);
if (i==hhb) b1[i]=High[hhb] +tr;
if (i==llb) b2[i]=Low[llb] -tr;
if (i==hhb1) b3[i]=High[hhb1]+tr/2;
if (i==llb1) b4[i]=Low[llb1] -tr/2;
}
//
//
//
//
//
if (alertsOn)
{
int forBar = 1;
if (alertsOnCurrent) forBar = 0;
if (b1[forBar] != EMPTY_VALUE && b3[forBar] != EMPTY_VALUE) doAlert("strong sell");
if (b1[forBar] != EMPTY_VALUE && b3[forBar] == EMPTY_VALUE) doAlert("sell");
if (b1[forBar] == EMPTY_VALUE && b3[forBar] != EMPTY_VALUE) doAlert("minor sell or exit buy");
if (b2[forBar] != EMPTY_VALUE && b4[forBar] != EMPTY_VALUE) doAlert("strong buy");
if (b2[forBar] != EMPTY_VALUE && b4[forBar] == EMPTY_VALUE) doAlert("buy");
if (b2[forBar] == EMPTY_VALUE && b4[forBar] != EMPTY_VALUE) doAlert("minor buy or exit sell");
}
return(0);
}
//
//
//
//
//
void doAlert(string doWhat)
{
static string previousAlert="nothing";
static datetime previousTime;
string message;
string TimePeriod;
if (Period()== 1) TimePeriod = "1 MIN";
if (Period()== 5) TimePeriod = "5 MIN";
if (Period()== 15) TimePeriod = "15 MIN";
if (Period()== 30) TimePeriod = "30 MIN";
if (Period()== 60) TimePeriod = "1 HR";
if (Period()== 240) TimePeriod = "4 HR";
if (Period()== 1440) TimePeriod = "DAILY";
if (Period()== 10080) TimePeriod = "WEEKLY";
if (Period()== 43200) TimePeriod = "MONTHLY";
if (previousAlert != doWhat || previousTime != Time[0]) {
previousAlert = doWhat;
previousTime = Time[0];
//
//
//
//
//
message = StringConcatenate(Symbol()," at ", TimePeriod, " Super signal : ",doWhat);
if (alertsMessage) Alert(message);
if (alertsEmail) SendMail(StringConcatenate(Symbol(),"Super signal "),message);
if (alertsSound) PlaySound("alert2.wav");
}
}
Comments