exp_breakout_signals

Author: Tapochun
Miscellaneous
It plays sound alertsIt issuies visual alerts to the screenIt sends emailsIt opens Message Boxes to the user
0 Views
0 Downloads
0 Favorites
exp_breakout_signals
ÿþ//+------------------------------------------------------------------+

//|                                         exp_breakout_signals.mq5 |

//|                                                         Tapochun |

//|                           https://www.mql5.com/ru/users/tapochun |

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

#property copyright "Tapochun"

#property link      "https://www.mql5.com/ru/users/tapochun"

#property version   "1.00"

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

//| 5@A88																				|

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

//--- 1.00:  01>G0O 25@A8O;

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

//| ;>10;L=K5 ?5@5<5==K5															|

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

enum ENUM_ADD_MODE      // 5@5G8A;5=85 - @568<K 4>102;5=8O >1J5:B>2 

  {

   ADD_MODE_ALL,         // >102;OBL 2A5 ;8=88

   ADD_MODE_MESSAGE      // >102;OBL ;8=88 ?> 70?@>AC

  };

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

//|                                                                  |

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

enum ENUM_SIGNAL_MODE   // 5@5G8A;5=85 - @568< ?>40G8 A83=0;0

  {

   SIGNAL_MODE_SOUND,   // 2C:>2>9 A83=0;

   SIGNAL_MODE_ALERT,   // ;5@B =0 M:@0=

   SIGNAL_MODE_PUSH,// CH-C254><;5=85 =0 B5;5D>=

   SIGNAL_MODE_MAIL      // !>>1I5=85 =0 ?>GBC

  };

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

//| E>4=K5 ?0@0<5B@K																|

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

sinput   string             inpPrefix="bot_";               	// @5D8:A @01>G8E ;8=89

sinput   ENUM_ADD_MODE      inpAddMode=ADD_MODE_MESSAGE;      	//  568< 4>102;5=8O ;8=89

sinput   ENUM_SIGNAL_MODE    inpSignalMode=SIGNAL_MODE_SOUND;  //  568< ?>40G8 A83=0;>2

sinput   string            inpSoundName="Alert2.wav";         	// <O 72C:>2>3> D09;0 (4;O @568<0 72C:>2>3> D09;0)

sinput   bool               inpDelObjects=false;               // #40;OBL @01>G85 ;8=88 ?@8 C40;5=88 M:A?5@B0?

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

//| Expert initialization function                                   |

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

int OnInit()

  {

//--- @>25@O5< 2E>4=K5 ?0@0<5B@K

   if(!CheckInputParameters())      	// A;8 ?@>25@:0 =5 ?@>945=0

      return(INIT_FAILED);            	// KE>48< A >H81:>9

//--- >4?8AK205<AO =0 A>1KB85 A>740=85 3@0D. >1J5:B>2

   ChartSetInteger(0,CHART_EVENT_OBJECT_CREATE,true);

//---

   return( INIT_SUCCEEDED );

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason) // >4 ?@8G8=K 458=8F80;870F88

  {

//--- @>25@8< =5>1E>48<>ABL C40;5=8O @01>G8E ;8=89

   if(reason==REASON_REMOVE && inpDelObjects) // A;8 M:A?5@B C40;5= A 3@0D8:0 8 =C6=> C40;8BL @01>G85 ;8=88

     {

      ObjectsDeleteAll( 0, inpPrefix, 0, OBJ_HLINE );   // #40;O5< @01>G85 3>@87>=B0;L=K5 ;8=88

      ChartRedraw();                                    // 5@5@8A>2K205< 3@0D8:

     }

  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

//--- !>E@0=5==>5 2@5<O >B:@KB8O 10@0

   static datetime savedTime=0;

//--- @>25@O5< >1@07>20=85 =>2>3> 10@0

   if(!IsNewBar(savedTime))         // A;8 =>2K9 10@ =5 >1@07>20=

      return;                           // KE>48<

//--- @>25@O5< >1@07>20=85 A83=0;>2

   CheckSignals();

  }

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

//| @>25@O5< >1@07>20=85 A83=0;>2												|

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

