Parabolic_Alert_v3

Download script
Author: Copyright � 2004, MetaQuotes Software Corp.
Parabolic_Alert_v3

This 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.

Miscellaneous
Implements a curve of type %1It plays sound alerts
10 Views
0 Downloads
0 Favorites
Parabolic_Alert_v3
//+------------------------------------------------------------------+
//|                                              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