Accueil Indicateur technique Publication

Harami Alert : L'indicateur incontournable pour MetaTrader 5

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

Réalisé par :

Paul Stringer

L'indicateur Harami Alert identifie les patterns Harami et propose des alertes, des notifications par email et des notifications push pour vous tenir informé.

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

  1. Ajout de nouveaux paramètres d'entrée :
    input uint NombreDeBar=1;// Nombre de bar pour le signal
    input bool SonON=true; // Activer les alertes
    input uint NombreDAlerts=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 de signal d'achat                                             |
    //+------------------------------------------------------------------+
    void BuySignal(string NomDuSignal,      // texte du nom de l'indicateur pour les messages email et push
              double &FlècheAchat[],        // tampon de l'indicateur avec les signaux d'achat
              const int TotalDesBars,    // nombre actuel de barres
              const int Précédent_calculé,// 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(TotalDesBars!=Précédent_calculé) compteur=0;
    
       bool SignalAchat=false;
       bool TestDeSérie=ArrayGetAsSeries(FlècheAchat);
       int index;
       if(TestDeSérie) index=int(NombreDeBar);
       else index=TotalDesBars-int(NombreDeBar)-1;
       if(NormalizeDouble(FlècheAchat[index],_Digits) && FlècheAchat[index]!=EMPTY_VALUE) SignalAchat=true;
       if(SignalAchat && compteur<=NombreDAlerts)
         {
          compteur++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string texte=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          TestDeSérie=ArrayGetAsSeries(Fermeture);
          if(TestDeSérie) index=int(NombreDeBar);
          else index=TotalDesBars-int(NombreDeBar)-1;
          double Demande=Fermeture[index];
          double Offre=Fermeture[index];
          TestDeSérie=ArrayGetAsSeries(Spread);
          if(TestDeSérie) index=int(NombreDeBar);
          else index=TotalDesBars-int(NombreDeBar)-1;
          Offre+=Spread[index]*_Point;
          string sDemande=DoubleToString(Demande,_Digits);
          string sOffre=DoubleToString(Offre,_Digits);
          string sPériode=GetStringTimeframe(ChartPeriod());
          if(SonON) Alert("Signal ACHAT 
     Demande=",Demande,"
     Offre=",Offre,"
     heure courante=",texte,"
     Symbole=",Symbol()," Période=",sPériode);
          if(EMailON) SendMail(NomDuSignal+": Alerte signal ACHAT","Signal ACHAT à Demande="+sDemande+", Offre="+sOffre+", Date="+texte+" Symbole="+Symbol()+" Période="+sPériode);
          if(PushON) SendNotification(NomDuSignal+": Signal ACHAT à Demande="+sDemande+", Offre="+sOffre+", Date="+texte+" Symbole="+Symbol()+" Période="+sPériode);
         }
    
    //---
      }
    //+------------------------------------------------------------------+
    //| Fonction de signal de vente                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string NomDuSignal,      // texte du nom de l'indicateur pour les messages email et push
              double &FlècheVente[],       // tampon de l'indicateur avec les signaux de vente
              const int TotalDesBars,     // nombre actuel de barres
              const int Précédent_calculé, // 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(TotalDesBars!=Précédent_calculé) compteur=0;
    
       bool SignalVente=false;
       bool TestDeSérie=ArrayGetAsSeries(FlècheVente);
       int index;
       if(TestDeSérie) index=int(NombreDeBar);
       else index=TotalDesBars-int(NombreDeBar)-1;
       if(NormalizeDouble(FlècheVente[index],_Digits) && FlècheVente[index]!=EMPTY_VALUE) SignalVente=true;
       if(SignalVente && compteur<=NombreDAlerts)
         {
          compteur++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string texte=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          TestDeSérie=ArrayGetAsSeries(Fermeture);
          if(TestDeSérie) index=int(NombreDeBar);
          else index=TotalDesBars-int(NombreDeBar)-1;
          double Demande=Fermeture[index];
          double Offre=Fermeture[index];
          TestDeSérie=ArrayGetAsSeries(Spread);
          if(TestDeSérie) index=int(NombreDeBar);
          else index=TotalDesBars-int(NombreDeBar)-1;
          Offre+=Spread[index]*_Point;
          string sDemande=DoubleToString(Demande,_Digits);
          string sOffre=DoubleToString(Offre,_Digits);
          string sPériode=GetStringTimeframe(ChartPeriod());
          if(SonON) Alert("Signal VENTE 
     Demande=",Demande,"
     Offre=",Offre,"
     heure courante=",texte,"
     Symbole=",Symbol()," Période=",sPériode);
          if(EMailON) SendMail(NomDuSignal+": Alerte signal VENTE","Signal VENTE à Demande="+sDemande+", Offre="+sOffre+", Date="+texte+" Symbole="+Symbol()+" Période="+sPériode);
          if(PushON) SendNotification(NomDuSignal+": Signal VENTE à Demande="+sDemande+", Offre="+sOffre+", Date="+texte+" Symbole="+Symbol()+" Période="+sPériode);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Récupérer 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("Harami_Alert",FlècheAchat,total_des_bars,précédent_calculé,fermeture,spread);
       SellSignal("Harami_Alert",FlècheVente,total_des_bars,précédent_calculé,fermeture,spread);
    //---   
    

Où FlècheAchat et FlècheVente sont les noms des tampons de l'indicateur pour stocker les signaux d'achat et de vente. Les valeurs vides dans les tampons de l'indicateur doivent être définies sur zéro ou EMPTY_VALUE.

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

À l'origine, cet indicateur a été écrit en MQL4 et a été publié pour la première fois dans la Base de Code le 14.06.2016.

Fig. 1. Indicateur Harami_Alert sur le graphique

Fig. 1. Indicateur Harami_Alert sur le graphique


Fig. 2. Harami_Alert. Génération d'alertes

Fig. 2. Harami_Alert. Génération d'alertes

Articles connexes

Commentaire (0)