Alert

Affiche la fenêtre de dialogue, contenant les données d'utilisateur.

void  Alert(
   argument,     // première valeur 
   ...           // valeurs suivantes
   );

Paramètres

argument

[in]  N'importe quelles valeurs spérarées par des virgules. Pour la séparation de l'information en quelques lignes, on peut utiliser le symbole de changement de ligne "\n" ou "\r\n". La quantité de paramètres ne peut pas excéder 64.

Valeur de Retour

Aucune

Note

On ne peut pas transmettre des tableaux à la fonction Alert(). Les tableaux doivent être déduits par les éléments. Les données de type double sont déduites avec 8 chiffres décimaux après le point, les données de type float sont déduites  avec 5 chiffres décimaux après le point. Pour la sortie des nombres réels avec une autre exactitude ou dans le format scientifique il est nécessaire d'utiliser la fonction DoubleToString().

Les données du type bool sont déduites sous la forme des chaînes "true" ou "false". Les dates sont déduites comme YYYY.MM.DD HH:MI:SS. Pour la sortie de la date dans un autre format il est nécessaire d'utiliser la fonction TimeToString(). Les données du type color sont déduites en forme de la chaîne R,G,B, ou en forme du nom de la couleur, si cette couleur existe dans l'ensemble des couleurs.

La fonction Alert () ne fonctionne pas dans le Strategy Tester.

Exemple :

//--- énumérations
enum ENUM_INTERSECT_DIRECTION
  {
   INTERSECT_DIRECTION_NONE0,  // aucun croisement
   INTERSECT_DIRECTION_UP  = 1,  // croisement à la hausse
   INTERSECT_DIRECTION_DOWN=-1,  // croisement à la baisse
  };
 
//--- paramètres d'entrée
input    uint               InpPeriod = 10;            // période de la moyenne mobile
input    int                InpShift  = 0;             // décalage de la moyenne mobile
input    ENUM_MA_METHOD     InpMethod = MODE_SMA;      // méthode de la moyenne mobile
input    ENUM_APPLIED_PRICE InpPrice  = PRICE_CLOSE;   // prix utilisé par la moyenne mobile
 
//--- variables globales
int      ExtMaHandle;
int      ExtMaPeriod;
double   ExtData[2];
MqlRates ExtRates[2];
 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- la période de calcul de la moyenne mobile sera égale à la valeur par défaut (10) si zéro est spécifié dans le paramètre d'entrée
   ExtMaPeriod=int(InpPeriod<1 ? 10 : InpPeriod);
//--- crée un handle pour l'indicateur de moyenne mobile avec les paramètres spécifiés
   ExtMaHandle=iMA(Symbol(),PERIOD_CURRENT,ExtMaPeriod,InpShift,InpMethod,InpPrice);
   ResetLastError();
   if(ExtMaHandle==INVALID_HANDLE)
     {
      PrintFormat("Failed to create iMA() handle. Error code: %d",GetLastError());
      return(INIT_FAILED);
     }
     
//--- pour récupérer l'heure de la dernière mise à jour des prix
   datetime tick_time=TickTime();
//--- pour calculer les données de moyenne mobile et les données de prix des deux dernières barres
   if(GetData(ExtMaHandle,ExtData,ExtRates) && tick_time!=0)
     {
      //--- si le prix est au-dessus de la moyenne mobile
      if(ExtRates[1].close>ExtData[1])
        {
         //--- crée le texte du message et affiche l'alerte
         string message=StringFormat("Bar time: %s. The price is above the moving average",TimeToString(ExtRates[1].time));
         Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
         /*
        Résultat :
         AlertBar time2024.02.16 18:00The price is above the moving average at 2024.02.16 18:47:43
         */
        }
      else
        {
         //--- si le prix est en-dessous de la moyenne mobile
         if(ExtRates[1].close<ExtData[1])
           {
            //--- crée le message et affiche l'alerte
            string message=StringFormat("Bar time: %s. The price is below the moving average.",TimeToString(ExtRates[1].time));
            Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
            /*
           Résultat :
            AlertBar time2024.02.16 19:00The price is below the moving average at 2024.02.16 19:33:14
            */
           }
         else
           {
            //--- crée le message et affiche l'alerte
            string message=StringFormat("Bar time: %s. The price and moving average are equal.",TimeToString(ExtRates[1].time));
            Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
            /*
           Résultat :
            AlertBar time2024.02.16 20:00The price and moving average are equal at 2024.02.16 20:12:22
            */
           }
        }
     }
     
