JBrainTrend1Stop_Alert : L'indicateur tendance pour MetaTrader 5 avec alertes

Mike 2017.01.20 02:09 37 0 0
Pièce jointe

JBrainTrend1Stop est un indicateur de tendance qui inclut des alertes, des emails et des notifications push.

Voici les modifications apportées au code de l'indicateur pour mettre en place les alertes, les messages email et les notifications push :

  1. Ajout de nouveaux paramètres d'entrée :
    input uint NombreDeBarres=1;// Nombre de barres pour le signal
    input bool SonON=true; // Activer les alertes
    input uint NombreDAlertes=2;// Nombre d'alertes
    input bool EmailON=false; // Activer l'envoi du signal par email
    input bool PushON=false; // Activer l'envoi du signal sur mobile
    
  2. Ajout de trois nouvelles fonctions à la fin du code de l'indicateur : BuySignal(), SellSignal() et GetStringTimeframe() :
    //+------------------------------------------------------------------+
    //| Fonction d'achat signal                                              |
    //+------------------------------------------------------------------+
    void BuySignal(string NomDuSignal,      // texte du nom de l'indicateur pour les messages email et push
                   double &FlècheAchat[],        // tampon de l'indicateur avec des signaux pour une tendance haussière
                   double &FlècheVente[],       // tampon de l'indicateur avec des signaux pour une tendance baissière
                   const int TotauxDeBarres,     // nombre actuel de barres
                   const int PrécédentCalculé, // nombre de barres sur le tick précédent
                   const double &Fermeture[],     // prix de clôture
                   const int &Spread[])       // spread
      {
    //---
       static uint compteur=0;
       if(TotauxDeBarres!=PrécédentCalculé) compteur=0;

       bool SignalAchat=false;
       bool TestSérie=ArrayGetAsSeries(FlècheAchat);
       int index,index1;
       if(TestSérie)
         {
          index=int(NombreDeBarres);
          index1=index+1;
         }
       else
         {
          index=TotauxDeBarres-int(NombreDeBarres)-1;
          index1=index-1;
         }
       if(FlècheVente[index1] && FlècheVente[index1]!=EMPTY_VALUE && FlècheAchat[index] && FlècheAchat[index]!=EMPTY_VALUE) SignalAchat=true;
       if(SignalAchat && compteur<=NombreDAlertes)
         {
          compteur++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string texte=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          TestSérie=ArrayGetAsSeries(Fermeture);
          if(TestSérie) index=int(NombreDeBarres);
          else index=TotauxDeBarres-int(NombreDeBarres)-1;
          double Demande=Fermeture[index];
          double Offre=Fermeture[index];
          TestSérie=ArrayGetAsSeries(Spread);
          if(TestSérie) index=int(NombreDeBarres);
          else index=TotauxDeBarres-int(NombreDeBarres)-1;
          Offre+=_Point*Spread[index];
          string sDemande=DoubleToString(Demande,_Digits);
          string sOffre=DoubleToString(Offre,_Digits);
          string sPériode=GetStringTimeframe(ChartPeriod());
          if(SonON) Alert("Signal d'ACHAT \n Demande=",Demande,"\n Offre=",Offre,"\n temps courant=",texte,"\n Symbole=",Symbol()," Période=",sPériode);
          if(EmailON) SendMail(NomDuSignal+": Alerte d'ACHAT","Signal d'ACHAT à Demande="+sDemande+", Offre="+sOffre+", Date="+texte+" Symbole="+Symbol()+" Période="+sPériode);
          if(PushON) SendNotification(NomDuSignal+": Signal d'ACHAT à Demande="+sDemande+", Offre="+sOffre+", Date="+texte+" Symbole="+Symbol()+" Période="+sPériode);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //| Fonction de vente signal                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string NomDuSignal,      // texte du nom de l'indicateur pour les messages email et push
                    double &FlècheVente[],       // tampon de l'indicateur avec des signaux pour une tendance baissière
                    double &FlècheAchat[],        // tampon de l'indicateur avec des signaux pour une tendance haussière
                    const int TotauxDeBarres,     // nombre actuel de barres
                    const int PrécédentCalculé, // nombre de barres sur le tick précédent
                    const double &Fermeture[],     // prix de clôture
                    const int &Spread[])       // spread
      {
    //---
       static uint compteur=0;
       if(TotauxDeBarres!=PrécédentCalculé) compteur=0;

       bool SignalVente=false;
       bool TestSérie=ArrayGetAsSeries(FlècheVente);
       int index,index1;
       if(TestSérie)
         {
          index=int(NombreDeBarres);
          index1=index+1;
         }
       else
         {
          index=TotauxDeBarres-int(NombreDeBarres)-1;
          index1=index-1;
         }
       if(FlècheAchat[index1] && FlècheAchat[index1]!=EMPTY_VALUE && FlècheVente[index] && FlècheVente[index]!=EMPTY_VALUE) SignalVente=true;
       if(SignalVente && compteur<=NombreDAlertes)
         {
          compteur++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string texte=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          TestSérie=ArrayGetAsSeries(Fermeture);
          if(TestSérie) index=int(NombreDeBarres);
          else index=TotauxDeBarres-int(NombreDeBarres)-1;
          double Demande=Fermeture[index];
          double Offre=Fermeture[index];
          TestSérie=ArrayGetAsSeries(Spread);
          if(TestSérie) index=int(NombreDeBarres);
          else index=TotauxDeBarres-int(NombreDeBarres)-1;
          Offre+=_Point*Spread[index];
          string sDemande=DoubleToString(Demande,_Digits);
          string sOffre=DoubleToString(Offre,_Digits);
          string sPériode=GetStringTimeframe(ChartPeriod());
          if(SonON) Alert("Signal de VENTE \n Demande=",Demande,"\n Offre=",Offre,"\n temps courant=",texte,"\n Symbole=",Symbol()," Période=",sPériode);
          if(EmailON) SendMail(NomDuSignal+": Alerte de VENTE","Signal de VENTE à Demande="+sDemande+", Offre="+sOffre+", Date="+texte+" Symbole="+Symbol()+" Période="+sPériode);
          if(PushON) SendNotification(NomDuSignal+": Signal de VENTE à Demande="+sDemande+", Offre="+sOffre+", Date="+texte+" Symbole="+Symbol()+" Période="+sPériode);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Récupération de la période sous forme de chaîne                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
  3. Ajout de quelques appels aux fonctions BuySignal() et SellSignal() après les cycles de calcul de l'indicateur dans le bloc OnCalculate() :
    //---    
       BuySignal("JBrainTrend1Stop_Alert",FlècheAchat,FlècheVente,totaux_de_barres,précédent_calculé,fermeture,spread);
       SellSignal("JBrainTrend1Stop_Alert",FlècheVente,FlècheAchat,totaux_de_barres,précédent_calculé,fermeture,spread);
    //---  

Les tampons FlècheAchat et FlècheVente sont les noms des tampons de l'indicateur pour stocker les signaux de tendance haussière et baissière (lignes d'arrêt pour les achats et les ventes). Une valeur zéro ou EMPTY_VALUE doit figurer dans les tampons de l'indicateur s'il n'y a pas de tendance appropriée.

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

Placez le fichier compilé de l'indicateur JMA.mq5 dans MQL5\Indicators.


Fig.1. Indicateur JBrainTrend1Stop_Alert sur le graphique

Fig.1. Indicateur JBrainTrend1Stop_Alert sur le graphique

Fig.2. Indicateur JBrainTrend1Stop_Alert. Génération d'alertes

Fig.2. Indicateur JBrainTrend1Stop_Alert. Génération d'alertes

Liste
Commentaire 0