Manual Close Alarm Two Lines

Author: Copyright © 2020, Vladimir Karputov
Price Data Components
Miscellaneous
It plays sound alertsIt issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
Manual Close Alarm Two Lines
ÿþ//+------------------------------------------------------------------+

//|                                 Manual Close Alarm Two Lines.mq5 |

//|                              Copyright © 2020, Vladimir Karputov |

//|                     https://www.mql5.com/ru/market/product/43516 |

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

#property copyright "Copyright © 2020, Vladimir Karputov"

#property link      "https://www.mql5.com/ru/market/product/43516"

#property version   "1.000"

/*

   barabashkakvn Trading engine 3.117

*/

#include <Trade\PositionInfo.mqh>

#include <Trade\Trade.mqh>

#include <Trade\SymbolInfo.mqh>

//---

CPositionInfo  m_position;                   // object of CPositionInfo class

CTrade         m_trade;                      // object of CTrade class

CSymbolInfo    m_symbol;                     // object of CSymbolInfo class

//--- input parameters

input string   InpLine_0_Name = "Line 0";  // "Line 0" Name

input string   InpLine_1_Name = "Line 1";  // "Line 1" Name

//--- alerts

input string   InpSoundIntersectionName   = "alert.wav";    // "Signal: Intersection" Sound Name

input string   InpSoundCloseName          = "alert2.wav";   // "Signal: Close" Sound Name

input uchar    InpSoundRepetitions        = 3;              // Repetitions

input uchar    InpSoundPause              = 3;              // Pause, in seconds

//---

datetime m_last_signal     = 0;     // "0" -> D'1970.01.01 00:00';

datetime m_prev_bars       = 0;     // "0" -> D'1970.01.01 00:00';

datetime m_last_sound      = 0;     // "0" -> D'1970.01.01 00:00';

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

//| Expert initialization function                                   |

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

int OnInit()

  {



//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---



  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

//--- search for trading signals no more than once every 10 seconds

   datetime time_current=TimeCurrent();

   if(time_current-m_last_signal>10)

     {

      //--- search for "Line 0" and "Line 1" objects every 10 seconds

      if(ObjectFind(0,InpLine_0_Name)<0 || ObjectFind(0,InpLine_1_Name)<0)

        {

         //--- pause minimum 10 seconds

         m_last_signal=time_current;

         return;

        }

      double price_line_0=ObjectGetDouble(0,InpLine_0_Name,OBJPROP_PRICE);

      double price_line_1=ObjectGetDouble(0,InpLine_1_Name,OBJPROP_PRICE);

      if(price_line_0==0.0 || price_line_1==0.0)

        {

         //--- pause minimum 10 seconds

         m_last_signal=time_current;

         return;

        }

      double price_up=0,price_down=0;

      if(price_line_0>price_line_1)

        {

         price_up=price_line_0;

         price_down=price_line_1;

        }

      else

        {

         price_up=price_line_1;

         price_down=price_line_0;

        }



      m_last_signal=time_current;

      //--- we work only at the time of the birth of new bar

      datetime time_0=iTime(Symbol(),Period(),0);

      if(time_0==m_prev_bars)

         return;



      m_last_sound   = 0;        // "0" -> D'1970.01.01 00:00';

      m_prev_bars    = time_0;   //



      MqlRates rates[];

      ArraySetAsSeries(rates,true);

      int start_pos=0,count=3;

      if(CopyRates(Symbol(),0,start_pos,count,rates)!=count)

        {

         m_last_signal=0;

         m_prev_bars=0;

         return;

        }

      //---

      int count_buys=0,count_sells=0;

      CalculateAllPositions(count_buys,count_sells);

      if(count_buys+count_sells==0 || count_buys>1 || count_sells>1 || (count_buys>0 && count_sells>0))

        {

         //--- pause minimum 10 seconds

         m_prev_bars=0;

         return;

        }



      for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positions

         if(m_position.SelectByIndex(i))

            if(m_position.Symbol()==Symbol() && m_position.Magic()==0)

              {

               double price_current = m_position.PriceCurrent();

               double price_open    = m_position.PriceOpen();

               //---

               if(m_position.PositionType()==POSITION_TYPE_BUY)

                 {

                  if(rates[1].close<price_down)

                     if(rates[2].close>price_down)

                       {

                        PlaySound(InpSoundCloseName);

                        Alert("Close #1 ("+

                              DoubleToString(rates[1].close,Digits())+

                              "), intersection \"price down\" ("+

                              DoubleToString(price_down,Digits())+

                              ")");

                        m_last_sound=time_current;

                        m_trade.PositionClose(m_position.Ticket());

                       }

                  if(rates[1].close<price_up)

                     if(rates[2].close>price_up)

                       {

                        PlaySound(InpSoundIntersectionName);

                        Alert("Close #1 ("+

                              DoubleToString(rates[1].close,Digits())+

                              "), intersection \"price up\" ("+

                              DoubleToString(price_up,Digits())+

                              ")");

                        m_last_sound=time_current;

                       }

                 }

               else

                 {

                  if(rates[1].close>price_up)

                     if(rates[2].close<price_up)

                       {

                        PlaySound(InpSoundCloseName);

                        Alert("Close #1 ("+

                              DoubleToString(rates[1].close,Digits())+

                              "), intersection \"price up\" ("+

                              DoubleToString(price_up,Digits())+

                              ")");

                        m_last_sound=time_current;

                        m_trade.PositionClose(m_position.Ticket());

                       }

                  if(rates[1].close>price_down)

                     if(rates[2].high<price_down || rates[2].low<price_down)

                       {

                        PlaySound(InpSoundIntersectionName);

                        Alert("Close #1 ("+

                              DoubleToString(rates[1].close,Digits())+

                              "), intersection \"price down\" ("+

                              DoubleToString(price_down,Digits())+

                              ")");

                        m_last_sound=time_current;

                       }

                 }

              }

     }

  }

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

//| Calculate all positions Buy and Sell                             |

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

void CalculateAllPositions(int &count_buys,int &count_sells)

  {

   count_buys=0;

   count_sells=0;



   for(int i=PositionsTotal()-1; i>=0; i--)

      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties

         if(m_position.Symbol()==Symbol() && m_position.Magic()==0)

           {

            if(m_position.PositionType()==POSITION_TYPE_BUY)

               count_buys++;



            if(m_position.PositionType()==POSITION_TYPE_SELL)

               count_sells++;

           }

//---

   return;

  }

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

Comments