This script is a specialized visual tool designed for trading platforms to identify potential momentum shifts in the market. Instead of just looking at simple price movements, it analyzes "peaks" and "valleys" (highs and lows) over specific time windows to provide a more comprehensive view of market trends.
Core Logic & Mechanics
The script works by scanning the price history to identify two distinct types of turning points:
- Short-Term Peaks/Valleys: It looks at a smaller, more immediate window of recent price bars to find minor fluctuations.
- Long-Term Peaks/Valleys: It simultaneously looks at a larger window of historical price data to identify major structural trends.
By comparing these two windows, the script determines the significance of a price movement. When a new peak or valley is formed, it places visual markers (arrows) on your chart. The distance of these arrows from the price is automatically adjusted based on market volatility, ensuring that the signals remain visible and relevant regardless of whether the market is moving slowly or rapidly.
Signal Types
The script categorizes market movements into four distinct visual categories:
- Strong Buy: Occurs when a major long-term valley coincides with a minor short-term signal.
- Buy / Minor Buy: Indicates standard upward momentum or a potential point to exit a sell position.
- Strong Sell: Occurs when a major long-term peak coincides with a minor short-term signal.
- Sell / Minor Sell: Indicates standard downward momentum or a potential point to exit a buy position.
Notification & Customization
Beyond visual arrows, the script includes a sophisticated alert system that can be tailored to your specific trading style:
- Directional Filtering: You can configure the tool to notify you about every signal, only "Buy" signals, only "Sell" signals, or only "Strong" signals.
- Multi-Channel Alerts: Depending on your preferences, the system can trigger a visual pop-up on your screen, play an audible sound effect, or even send an email notification.
- Smart Logic: The alert system is programmed to be "smart"—it tracks the time and the type of signal to ensure you aren't bombarded with repetitive notifications for the same price movement; it only alerts you once per specific signal event.
//+------------------------------------------------------------------+
//| 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 string note1 = "alert all = 0",
note2 = "buy only = 1, sell only = 2",
note3 = "strong buy or strong sell = 3";
extern int alertsOption = 0;
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 (alertsOption == 0) //alert on all direction
{
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");
}
if (alertsOption == 1) //alert on buy only
{
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");
}
if (alertsOption == 2) //alert on sell only
{
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 (alertsOption == 3) //alert on strong buy or sell
{
if (b2[forBar] != EMPTY_VALUE && b4[forBar] != EMPTY_VALUE) doAlert("strong buy");
if (b1[forBar] != EMPTY_VALUE && b3[forBar] != EMPTY_VALUE) doAlert("strong 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