Accueil Indicateur technique Publication

Fisher_org_v1_Sign_Alert : L'indicateur d'alerte pour MetaTrader 5

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

Auteur réel :

TrendLaboratory Ltd.

Découvrez l'indicateur de signal à flèche Semaphore basé sur l'oscillateur Fisher_org_v1 qui vous alerte lorsque le marché quitte les zones de surachat et de survente. Cet outil pratique vous permet de recevoir des notifications par e-mail et des alertes push sur vos appareils mobiles.

Modifications apportées à l'indicateur

Pour intégrer ces fonctionnalités d'alerte, plusieurs changements ont été implémentés dans le code de l'indicateur :

  • Ajout de nouveaux paramètres d'entrée :
  • input uint NumberofBar=1;//Numéro de la barre 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'e-mails pour le signal
    input bool PushON=false; //Activer l'envoi de notifications sur les appareils mobiles
    
  • 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 messages e-mail et push
          double &BuyArrow[],    // tampon d'indicateur avec des signaux d'achat
          const int Rates_total,     // le nombre actuel de barres
          const int Prev_calculated, // le nombre de barres au tick précédent
          const double &Close[],     // prix de clôture
          const int &Spread[])     // spread
      {
    u//---
       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("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
         }
    
    u//---
      }
    //+------------------------------------------------------------------+
    //| Fonction de signal de vente         |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,    // texte du nom de l'indicateur pour les messages e-mail et push
                    double &SellArrow[],       // tampon d'indicateur avec des signaux de vente
                    const int Rates_total,     // le nombre actuel de barres
                    const int Prev_calculated, // le nombre de barres au tick précédent
                    const double &Close[],     // prix de clôture
                    const int &Spread[])       // spread
      {
    u//---
       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("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
         }
    u//---
      }
    //+------------------------------------------------------------------+
    //|  Obtenir le timeframe sous forme de chaîne                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  • Ajout d'appels aux fonctions BuySignal() et SellSignal() après les cycles de calcul de l'indicateur dans le bloc OnCalculate() :
  • BuySignal("iWPRSign",BuyBuffer,rates_total,prev_calculated,close,spread);
        SellSignal("iWPRSign",SellBuffer,rates_total,prev_calculated,close,spread);
    

Les tableaux BuyBuffer et SellBuffer servent à stocker les signaux d'achat et de vente. Les valeurs vides dans ces tableaux peuvent être soit des zéros, soit EMPTY_VALUE.

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

Fig.1. L'indicateur Fisher_org_v1_Sign sur le graphique

Fig.1. L'indicateur Fisher_org_v1_Sign sur le graphique

Fig.2. L'indicateur Fisher_org_v1_Sign générant des alertes.

Fig.2. L'indicateur Fisher_org_v1_Sign générant des alertes.

Articles connexes

Commentaire (0)