void CheckSignals()

  {

//--- 1I55 :>;8G5AB2> ;8=89 2 3;02=>< >:=5

   const int total=ObjectsTotal(0,0,OBJ_HLINE);

   if(total<=0) // A;8 ;8=88 >BACBAB2CNB

      return;                              // KE>48<

//--- >;CG05< F5=K >B:@KB8O 8 70:@KB8O AD>@<8@>20==>9 A25G8

   MqlRates rates[2];                  // 0AA82 - ?@85<=8:

//--- >;CG5=85..

   if(CopyRates(_Symbol,_Period,0,2,rates)!=2) // A;8 40==K5 =5 ?>;CG5=K

     {

      Print(__FUNCTION__,": ( #",GetLastError(),": 40==K5 42CE ?>A;54=8E A25G59 =5 ?>;CG5=K!");

      return;                                                // KE>48< A >H81:>9

     }

//--- <O ;8=88

   string name;

//--- "5:A5 A>>1I5=8O

   string text;

//--- &5=0 ;8=88

   double price;

//--- &8:; ?> ;8=8O<

   for(int i=0; i<total; i++)

     {

      //--- <O ;8=88

      name=ObjectName(0,i,0,OBJ_HLINE);

      //--- @>25@O5<, >B=>A8BAO ;8 ;8=8O : @01>G8<

      if(StringFind(name,inpPrefix)<0) // A;8 ?>4AB@>:0 =5 =0945=0

         continue;                              // 5@5E>48< : A;54. >1J5:BC

      //--- ?@545;O5< F5=C ;8=88

      price=ObjectGetDouble(0,name,OBJPROP_PRICE,0);

      //--- @>25@O5<, 1K;0 ;8 ?5@5A5G5=0 ;8=8O ?@54K4CI59 A25G59

      if(( rates[0].high>price && rates[0].low<price) || // A;8 1K;> ?5@5A5G5=85 =0 AD>@<8@>20==>9 A25G5 8;8..

         (rates[ 1 ].open > price && rates[ 0 ].open < price ) ||      // ..5A;8 1K;> ?5@5A5G5=85 3M?>< 225@E 8;8..

         ( rates[ 1 ].open < price && rates[ 0 ].open > price ) )      // ..5A;8 1K;> ?5@5A5G5=85 3M?>< 2=87

        {

         //--- $>@<8@C5< B5:AB A>>1I5=8O

         text=_Symbol+": ?5@5A5G5=85 ;8=88 '"+name+"'";

         //--- 8=8O 1K;0 ?5@5A5G5=0! !83=0;!

         switch(inpSignalMode) //  7028A8<>AB8 >B B8?0 A83=0;0

           {

            case SIGNAL_MODE_SOUND:                  // 2C:>2>9 A83=0;

               if(!PlaySound(inpSoundName))

               Print(__FUNCTION__,": ( #",GetLastError(),": 72C:>2>9 D09; '"+inpSoundName+"' =5 2>A?@>872545=!");

               break;

            case SIGNAL_MODE_ALERT:                  // ;5@B

               Alert(text);

               break;

            case SIGNAL_MODE_PUSH:                     // CH-A>>1I5=85

               if(!SendNotification(text))

               Print(__FUNCTION__,": ( #",GetLastError(),": ?CH-A>>1I5=85 =5 >B?@02;5=>!");

               break;

            case SIGNAL_MODE_MAIL:                     // !>>1I5=85 =0 ?>GBC

               if(!SendMail("MT5: "+text,text))

               Print(__FUNCTION__,": ( #",GetLastError(),": A>>1I5=85 =0 ?>GBC =5 >B?@02;5=>!");

               break;

            default:                                 // 58725AB=K9 B8? A83=0;0

               Print(__FUNCTION__,": (! 58725AB=K9 B8? A83=0;0 '"+EnumToString(inpSignalMode)+"'");

               return;

           }

        }

     }

  }

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

//| ChartEvent function                                              |

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

void OnChartEvent(const int id,

                  const long &lparam,

                  const double &dparam,

                  const string &sparam)

  {

   if(id==CHARTEVENT_OBJECT_CREATE)

     {

      //--- @>25@O5< B8? 3@0D. >1J5:B0

      if(ObjectGetInteger(0,sparam,OBJPROP_TYPE)!=OBJ_HLINE) // A;8 A>740=0 =5 3>@. ;8=8O

         return;                                                         // KE>48<

      //--- >2>5 8<O 3@0D. >1J5:B0

      const string name=inpPrefix+sparam;

      //--- @>25@O5<, :0:8< >1@07>< =C6=> 4>102;OBL >1J5:B

      if( inpAddMode == ADD_MODE_ALL )                        // A;8 2 @01>BC 4>102;ONBAO 2A5 3>@87>=B0;L=K5 ;8=88

         ObjectSetString( 0,sparam,OBJPROP_NAME,name );      // >102;O5< : 8<5=8 ;8=88 ?>ABD8:A

      else if( inpAddMode == ADD_MODE_MESSAGE )               // A;8 2 @01>BC 4>102;ONBAO 3>@. ;8=88 ?> 70?@>AC

        {

         //--- #AB0=02;8205< ?0@0<5B@K B5:AB0 8 703>;>2:0 >:=0

         const string text=">1028BL ;8=8N '"+sparam+"' : A?8A:C @01>G8E?";

         const string caption=">102;5=85 ;8=88";

         //--- 0?CA: 1>:A0. >;CG05< >B25B

         const int answer=MessageBox(text,caption,MB_YESNO|MB_ICONQUESTION);

         if( answer == IDYES )                                 // A;8 =060B0 :=>?:0 "40"

            ObjectSetString( 0,sparam,OBJPROP_NAME, name );   // >102;O5< : 8<5=8 ;8=88 ?>ABD8:A

        }

      //--- 5@5@8A>2K205< 3@0D8:

      ChartRedraw();

     }

  }

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

