WeightOscillator_Alert : Un Indicateur Incontournable pour MetaTrader 5

Mike 2017.01.26 18:26 32 0 0
Pièce jointe

Le WeightOscillator est un indicateur de tendance pour MetaTrader 5 qui intègre des alertes, envoyant des notifications par e-mail et des push vers vos appareils mobiles.

Voici un aperçu des modifications apportées au code de l'indicateur pour mettre en place ces alertes :

  1. Déclaration d'une énumération pour les options de génération de signaux à portée globale avant la déclaration des variables d'entrée.
    //+----------------------------------------------------+
    //| Énumération pour les options de génération de signaux |
    //+----------------------------------------------------+
    enum ENUM_SIGNAL_MODE
      {
       MODE_SIGNAL,  // Signaux de rupture
       MODE_TREND    // Signaux de rupture et de tendance
      };
  2. Introduction de nouveaux paramètres d'entrée
    //---- 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 barres 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 signal vers des appareils mobiles
  3. Ajout de trois nouvelles fonctions à la fin du code de l'indicateur : BuySignal(), SellSignal() et GetStringTimeframe()
    //+------------------------------------------------------------------+
    //| Fonction de signal d'achat                                           |
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,// texte du nom de l'indicateur pour les e-mails et messages 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 de 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 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 signal de vente                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,// texte du nom de l'indicateur pour les e-mails et messages 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 de 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 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);
            }
         }
    //---
      }
    //+------------------------------------------------------------------+
    //| Récupération de la période sous forme de chaîne |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
  4. Ajout d'appels aux fonctions BuySignal() et SellSignal() après les cycles de calcul de l'indicateur dans le bloc OnCalculate()
    //---    
       BuySignal("WeightOscillator_Alert",ColorBuffer,0,rates_total,prev_calculated,close,spread);
       SellSignal("WeightOscillator_Alert",ColorBuffer,4,rates_total,prev_calculated,close,spread);
    //---  

Le buffer de couleur est le nom de l'index de couleur pour stocker les couleurs de l'indicateur. Les valeurs 0 et 4 représentent les couleurs dans ce buffer, indiquant respectivement que l'oscillateur est dans les zones de surachat et de survente.

Il est supposé 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 (copiez-la dans <terminal_data_folder> MQL5\nInclude). L'utilisation des classes a été décrite en détail dans l'article "Averaging Price Series for Intermediate Calculations Without Using Additional Buffers".

Fig1. L'indicateur WeightOscillator_Alert sur le graphique

Fig1. L'indicateur WeightOscillator_Alert sur le graphique

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

Fig.2. L'indicateur WeightOscillator_Alert. Génération d'alerte pour le signal de rupture

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

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

Liste
Commentaire 0