Parabolic_Alert_v3
Download scriptThis script is designed to work as a visual and audible trend-following tool on a trading chart. Its primary purpose is to track price momentum and notify the user when the market trend shows signs of reversing.
Core Logic Overview
The script utilizes a variation of a "Parabolic" calculation, which creates a trailing line (often referred to as a Stop and Reverse or SAR indicator). The logic follows these main stages:
1. Trend Identification The script constantly monitors whether the market is in an upward trend ("Long") or a downward trend ("Short"). It does this by tracking the highest highs and lowest lows reached during a specific movement. If the price breaks through certain thresholds established by its trailing calculation, the script flips the trend direction.
2. The Trailing Calculation The indicator calculates a dynamic value that "trails" the price.
- In an uptrend, the trailing line stays below the current price but moves upward as the price climbs. It accelerates (moves faster) if new highs are reached.
- In a downtrend, the trailing line stays above the current price and moves downward as the price drops. It also accelerates if new lows are reached.
3. Reversal Detection The "Reversal" logic is triggered when the market price crosses this trailing line in the opposite direction of the current trend:
- Sell Alert: If the script is currently tracking an uptrend and the price drops below the trailing line, it identifies a potential reversal to a downtrend.
- Buy Alert: If the script is currently tracking a downtrend and the price rises above the trailing line, it identifies a potential reversal to an uptrend.
4. User Notifications To ensure the user doesn't miss these moments, the script includes an automated notification system:
- Visual Cues: It places markers on the chart to highlight where these reversals occur.
- Audible Alarms: When a reversal is detected on the most recent live candle (the "zero" bar), the script plays an audio alert file.
- On-Screen Text: A message will appear on the chart display showing whether it was a "Buy Alert" or a "Sell Alert," along with the exact time the signal occurred.
Summary for the User
Essentially, this tool acts as a "early warning system." It calculates where a price move might be exhausting itself by trailing the market's progress and sounding an alarm the moment the price breaks through that calculated "safety" line, signaling a potential shift in market direction.
//+------------------------------------------------------------------+
//| Parabolic_Alert.mq4 |
//| Original file name: Parabolic.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//| Modified to give audible alarm on reversal |
//| Modified by Jim Arner, Sr. |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
//----
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 DarkOrange
//---- input parameters
extern double Step=0.05;
extern double Maximum=0.3;
//---- buffers
double SarBuffer[];
//----
int save_lastreverse;
bool save_dirlong, save_dirshort;
double save_start;
double save_last_high;
double save_last_low;
double save_ep;
double save_sar;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorDigits(Digits);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,158);
SetIndexBuffer(0,SarBuffer);
//----
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SaveLastReverse(int last,int dir_l,int dir_s,double start,double low,double high,double ep,double sar)
{
save_lastreverse=last;
save_dirlong=dir_l;
save_dirshort=dir_s;
save_start=start;
save_last_low=low;
save_last_high=high;
save_ep=ep;
save_sar=sar;
}
//+------------------------------------------------------------------+
//| Parabolic Sell And Reverse system |
//+------------------------------------------------------------------+
int start()
{
static bool first=true;
bool dirlong, dirshort;
double start,last_high,last_low;
double ep,sar,price_low,price_high,price;
int i,counted_bars=IndicatorCounted();
string TradeTime;
//----
if(Bars<3) return(0);
//---- initial settings
i=Bars-2;
if(counted_bars==0 || first)
{
first=false;
dirlong=true;
dirshort=false;
start=Step;
last_high=-10000000.0;
last_low=10000000.0;
while(i>0)
{
save_lastreverse=i;
price_low=Low[i];
if(last_low>price_low) last_low=price_low;
price_high=High[i];
if(last_high<price_high) last_high=price_high;
if(price_high>High[i+1] && price_low>Low[i+1]) break;
if(price_high<High[i+1] && price_low<Low[i+1]) { dirlong=false; break; }
i--;
}
//---- initial zero
int k=i;
while(k<Bars)
{
SarBuffer[k]=0.0;
k++;
}
//---- check further
if(dirlong) { SarBuffer[i]=Low[i+1]; ep=High[i]; }
if(dirshort) { SarBuffer[i]=High[i+1]; ep=Low[i]; }
i--;
}
else
{
i=save_lastreverse+1;
start=save_start;
dirlong=save_dirlong;
dirshort=save_dirshort;
last_high=save_last_high;
last_low=save_last_low;
ep=save_ep;
sar=save_sar;
}
//----
while(i>=0)
{
price_low=Low[i];
price_high=High[i];
//--- check for reverse
if(dirlong==true && price_low<SarBuffer[i+1])
{
// Print("Section 1 Code executing"," I= ",i," DirLong= ",dirlong," DirShort= ",dirshort);
SaveLastReverse(i,true,false,start,price_low,last_high,ep,sar);
start=Step; dirlong=false; dirshort=true;
// Comment("I= ",i);
if (i==0)
{
PlaySound("alert.wav");
TradeTime=TimeToStr(CurTime(),TIME_SECONDS);
Comment("\nSell Alert","\nChart Time= ", TradeTime);
}
ep=price_low; last_low=price_low;
SarBuffer[i]=last_high;
i--;
continue;
}
if(dirshort==true && price_high>SarBuffer[i+1])
{
// Print("Section 2 Code executing"," I= ",i," DirLong= ",dirlong," DirShort= ",dirshort);
SaveLastReverse(i,false,true,start,last_low,price_high,ep,sar);
start=Step; dirlong=true; dirshort=false;
// Comment("I= ",i);
if (i==0)
{
PlaySound("alert.wav");
TradeTime=TimeToStr(CurTime(),TIME_SECONDS);
Comment("\nBuy Alert","\nChart Time= ", TradeTime);
}
ep=price_high; last_high=price_high;
SarBuffer[i]=last_low;
i--;
continue;
}
//---
price=SarBuffer[i+1];
sar=price+start*(ep-price);
if(dirlong)
{
/*
Comment("DirLong","\nI= ",i,"\nDirL ",dirlong,"\nDirS ",dirshort,
"\nStart= ",start,"\nLow= ",last_low,"\nHigh= ",last_high,
"\nEP= ",ep,"\nSAR= ",sar,"\nMinute= ",Minute());
*/
// Print("Section 3 Code executing"," I= ",i," DirLong= ",dirlong," DirShort= ",dirshort);
if(ep<price_high && (start+Step)<=Maximum) start+=Step;
if(price_high<High[i+1] && i==Bars-2) sar=SarBuffer[i+1];
//----
price=Low[i+1];
if(sar>price) sar=price;
price=Low[i+2];
if(sar>price) sar=price;
if(sar>price_low)
{
SaveLastReverse(i,true,false,start,price_low,last_high,ep,sar);
start=Step; dirlong=false; dirshort=true; ep=price_low;
last_low=price_low;
SarBuffer[i]=last_high;
i--;
/*
if (i == 0)
{
Print("Section 3a Code executing"," I= ",i," DirLong= ",dirlong," DirShort= ",dirshort);
}
*/
if (dirshort && i==0)
{
PlaySound("alert.wav");
TradeTime=TimeToStr(CurTime(),TIME_SECONDS);
Comment("\nSell Alert","\nChart Time= ", TradeTime);
}
continue;
}
if(ep<price_high) { last_high=price_high; ep=price_high; }
}
if(dirshort)
{
/*
Comment("DirShort","\nI= ",i,"\nDirL ",dirlong,"\nDirS ",dirshort,
"\nStart= ",start,"\nLow= ",last_low,"\nHigh= ",last_high,
"\nEP= ",ep,"\nSAR= ",sar,"\nMinute= ",Minute());
*/
// Print("Section 4 Code executing"," I= ",i," DirLong= ",dirlong," DirShort= ",dirshort);
if(ep>price_low && (start+Step)<=Maximum) start+=Step;
if(price_low<Low[i+1] && i==Bars-2) sar=SarBuffer[i+1];
//----
price=High[i+1];
if(sar<price) sar=price;
price=High[i+2];
if(sar<price) sar=price;
if(sar<price_high)
{
SaveLastReverse(i,false,true,start,last_low,price_high,ep,sar);
start=Step; dirlong=true; dirshort=false; ep=price_high;
last_high=price_high;
SarBuffer[i]=last_low;
i--;
/*
if (i == 0)
{
Print("Section 4a Code executing"," I= ",i," DirLong= ",dirlong," DirShort= ",dirshort);
}
*/
if (dirlong && i==0)
{
PlaySound("alert.wav");
TradeTime=TimeToStr(CurTime(),TIME_SECONDS);
Comment("\nBuy Alert","\nChart Time= ", TradeTime);
}
continue;
}
if(ep>price_low) { last_low=price_low; ep=price_low; }
}
SarBuffer[i]=sar;
i--;
}
// sar=SarBuffer[0];
// price=iSAR(NULL,0,Step,Maximum,0);
// if(sar!=price) Print("custom=",sar," SAR=",price," counted=",counted_bars);
// if(sar==price) Print("custom=",sar," SAR=",price," counted=",counted_bars);
//----
return(0);
}
//+------------------------------------------------------------------+
Comments