Alert

Exibe uma mensagem em uma janela separada.

void  Alert(
   argument,     // primeiro valor
   ...           // outros valores
   );

Parâmetros

argument

[in]  Quaisquer valores separados por virgulas. Para dividir a saída da informação em várias linhas você pode usar o caractere de quebra de linha "\n" ou "\r\n". O número de parâmetros não pode exceder 64.

Valor do Retorno

Sem valor de retorno.

Observação

Arrays não podem ser passados para a função Alert(). Arrays devem ser fornecidos elemento a elemento. Dados do tipo double são exibidos com 8 dígitos após o ponto decimal, dados do tipo float são exibidos com 5 dígitos após o ponto decimal. Para exibir os números reais com uma precisão diferente ou em notação científica, use a função DoubleToString().

Dados do tipo bool são exibidos como strings "true" ou "false". Datas são exibidas como YYYY.MM.DD HH:MM:SS. Para exibir uma data em um outro formato use a função TimeToString(). Dados do tipo color são exibidos tanto como uma string R,G,B ou como nome de cor, se a cor estiver presente no conjunto de cores.

A função Alert() não funciona no Testador de estratégias.

Exemplo:

//--- enums
enum ENUM_INTERSECT_DIRECTION
  {
   INTERSECT_DIRECTION_NONE0,  // não há intersecção
   INTERSECT_DIRECTION_UP  = 1,  // intersecção para cima
   INTERSECT_DIRECTION_DOWN=-1,  // intersecção para baixo
  };
 
//--- input parameters
input    uint               InpPeriod = 10;            // MA Period
input    int                InpShift  = 0;             // MA Shift
input    ENUM_MA_METHOD     InpMethod = MODE_SMA;      // MA Method
input    ENUM_APPLIED_PRICE InpPrice  = PRICE_CLOSE;   // MA Applied price
 
//--- global variables
int      ExtMaHandle;
int      ExtMaPeriod;
double   ExtData[2];
MqlRates ExtRates[2];
 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- o período de cálculo da média móvel será igual ao valor padrão (10) se um zero for especificado no parâmetro de entrada
   ExtMaPeriod=int(InpPeriod<1 ? 10 : InpPeriod);
//--- criamos um handle do indicador Moving Average com os parâmetros especificados
   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);
     }
     
//--- obtemos o tempo da última atualização de preços
   datetime tick_time=TickTime();
//--- obtemos os dados da média móvel e os dados de preços dos últimos dois a barras
   if(GetData(ExtMaHandle,ExtData,ExtRates) && tick_time!=0)
     {
      //--- se o preço estiver acima da média móvel
      if(ExtRates[1].close>ExtData[1])
        {
         //--- criamos o texto da mensagem e exibimos um Alert
         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));
        /*
        Resultado:
         AlertBar time2024.02.16 18:00The price is above the moving average at 2024.02.16 18:47:43
        */
        }
      else
        {
         //--- se o preço estiver abaixo da média móvel
         if(ExtRates[1].close<ExtData[1])
           {
         //--- criamos o texto da mensagem e exibimos um Alert
            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));
           /*
           Resultado:
            AlertBar time2024.02.16 19:00The price is below the moving average at 2024.02.16 19:33:14
           */
           }
         else
           {
         //--- criamos o texto da mensagem e exibimos um Alert
            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));
           /*
           Resultado:
            AlertBar time2024.02.16 20:00The price and moving average are equal at 2024.02.16 20:12:22
           */
           }
        }
     }
     
//--- Sucesso
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   ResetLastError();
//--- obtemos os dados da média móvel e os dados de preços dos últimos dois a barras
   if(!GetData(ExtMaHandle,ExtData,ExtRates))
      return;
//--- obtemos a direção da intersecção do preço com a média móvel na nova barra
   ENUM_INTERSECT_DIRECTION intersect=GetIntersectDirection(ExtData,ExtRates);
 
//--- variável para salvar a mensagem anterior
   static string message_prev="";
 
//--- se o preço cruzou a média móvel da parte inferior para a superior na a barra atual
   if(intersect==INTERSECT_DIRECTION_UP)
     {
      //--- obtemos o tempo do tick no qual ocorreu a intersecção
      datetime tick_time=TickTime();
      if(tick_time==0)
         return;
      //--- criamos o texto da mensagem
      string message=StringFormat("Bar time: %s. The price crossed the MA from bottom to top",TimeToString(ExtRates[1].time));
      //--- se a mensagem anterior não for igual à atual, exibimos um Alert com a mensagem e o tempo do tick
      if(message!=message_prev)
        {
         Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
         message_prev=message;
        /*
        Resultado:\
         AlertBar time2024.02.16 09:00The price crossed the MA from bottom to top at 2024.02.16 09:20:35
        */
        }
     }
 
//--- se o preço cruzou a média móvel de cima para baixo na a barra atual
   if(intersect==INTERSECT_DIRECTION_DOWN)
     {
      //--- obtemos o tempo do tick no qual ocorreu a intersecção
      datetime tick_time=TickTime();
      if(tick_time==0)
         return;
      //--- criamos o texto da mensagem
      string message=StringFormat("Bar time: %s. The price crossed the MA from top to bottom",TimeToString(ExtRates[1].time));
      //--- se a mensagem anterior não for igual à atual, exibimos um Alert com a mensagem e o tempo do tick
      if(message!=message_prev)
        {
         Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
         message_prev=message;
        /*
        Resultado:\
         AlertBar time2024.02.16 10:00The price crossed the MA from top to bottom at 2024.02.16 10:42:15
        */
        }
     }
  }
//+------------------------------------------------------------------+
//| Obtém os dados de preço e média móvel em arrays               |
//+------------------------------------------------------------------+
bool GetData(int handle,double &ma_data[],MqlRates &price_data[])
  {
   ResetLastError();
//--- obtemos os dados da média móvel das últimas duas barras
   if(CopyBuffer(handle,0,0,2,ma_data)!=2)
     {
      PrintFormat("CopyBuffer() failed. Error code: %d",GetLastError());
      return(false);
     }
//--- obtemos os dados de preços das últimas duas barras
   if(CopyRates(Symbol(),PERIOD_CURRENT,0,2,price_data)!=2)
     {
      PrintFormat("CopyRates() failed. Error code: %d",GetLastError());
      return(false);
     }
 
   return(true);
  }
//+------------------------------------------------------------------+
//| Retorna a direção da intersecção do preço com a média móvel      |
//+------------------------------------------------------------------+
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);
     }
  }
//+------------------------------------------------------------------+
//| Retorna o tempo do tick em segundos                              |
//+------------------------------------------------------------------+
datetime TickTime()
  {
   MqlTick tick={};
 
   ResetLastError();
   if(!SymbolInfoTick(Symbol(),tick))
     {
      PrintFormat("SymbolInfoTick() failed. Error code: %d",GetLastError());
      return(0);
     }
 
   return(tick.time);
  }