JC - Line Break Alert

Download script
Author: Juan Carlos Christensen.
JC - Line Break Alert

The JC - Line Break Alert is a specialized monitoring tool designed for MetaTrader 4 to provide real-time notifications when market prices reach specific numerical thresholds. It functions as an automated watchman, identifying the exact moment price movement crosses a boundary you define.

Core Functionality

The script offers two distinct ways to monitor your trades, depending on your specific strategy:

  • Line Break Mode: This is designed for tracking a single, specific price point. The tool monitors the market and triggers an alert the moment the current price moves from below to above (or vice versa) that designated line.
  • Channel Breakout Mode: This mode allows you to set two different price points, creating a "channel." It monitors both boundaries simultaneously. It will notify you if the price breaks out of the top boundary or falls through the bottom boundary.

Key Operational Features

To ensure the tool fits your specific workflow, it includes several customizable behaviors:

1. Smart Detection Logic The script evaluates price movement based on your preference for "Tick Mode." You can choose to have the indicator monitor the closing price of the current candle (for real-time fluctuations) or the opening price of previous candles.

2. Multi-Channel Notifications When a price breakout occurs, the script can communicate with you in several ways simultaneously:

  • Audio Alerts: Plays a specific sound file directly through your trading platform.
  • Pop-up Alerts: Displays a visual notification window on your screen.
  • Email Notifications: Sends an automated email to your registered account (if enabled).

3. Alert Management To prevent "alert fatigue" (where the system repeatedly beeps for the same price cross), the script includes a deactivation feature. Once a breakout is detected, it can automatically silence itself so that you are only notified of the initial breach.

Visual Representation

While the primary purpose is notification, the script also visually anchors your chosen prices onto the chart using colored lines (Green and Red), allowing you to see your target zones clearly at all times while the software works in the background.

Price Data Components
Series array that contains close prices for each barSeries array that contains open prices of each bar
Miscellaneous
Implements a curve of type %1It plays sound alertsIt issuies visual alerts to the screenIt sends emails
10 Views
0 Downloads
0 Favorites
JC - Line Break Alert
//+------------------------------------------------------------------+
//|                                        JC - Line Break Alert.mq4 |
//|                                         Juan Carlos Christensen. |
//|                                     http://www.eumefinancial.com |
//+------------------------------------------------------------------+
#property copyright "Juan Carlos Christensen."
#property link      "http://www.eumefinancial.com"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_width1 2
#property indicator_width2 2

//---- input parameters
extern double Price1 = 2.0000;
extern double Price2 = 2.0000;
extern string Modes = "0- Line; 1- Channel";
extern int Mode = 0;
extern bool UseSoundAlert = True;
extern string SoundFile = "alert.wav";
extern int PlaySoundNTimes = 1;
extern bool UseAlertPopUp = True;
extern bool UseTickMode = True;
extern bool UseSendMail = False;
extern bool DeactivateOnAlert = True;

double PRICE1[];
double PRICE2[];
bool DidBreakout = False;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  //---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,PRICE1);
   
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,PRICE2);
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   //ObjectDelete("Price1");
   //ObjectDelete("Price2");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//----

   switch(Mode)
   {
      case 0:
         CrossingPrice1Only();
         break;
      case 1:
         ChannelBreakOut();
         break;
      default:
         CrossingPrice1Only();
   }
   

//----
   return(0);
  }
//+------------------------------------------------------------------+