//--- succès
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   ResetLastError();
//--- pour calculer les données de moyenne mobile et les données de prix des deux dernières barres
   if(!GetData(ExtMaHandle,ExtData,ExtRates))
      return;
//--- pour obtenir la direction du prix croisant la moyenne mobile sur la barre actuelle
   ENUM_INTERSECT_DIRECTION intersect=GetIntersectDirection(ExtData,ExtRates);
 
//--- variable pour sauvegarder le message précédent
   static string message_prev="";
 
//--- si le prix a franchi la moyenne mobile sur la barre actuelle vers le haut
   if(intersect==INTERSECT_DIRECTION_UP)
     {
      //--- pour obtenir l'heure du tick à laquelle le croisement a eu lieu
      datetime tick_time=TickTime();
      if(tick_time==0)
         return;
      //--- crée le texte du message
      string message=StringFormat("Bar time: %s. The price crossed the MA from bottom to top",TimeToString(ExtRates[1].time));
      //--- si le message précédent n'est pas égal à celui en cours, affiche l'alerte avec le message et l'heure du tick
      if(message!=message_prev)
        {
         Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
         message_prev=message;
         /*
        Résultat :\
         AlertBar time2024.02.16 09:00The price crossed the MA from bottom to top at 2024.02.16 09:20:35
         */
        }
     }
 
//--- si le prix a franchi la moyenne mobile sur la barre actuelle vers le bas
   if(intersect==INTERSECT_DIRECTION_DOWN)
     {
      //--- pour obtenir l'heure du tick à laquelle le croisement a eu lieu
      datetime tick_time=TickTime();
      if(tick_time==0)
         return;
      //--- crée le texte du message
      string message=StringFormat("Bar time: %s. The price crossed the MA from top to bottom",TimeToString(ExtRates[1].time));
      //--- si le message précédent n'est pas égal à celui en cours, affiche l'alerte avec le message et l'heure du tick
      if(message!=message_prev)
        {
         Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
         message_prev=message;
         /*
        Résultat :\
         AlertBar time2024.02.16 10:00The price crossed the MA from top to bottom at 2024.02.16 10:42:15
         */
        }
     }
  }
//+------------------------------------------------------------------+
//| Met les prix et les donnes la moyenne mobile dans des tableaux   |
//+------------------------------------------------------------------+
bool GetData(int handle,double &ma_data[],MqlRates &price_data[])
  {
   ResetLastError();
//--- récupère les données de la moyenne mobile des deux dernières barres
   if(CopyBuffer(handle,0,0,2,ma_data)!=2)
     {
      PrintFormat("CopyBuffer() failed. Error code: %d",GetLastError());
      return(false);
     }
//--- récupère les données des prix pour les deux dernières barres
   if(CopyRates(Symbol(),PERIOD_CURRENT,0,2,price_data)!=2)
     {
      PrintFormat("CopyRates() failed. Error code: %d",GetLastError());
      return(false);
     }
 
   return(true);
  }
//+------------------------------------------------------------------+
//| Renvoie la direction du prix croisant la moyenne mobile     |
//+------------------------------------------------------------------+
ENUM_INTERSECT_DIRECTION GetIntersectDirection(double &ma_data[],MqlRates &price_data[])
  {
   double ma0=ma_data[1];
   double ma1=ma_data[0];
   double close0=price_data[1].close;
   double close1=price_data[0].close;
 
   if(close1<=ma1 && close0>ma0)
      return(INTERSECT_DIRECTION_UP);
   else
     {
      if(close1>=ma1 && close0<ma0)
         return(INTERSECT_DIRECTION_DOWN);
      else
         return(INTERSECT_DIRECTION_NONE);
     }
  }
//+------------------------------------------------------------------+
//| Retourne l'heure du tick en secondes                            |
//+------------------------------------------------------------------+
datetime TickTime()
  {
   MqlTick tick={};
 
   ResetLastError();
   if(!SymbolInfoTick(Symbol(),tick))
     {
      PrintFormat("SymbolInfoTick() failed. Error code: %d",GetLastError());
      return(0);
     }
 
   return(tick.time);
  }