Expert Advisors • Indicators • Scripts • Libraries

MQL.RobotFX.org is the biggest collection of MetaTrader expert advisors (MT5 & MT4), indicators, scripts and libraries that can be used to improve trading results, minimize risks or simply automate trading tasks

MetaTrader 5 Indicator | Harami_Alert

Real author:

Paul Stringer

The indicator defines Harami patterns and features alerts, emails and push notifications.

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]*_Point;        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]*_Point;        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("Harami_Alert",BuyBuffer,rates_total,prev_calculated,close,spread);     SellSignal("Harami_Alert",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 should 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.

Originally this indicator has been written in MQL4 and was first published in the Code Base on 14.06.2016.

MetaTrader Experts, Indicators, Scripts and Libraries

Fig. 1. Harami_Alert indicator on the chart

MetaTrader Experts, Indicators, Scripts and Libraries

Fig. 2. Harami_Alert. Generating alerts

22403