//| @>25@:0 2E>4=KE ?0@0<5B@>2													|

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

bool CheckInputParameters()

  {

//--- @>25@O5< @07@5H5=8O 4;O =5:>B>@KE @568<>2 A83=0;0

   switch(inpSignalMode) //  7028A8<>AB8 >B @568<0 A83=0;0

     {

      case SIGNAL_MODE_SOUND:            // A;8 72C:>2>5 >?>25I5=85

         if(inpSoundName=="") // A;8 8<O 72C:>2>3> D09;0 =5 C:070=>

           {

            Print(__FUNCTION__,": (! 5>1E>48<> C:070BL 8<O 72C:>2>3> D09;0!");

            return(false);               // KE>48< A >H81:>9

           }

         else                            // A;8 8<O C:070=>

         return(true);               // >72@0I05< 8AB8=C

      case SIGNAL_MODE_ALERT:            // A;8 >?>25I5=85 0;5@B><

         return( true );                  // >72@0I05< 8AB8=C

      case SIGNAL_MODE_PUSH:               // A;8 >?>25I5=85 ?CH-C254><;5=85<

         if(!TerminalInfoInteger(TERMINAL_NOTIFICATIONS_ENABLED))   // A;8 ?CH-C254><;5=8O >B:;NG5=K

           {

            Print(__FUNCTION__,": (! 5>1E>48<> @07@5H8BL >B?@02:C ?CH-A>>1I5=89 =0 B5;5D>=!");

            return(false);               // KE>48< A >H81:>9

           }

         else                            // A;8 ?CH-C254><;5=8O @07@5H5=K

         return(true );               // >72@0I05< 8AB8=C

      case SIGNAL_MODE_MAIL:               // A;8 >?>25I5=8O =0 ?>GBC

         if(!TerminalInfoInteger(TERMINAL_EMAIL_ENABLED))            // A;8 >?>25I5=8O =0 ?>GBC >B:;NG5=K

           {

            Print(__FUNCTION__,": (! 5>1E>48<> @07@5H8BL >B?@02:C A>>1I5=89 =0 ?>GBC!");

            return(false);               // KE>48< A >H81:>9

           }

         else                            // A;8 >?>25I5=8O =0 ?>GBC 2:;NG5=K

         return(true);               // >72@0I05< 8AB8=C

      default:                            // A;8 =58725AB=K9 @568< A83=0;0

         Print(__FUNCTION__,": (! 58725AB=K9 @568< A83=0;0 '"+EnumToString(inpSignalMode)+"'");

         return(false);                  // KE>48< A >H81:>9

     }

//--- A;8 2A5 ?@>25@:8 ?@>945=K

   return(true);                        // >72@0I05< 8AB8=C

  }

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

//| @>25@:0 D>@<8@>20=8O =>2>3> 10@0											|

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

bool IsNewBar(datetime &savedTime) // !>E@0=5==>5 2@5<O >B:@KB8O (out)

  {

//--- >;CG05< 2@5<O >B:@KB8O ?>A;54=53> 10@0 ?> A8<2>;C/?5@8>4C

   datetime currentTime=(datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE);

//---

   if(savedTime==0) // A;8 ?5@2K9 70?CA:

     {

      savedTime = currentTime;            // 0?><8=05< 2@5<O D>@<8@>20=8O 10@0

      return(false );                     // >72@0I05< ;>6L

     }

   else                                  // A;8 =5 ?5@2K9 70?CA:

     {

      if(savedTime!=currentTime) // A;8 A>E@0=5==>5 2@5<O =5 @02=> 2@5<5=8 >B:@KB8O B5:CI59 A25G8

        {

         savedTime = currentTime;         // !>E@0=O5< 2@5<O >B:@KB8O B5:CI59 A25G8

         return( true );                  // >72@0I05< 8AB8=C

        }

      else                               // A;8 A>E@0=5==>5 2@5<O A>2?0405B A> 2@5<5=5< B5:CI59

      return(false);                  // >72@0I05< ;>6L

     }

  }

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

Comments