Waddah Attar Trend Alert : L'indicateur ultime pour MetaTrader 5

Mike 2017.01.20 01:59 54 0 0
Pièce jointe

Auteur original : Eng. Waddah Attar

L'indicateur Waddah_Attar_Trend propose des alertes, des emails et des notifications push.

Pour intégrer ces alertes et notifications, plusieurs modifications ont été apportées au code de l'indicateur :

  1. Ajout de nouveaux paramètres d'entrée :
    //---- Paramètres pour les alertes inputuint NombreDeBar=1;                    //Numéro de la barre pour le signalinputbool SonON=true;                     //Activer les alertesinputuint NombreAlertes=2;                 //Nombre d'alertesinputbool EMailON=false;                    //Activer l'envoi du signal par emailinputbool 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 NomSignal,// texte du nom de l'indicateur pour les messages email et push
    double &TableauCouleur[],// tampon d'index de couleur
    int IndexCouleur,// index de couleur dans le tampon d'index de couleur pour générer un signal
    constint TotalRates, // nombre actuel de barres
    constint Prev_calculated, // nombre de barres sur le tick précédent
    constdouble &Close[], // prix de clôture
    constint &Spread[]) // spread
    {
    //---
    staticuint compteur=0;
    if(TotalRates!=Prev_calculated) compteur=0;

    bool SignalAchat=false;
    bool TestSérie=ArrayGetAsSeries(TableauCouleur);
    int index,index1;
    if(TestSérie)
    {
    index=int(NombreDeBar);
    index1=index+1;
    }
    else
    {
    index=TotalRates-int(NombreDeBar)-1;
    index1=index-1;
    }
    if(TableauCouleur[index1]!=IndexCouleur && TableauCouleur[index]==IndexCouleur) SignalAchat=true;
    if(SignalAchat && compteur<=NombreAlertes)
    {
    compteur++;
    MqlDateTime tm;
    TimeToStruct(TimeCurrent(),tm);
    string texte=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
    TestSérie=ArrayGetAsSeries(Close);
    if(TestSérie) index=int(NombreDeBar);
    else index=TotalRates-int(NombreDeBar)-1;
    doubleAsk=Close[index];
    doubleBid=Close[index];
    TestSérie=ArrayGetAsSeries(Spread);
    if(TestSérie) index=int(NombreDeBar);
    else index=TotalRates-int(NombreDeBar)-1;
    Bid+=_Point*Spread[index];
    string sAsk=DoubleToString(Ask,_Digits);
    string sBid=DoubleToString(Bid,_Digits);
    string sPeriod=GetStringTimeframe(ChartPeriod());
    if(SonON) Alert("Signal d'ACHAT Ask=",Ask," Bid=",Bid," heure courante=",texte," Symbole=",Symbol()," Période=",sPeriod);
    if(EMailON) SendMail(NomSignal+": alerte signal d'ACHAT","Signal d'ACHAT à Ask="+sAsk+", Bid="+sBid+", Date="+texte+" Symbole="+Symbol()+" Période="+sPeriod);
    if(PushON) SendNotification(NomSignal+": Signal d'ACHAT à Ask="+sAsk+", Bid="+sBid+", Date="+texte+" Symbole="+Symbol()+" Période="+sPeriod);
    }

    //---
    }
    //+------------------------------------------------------------------+
    //| Fonction de signal de vente                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string NomSignal, // texte du nom de l'indicateur pour les messages email et push
    double &TableauCouleur[], // tampon d'index de couleur
    int IndexCouleur, // index de couleur dans le tampon d'index de couleur pour générer un signal
    constint TotalRates, // nombre actuel de barres
    constint Prev_calculated, // nombre de barres sur le tick précédent
    constdouble &Close[], // prix de clôture
    constint &Spread[]) // spread
    {
    //---
    staticuint compteur=0;
    if(TotalRates!=Prev_calculated) compteur=0;

    bool SignalVente=false;
    bool TestSérie=ArrayGetAsSeries(TableauCouleur);
    int index,index1;
    if(TestSérie)
    {
    index=int(NombreDeBar);
    index1=index+1;
    }
    else
    {
    index=TotalRates-int(NombreDeBar)-1;
    index1=index-1;
    }
    if(TableauCouleur[index1]!=IndexCouleur && TableauCouleur[index]==IndexCouleur) SignalVente=true;
    if(SignalVente && compteur<=NombreAlertes)
    {
    compteur++;
    MqlDateTime tm;
    TimeToStruct(TimeCurrent(),tm);
    string texte=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
    TestSérie=ArrayGetAsSeries(Close);
    if(TestSérie) index=int(NombreDeBar);
    else index=TotalRates-int(NombreDeBar)-1;
    doubleAsk=Close[index];
    doubleBid=Close[index];
    TestSérie=ArrayGetAsSeries(Spread);
    if(TestSérie) index=int(NombreDeBar);
    else index=TotalRates-int(NombreDeBar)-1;
    Bid+=_Point*Spread[index];
    string sAsk=DoubleToString(Ask,_Digits);
    string sBid=DoubleToString(Bid,_Digits);
    string sPeriod=GetStringTimeframe(ChartPeriod());
    if(SonON) Alert("Signal de VENTE Ask=",Ask," Bid=",Bid," heure courante=",texte," Symbole=",Symbol()," Période=",sPeriod);
    if(EMailON) SendMail(NomSignal+": alerte signal de VENTE","Signal de VENTE à Ask="+sAsk+", Bid="+sBid+", Date="+texte+" Symbole="+Symbol()+" Période="+sPeriod);
    if(PushON) SendNotification(NomSignal+": Signal de VENTE à Ask="+sAsk+", Bid="+sBid+", Date="+texte+" Symbole="+Symbol()+" Période="+sPeriod);
    }
    //---
    }
    //+------------------------------------------------------------------+
    //| Récupération d'une 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("Waddah_Attar_Trend_Alert",TableauIndCouleur,0,TotalRates,Prev_calculated,Close,Spread);
    SellSignal("Waddah_Attar_Trend_Alert",TableauIndCouleur,1,TotalRates,Prev_calculated,Close,Spread);
    //---

Où TableauIndCouleur est le nom d'un tampon d'index de couleur pour stocker la couleur de la ligne comme un index, tandis que 0 et 1 sont les numéros de couleurs dans le tampon d'index de couleur.

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 (copiez-la dans <dossier_données_terminaux>\MQL5\Include). L'utilisation de ces classes a été minutieusement décrite dans l'article "Moyenne des séries de prix pour des calculs intermédiaires sans utiliser de tampons supplémentaires".

Fig.1. Indicateur Waddah_Attar_Trend_Alert sur le graphique

Fig.1. Indicateur Waddah_Attar_Trend_Alert sur le graphique

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

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

Liste
Commentaire 0