Accueil Indicateur technique Publication

iMFISignAlert : Un Indicateur Essentiel pour MetaTrader 5

Pièce jointe
15843.zip (3.11 KB, Télécharger 0 fois)

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 :
    input uint NumberofBar=1;// Nombre de barres pour le signal
    input bool SoundON=true; // Activer les alertes
    input uint NumberofAlerts=2;// Nombre d'alertes
    input bool EMailON=false; // Activer l'envoi d'e-mails pour le signal
    input bool 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
                   const int Rates_total,     // le nombre actuel de barres
                   const int Prev_calculated, // le nombre de barres lors du tick précédent
                   const double &Close[],     // prix de clôture
                   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("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
                    const int Rates_total,     // le nombre actuel de barres
                    const int Prev_calculated, // le nombre de barres lors du tick précédent
                    const double &Close[],     // prix de clôture
                    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("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.

Articles connexes

Commentaire (0)