void CrossingPrice1Only()
{
   int counted_bars =IndicatorCounted();
   int pos =Bars-counted_bars;
   
   double LastPrice;
   double CurrentPrice;
   int x;
   
   while(pos>=0)
   {
      PRICE1[pos]= Price1;
      
      pos--;
   }
   
   if(UseTickMode)
   {
      LastPrice = iClose(NULL, 0, 1);
      CurrentPrice = iClose(NULL, 0, 0);
   }
   else if(UseTickMode == False)
   {
      LastPrice = iOpen(NULL, 0, 1);
      CurrentPrice = iOpen(NULL, 0, 0);
   }

   //int counter = 0;
   
   //while(!ObjectCreate("Price1_" + counter, OBJ_HLINE, 0, 0, Price1) && counter < 100)
   //{
   //   counter++;
   //}
   
   //ObjectSet("Price1", OBJPROP_COLOR, Green);
   
   if(((LastPrice < Price1) && (CurrentPrice >= Price1)) || ((LastPrice > Price1) && (CurrentPrice <= Price1)) && !DidBreakout) 
   {
      if(DeactivateOnAlert)
      {
         DidBreakout = True;
      }
      
      if(UseSoundAlert)
      {
         for(x=0;x<=PlaySoundNTimes;x++)
         {
            PlaySound(SoundFile);
         }
      }
      
      if(UseAlertPopUp)
      {
         Alert("Price Crossing Alert Line at ", Price1, "!");
      }
      
      if(UseSendMail)
      {
         SendMail("Price Crossing Alert Line at " + Price1 + "!", "This is an email from the JC - Line Break Alert indicator. Price is crossing your alert line at " + Price1 + "!");
      }
   }
}

//+------------------------------------------------------------------+

void ChannelBreakOut()
{
   int counted_bars = IndicatorCounted();
   int pos = Bars-counted_bars;
   
   double LastPrice;
   double CurrentPrice;
   int x;
   
   while(pos>=0)
   {
      PRICE1[pos]= Price1;
      PRICE2[pos]= Price2;
      
      pos--;
   }
   
   if(UseTickMode)
   {
      LastPrice = iClose(NULL, 0, 1);
      CurrentPrice = iClose(NULL, 0, 0);
   }
   else if(UseTickMode == False)
   {
      LastPrice = iOpen(NULL, 0, 1);
      CurrentPrice = iOpen(NULL, 0, 0);
   }

   //int counter = 0;
   
   //while(!ObjectCreate("Price1_" + counter, OBJ_HLINE, 0, 0, Price1) && counter < 100)
   //{
   //   counter++;
   //}
   
   //while((!ObjectCreate("Price2_" + counter, OBJ_HLINE, 0, 0, Price2)) && counter < 100)
   //{
   //   counter++;
   //}
   
   //ObjectSet("Price1", OBJPROP_COLOR, Green);
   //ObjectSet("Price2", OBJPROP_COLOR, Red);
   
   if((LastPrice < Price1) && (CurrentPrice >= Price1) && !DidBreakout) 
   {
      if(DeactivateOnAlert)
      {
         DidBreakout = True;
      }
      
      if(UseSoundAlert)
      {
         for(x=0;x<=PlaySoundNTimes;x++)
         {
            PlaySound(SoundFile);
         }
      }
      
      if(UseAlertPopUp)
      {
         Alert("Channel Breaking Up at ", Price1, "!");
      }
      
      if(UseSendMail)
      {
         SendMail("Channel Breaking Up at " + Price1 + "!", "This is an email from the JC - Line Break Alert indicator. Price broke up your channel alert line at " + Price1 + "!");
      }
   }
   
   if((LastPrice > Price2) && (CurrentPrice <= Price2) && !DidBreakout)
   {
      if(DeactivateOnAlert)
      {
      DidBreakout = True;
      }
      
      if(UseSoundAlert)
      {
         for(x=0;x<=PlaySoundNTimes;x++)
         {
            PlaySound(SoundFile);
         }
      }
      
      if(UseAlertPopUp)
      {
         Alert("Channel Breaking Down at ", Price2, "!");
      }
      
      if(UseSendMail)
      {
         SendMail("Channel Breaking Down at " + Price2 + "!", "This is an email from the JC - Line Break Alert indicator. Price broke down your channel alert line at " + Price2 + "!");
      }
   }
}

//+------------------------------------------------------------------+

Comments