DSSBressertSignAlert : Un Indicateur Efficace pour MetaTrader 5

Mike 2016.09.19 21:41 21 0 0
Pièce jointe

Bienvenue à tous les traders ! Aujourd'hui, je vais vous parler de l'indicateur DSSBressertSignAlert, un outil puissant pour MetaTrader 5 qui vous permet de recevoir des alertes directement sur votre plateforme. Grâce à cet indicateur, vous serez notifié par e-mail et push sur vos appareils mobiles, ce qui est idéal pour ne rien rater des opportunités de trading.

Pour mettre en place cet outil, plusieurs modifications ont été apportées au code de l'indicateur afin d'intégrer ces alertes :

  1. Ajout 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'email pour le signal
    input bool PushON=false; // Activer l'envoi de signal aux appareils mobiles
    
  2. 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,// Nom de l'indicateur pour les alertes
          double &BuyArrow[],// Buffer d'indicateur avec les signaux d'achat
          const int Rates_total,// Nombre actuel de barres
          const int Prev_calculated,// 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(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,"
     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);
         }
    
    //---
      }
    //+------------------------------------------------------------------+
    //| Fonction de signal de vente  |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,// Nom de l'indicateur pour les alertes
          double &SellArrow[],// Buffer d'indicateur avec les signaux de vente
          const int Rates_total,// Nombre actuel de barres
          const int Prev_calculated,// 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(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,"
     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);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Obtenir la période en tant que chaîne                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
  3. Appel des fonctions BuySignal() et SellSignal() après les cycles de calcul de l'indicateur dans le bloc OnCalculate()
    //--- 
       BuySignal("DSSBressertSignAlert",BuyBuffer,rates_total,prev_calculated,close,spread);
       SellSignal("DSSBressertSignAlert",SellBuffer,rates_total,prev_calculated,close,spread);
    //---

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

Il est prévu 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. Vous devez la copier dans le dossier <terminal_data_folder>\MQL5\Include. L'utilisation de ces classes est décrite en détail dans l'article "Averaging Price Series for Intermediate Calculations Without Using Additional Buffers".


Fig.1. L'indicateur DSSBressertSignAlert sur le graphique

Fig.1. L'indicateur DSSBressertSignAlert sur le graphique

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

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

Liste
Commentaire 0