Accueil Indicateur technique Publication

ColorXdinMA_Alert : l'indicateur incontournable pour MetaTrader 5

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

Auteur : dimeon

Découvrez le ColorXdinMA, un indicateur de moyenne mobile tendance qui propose des alertes et envoie des notifications par e-mail et sur mobile. C'est un outil essentiel pour les traders souhaitant rester informés des mouvements du marché.

Voici les améliorations apportées au code de l'indicateur pour intégrer les alertes, les messages par e-mail et les notifications push :

  1. Une énumération pour les options de génération de signaux a été déclarée au niveau global avant les variables d'entrée.
    //+----------------------------------------------------+
    //| Énumération pour les options de génération de signaux |
    //+----------------------------------------------------+
    enum ENUM_SIGNAL_MODE
      {
       MODE_SIGNAL,  //Signaux de cassure
       MODE_TREND    //Signaux de cassure et de tendance
      };
  2. Nouveaux paramètres d'entrée ont été ajoutés
    //---- Variables d'entrée pour les alertes
    input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Mode de génération de signal
    input uint NumberofBar=1;                    //Nombre de la barre pour générer un 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 signaux sur mobile
  3. Ajout de trois nouvelles fonctions à la fin du code de l'indicateur : BuySignal(), SellSignal() et GetStringTimeframe()
    //+------------------------------------------------------------------+
    //| Fonction d'achat signal                                            |
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,// texte du nom de l'indicateur pour les e-mails et notifications push
                   double &ColorArray[],// tampon d'index de couleur
                   int ColorIndex,// index de couleur dans le tampon d'index de couleur pour générer un signal
                   const int Rates_total,     // le nombre actuel de barres
                   const int Prev_calculated, // le nombre de barres sur le 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(ColorArray);
       int index,index1;
       if(SeriesTest)
         {
          index=int(NumberofBar);
          index1=index+1;
         }
       else
         {
          index=Rates_total-int(NumberofBar)-1;
          index1=index-1;
         }
       if(SignMode==MODE_SIGNAL)
         {
          if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) BuySignal=true;
         }
       else
         {
          if(ColorArray[index]==ColorIndex) 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+=_Point*Spread[index];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriod=GetStringTimeframe(ChartPeriod());
          if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
            {
             if(SoundON) Alert("Signal d'achat Ask=",Ask," Bid=",Bid," currtime=",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);
            }
          else
            {
             if(SoundON) Alert("Signal de tendance haussière Ask=",Ask," Bid=",Bid," currtime=",text," Symbole=",Symbol()," Période=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": Alerte signal de tendance haussière","Signal d'achat à Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbole="+Symbol()+" Période="+sPeriod);
             if(PushON) SendNotification(SignalSirname+": Signal de tendance haussière à Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbole="+Symbol()+" Période="+sPeriod);
            }
         }

    //---
      }
    //+------------------------------------------------------------------+
    //| Fonction de vente signal                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,// texte du nom de l'indicateur pour les e-mails et notifications push
                    double &ColorArray[],       // tampon d'index de couleur
                    int ColorIndex,             // index de couleur dans le tampon d'index de couleur pour générer un signal
                    const int Rates_total,     // le nombre actuel de barres
                    const int Prev_calculated, // le nombre de barres sur le 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(ColorArray);
       int index,index1;
       if(SeriesTest)
         {
          index=int(NumberofBar);
          index1=index+1;
         }
       else
         {
          index=Rates_total-int(NumberofBar)-1;
          index1=index-1;
         }

       if(SignMode==MODE_SIGNAL)
         {
          if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) SellSignal=true;
         }
       else
         {
          if(ColorArray[index]==ColorIndex) 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+=_Point*Spread[index];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriod=GetStringTimeframe(ChartPeriod());
          if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
            {
             if(SoundON) Alert("Signal de vente Ask=",Ask," Bid=",Bid," currtime=",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);
            }
          else
            {
             if(SoundON) Alert("Signal de tendance baissière Ask=",Ask," Bid=",Bid," currtime=",text," Symbole=",Symbol()," Période=",sPeriod);
             if(EMailON) SendMail(SignalSirname+": Alerte signal de tendance baissière","Signal de vente à Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbole="+Symbol()+" Période="+sPeriod);
             if(PushON) SendNotification(SignalSirname+": Signal de tendance baissière à 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));
    //----
      }
  4. Ajout d'appels à BuySignal() et SellSignal() après les cycles de calcul de l'indicateur dans le bloc OnCalculate()
    //---    
       BuySignal("ColorXdinMA_Alert",ColorXdinMA,1,rates_total,prev_calculated,close,spread);
       SellSignal("ColorXdinMA_Alert",ColorXdinMA,2,rates_total,prev_calculated,close,spread);
    //--- 

    ColorXdinMA est le nom du tampon d'index de couleur pour stocker les couleurs de l'indicateur. Les valeurs 1 et 2 correspondent aux couleurs dans ce tampon, indiquant respectivement une moyenne mobile en hausse ou en baisse.

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

    L'indicateur utilise les classes de la bibliothèque SmoothAlgorithms.mqh (à copier dans <terminal_data_folder>\MQL5\Include). L'utilisation de ces classes a été détaillée dans l'article "Averaging Price Series for Intermediate Calculations Without Using Additional Buffers".

    Fig1. L'indicateur ColorXdinMA_Alert sur le graphique

    Fig1. L'indicateur ColorXdinMA_Alert sur le graphique

    Fig.2. L'indicateur ColorXdinMA_Alert. Génération d'alerte pour signal de cassure

    Fig.2. L'indicateur ColorXdinMA_Alert. Génération d'alerte pour signal de cassure

    Fig.3. L'indicateur ColorXdinMA_Alert. Génération d'alerte pour signal de tendance

    Fig.3. L'indicateur ColorXdinMA_Alert. Génération d'alerte pour signal de tendance

    Articles connexes

Commentaire (0)