iMFISignAlert : Un Indicateur Essentiel pour MetaTrader 5

Mike 2016.07.20 23:44 46 0 0
Pièce jointe

Vous cherchez un indicateur qui vous aide à naviguer dans les zones de surachat et de survente sur MetaTrader 5 ? Ne cherchez pas plus loin ! L'iMFISignAlert est un indicateur basé sur l'oscillateur classique de l'indice de flux monétaire. Il vous alerte avec des notifications par e-mail et des push sur vos appareils mobiles.

Pour intégrer ces alertes, plusieurs modifications ont été apportées au code de l'indicateur :

  1. Introduction de nouveaux paramètres d'entrée :
    inputuint NumberofBar=1;// Nombre de barres pour le signalinputbool SoundON=true; // Activer les alertesinputuint NumberofAlerts=2;// Nombre d'alertesinputbool EMailON=false; // Activer l'envoi d'e-mails pour le signalinputbool PushON=false; // Activer l'envoi de notifications push
  2. Ajout de trois nouvelles fonctions à la fin du code : BuySignal(), SellSignal() et GetStringTimeframe()
    //+------------------------------------------------------------------+//| Fonction de signal d'achat                                            |//+------------------------------------------------------------------+void BuySignal(string SignalSirname,      // texte du nom de l'indicateur pour les e-mails et notifications
                   double &BuyArrow[],        // tampon d'indicateur avec des signaux d'achat
                   constint Rates_total,     // le nombre actuel de barres
                   constint Prev_calculated, // le nombre de barres lors du tick précédent
                   constdouble &Close[],     // prix de clôture
                   constint &Spread[])       // spread
      {
    //---
       staticuint 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;
          doubleAsk=Close[index];
          doubleBid=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("Signal d'ACHAT 
     Ask=",Ask,"
     Bid=",Bid,"
     heure actuelle=",text,"
     Symbole=",Symbol()," Période=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": Alerte signal d'ACHAT","Signal d'ACHAT à Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbole="+Symbol()+" Période="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": Signal d'ACHAT à Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbole="+Symbol()+" Période="+sPeriod);
         }
    
    //---
      }
    //+------------------------------------------------------------------+//| Fonction de signal de vente                                             |//+------------------------------------------------------------------+void SellSignal(string SignalSirname,      // texte du nom de l'indicateur pour les e-mails et notifications
                    double &SellArrow[],       // tampon d'indicateur avec des signaux de vente
                    constint Rates_total,     // le nombre actuel de barres
                    constint Prev_calculated, // le nombre de barres lors du tick précédent
                    constdouble &Close[],     // prix de clôture
                    constint &Spread[])       // spread
      {
    //---
       staticuint 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;
          doubleAsk=Close[index];
          doubleBid=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("Signal de VENTE 
     Ask=",Ask,"
     Bid=",Bid,"
     heure actuelle=",text,"
     Symbole=",Symbol()," Période=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": Alerte signal de VENTE","Signal de VENTE à Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbole="+Symbol()+" Période="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": Signal de VENTE à Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbole="+Symbol()+" Période="+sPeriod);
         }
    //---
      }
    //+------------------------------------------------------------------+//|  Obtenir la période sous forme de chaîne                           |//+------------------------------------------------------------------+string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. Ajout d'appels aux fonctions BuySignal() et SellSignal() après les cycles de calcul de l'indicateur dans le bloc OnCalculate()
    BuySignal("iWPRSign",BuyBuffer,rates_total,prev_calculated,close,spread);
        SellSignal("iWPRSign",SellBuffer,rates_total,prev_calculated,close,spread);
    

Où BuyBuffer et SellBuffer sont les noms des tampons d'indicateur pour stocker les signaux d'achat et de vente. Les valeurs vides dans les tampons d'indicateur doivent être soit des zéros, soit EMPTY_VALUE.

Il est supposé qu'un seul appel aux fonctions BuySignal() et SellSignal() sera utilisé dans le bloc OnCalculate() du code de l'indicateur.

Fig.1. L'indicateur iMFISignAlert sur le graphique

Fig.1. L'indicateur iMFISignAlert sur le graphique

Fig.2. L'indicateur iMFISignAlert. Génération d'alertes.

Fig.2. L'indicateur iMFISignAlert. Génération d'alertes.

Liste
Commentaire 0