BykovTrendAlert – indicator for MetaTrader 5

  • Platform: Metatrader5
  • Currency pairs: Any pairs, indices and metals
  • Trading Time: Around the clock
  • Recommended broker: icmarkets, XM
  • Real author:

    Ramdass – Conversion only

    The BykovTrend semaphore signal indicator, which features alerts, sending emails and push-notifications to mobile devices.

    The following changes have been made to the indicator code in order to implement the alerts, email messages and push-notifications:

    1. Introduced new input parameters
      input uint NumberofBar=1;//Bar number for the signal
      input bool SoundON=true; //Enable alerts
      input uint NumberofAlerts=2;//Number of alerts
      input bool EMailON=false; //Enable mailing the signal
      input bool PushON=false; //Enable sending the signal to mobile devices
      
    2. Added three new functions to the end of the indicator code: BuySignal(), SellSignal() and GetStringTimeframe()
      //+------------------------------------------------------------------+
      //| Buy signal function                                              |
      //+------------------------------------------------------------------+
      void BuySignal(string SignalSirname,      // text of the indicator name for email and push messages
                     double &BuyArrow[],        // indicator buffer with buy signals
                     const int Rates_total,     // the current number of bars
                     const int Prev_calculated, // the number of bars on the previous tick
                     const double &Close[],     // close price
                     const int &Spread[])       // spread
        {
      //---
         static uint counter=0;
         if(Rates_total!=Prev_calculated) counter=0;
      
         bool BuySignal=false;
         bool SeriesTest=ArrayGetAsSeries(BuyArrow);
         int index;
         if(SeriesTest) index=int(NumberofBar);
         else index=Rates_total-int(NumberofBar)-1;
         if(NormalizeDouble(BuyArrow[index],_Digits) && BuyArrow[index]!=EMPTY_VALUE) BuySignal=true;
         if(BuySignal && counter<=NumberofAlerts)
           {
            counter++;
            MqlDateTime tm;
            TimeToStruct(TimeCurrent(),tm);
            string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
            SeriesTest=ArrayGetAsSeries(Close);
            if(SeriesTest) index=int(NumberofBar);
            else index=Rates_total-int(NumberofBar)-1;
            double Ask=Close[index];
            double Bid=Close[index];
            SeriesTest=ArrayGetAsSeries(Spread);
            if(SeriesTest) index=int(NumberofBar);
            else index=Rates_total-int(NumberofBar)-1;
            Bid+=Spread[index];
            string sAsk=DoubleToString(Ask,_Digits);
            string sBid=DoubleToString(Bid,_Digits);
            string sPeriod=GetStringTimeframe(ChartPeriod());
            if(SoundON) Alert("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
            if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
            if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
           }
      
      //---
        }
      //+------------------------------------------------------------------+
      //| Sell signal function                                             |
      //+------------------------------------------------------------------+
      void SellSignal(string SignalSirname,      // text of the indicator name for email and push messages
                      double &SellArrow[],       // indicator buffer with sell signals
                      const int Rates_total,     // the current number of bars
                      const int Prev_calculated, // the number of bars on the previous tick
                      const double &Close[],     // close price
                      const int &Spread[])       // spread
        {
      //---
         static uint counter=0;
         if(Rates_total!=Prev_calculated) counter=0;
      
         bool SellSignal=false;
         bool SeriesTest=ArrayGetAsSeries(SellArrow);
         int index;
         if(SeriesTest) index=int(NumberofBar);
         else index=Rates_total-int(NumberofBar)-1;
         if(NormalizeDouble(SellArrow[index],_Digits) && SellArrow[index]!=EMPTY_VALUE) SellSignal=true;
         if(SellSignal && counter<=NumberofAlerts)
           {
            counter++;
            MqlDateTime tm;
            TimeToStruct(TimeCurrent(),tm);
            string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
            SeriesTest=ArrayGetAsSeries(Close);
            if(SeriesTest) index=int(NumberofBar);
            else index=Rates_total-int(NumberofBar)-1;
            double Ask=Close[index];
            double Bid=Close[index];
            SeriesTest=ArrayGetAsSeries(Spread);
            if(SeriesTest) index=int(NumberofBar);
            else index=Rates_total-int(NumberofBar)-1;
            Bid+=Spread[index];
            string sAsk=DoubleToString(Ask,_Digits);
            string sBid=DoubleToString(Bid,_Digits);
            string sPeriod=GetStringTimeframe(ChartPeriod());
            if(SoundON) Alert("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
            if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
            if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
           }
      //---
        }
      //+------------------------------------------------------------------+
      //|  Getting the timeframe as a string                               |
      //+------------------------------------------------------------------+
      string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
        {
      //----
         return(StringSubstr(EnumToString(timeframe),7,-1));
      //----
        }
      
    3. Added a couple of calls to BuySignal() and SellSignal() functions after the indicator calculation cycles in the OnCalculate() block
      //---     
         BuySignal("BykovTrendAlert",BuyBuffer,rates_total,prev_calculated,close,spread);
         SellSignal("BykovTrendAlert",SellBuffer,rates_total,prev_calculated,close,spread);
      //--- 
      

    Where BuyBuffer and SellBuffer are the names of the indicator buffers for storing the buy and sell signals. As the empty values in the indicator buffers either zeros or EMPTY_VALUE must be set.

    It is assumed that the only one call to the BuySignal() and SellSignal() functions will be used in the OnCalculate() block of the indicator code.

    This indicator was first implemented in MQL4 and published in Code Base on 28.09.2007.

    Get E-Book Worth $100 for Free!!!

    Fig1. The BykovTrendAlert indicator on the chart

    Fig1. The BykovTrendAlert indicator on the chart


    Fig.2. The BykovTrendAlert indicator Generating alerts.

    Fig.2. The BykovTrendAlert indicator Generating alerts.

  • How to install MT5 indicator?
  • 1. On the desktop, double-click to open the MT45 trading platform software you installed.
  • 2. Click on “File” in the upper left corner – “Open Data Folder”, double-click the MQL5 folder, and double-click the Indicators folder
  • 3. Copy the metrics you need to install to the Indicators folder
  • 4. Open MT5, find “Navigator” in the display menu, then click “Technical Indicators” of “Navigator” and right click to refresh, you will see the indicator just copied.
  • 5. In the “Technical Indicators” of “Navigator”, find the indicator file just installed, double click or click manually to the chart window