Alert

Отображает диалоговое окно, содержащее пользовательские данные.

void  Alert(
   argument,     // первое значение
   ...           // последующие значения
   );

Параметры

argument

[in]  Любые значения, разделенные запятыми. Для разделения выводимой информации на несколько строк можно использовать символ перевода строки "\n" либо "\r\n". Количество параметров не может превышать 64.

Возвращаемое значение

Нет возвращаемого значения

Примечание

Массивы нельзя передавать в функцию Alert(). Массивы должны выводиться поэлементно. Данные типа double выводятся с 8 десятичными цифрами после точки, данные типа float выводятся с 5 десятичными цифрами после точки. Для вывода вещественных чисел с другой точностью либо в научном формате необходимо использовать функцию DoubleToString().

Данные типа bool выводятся в виде строк "true" или "false". Даты выводятся в виде YYYY.MM.DD HH:MI:SS. Для вывода даты в другом формате необходимо использовать функцию TimeToString(). Данные типа color выводятся либо в виде строки R,G,B, либо в виде названия цвета, если этот цвет присутствует в наборе цветов.

При работе в тестере стратегий функция Alert() не выполняется.

Пример:

//--- enums
enum ENUM_INTERSECT_DIRECTION
  {
   INTERSECT_DIRECTION_NONE0,  // нет пересечения
   INTERSECT_DIRECTION_UP  = 1,  // пересечение вверх
   INTERSECT_DIRECTION_DOWN=-1,  // пересечение вниз
  };
 
//--- 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()
  {
//--- период расчёта скользящей средней будет равен значению по умолчанию (10) в случае, если во входном параметре указан ноль
   ExtMaPeriod=int(InpPeriod<1 ? 10 : InpPeriod);
//--- создаём хэндл индикатора Moving Average с указанными параметрами
   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);
     }
     
//--- получаем время последнего обновления цен
   datetime tick_time=TickTime();
//--- получаем данные скользящей средней и данные цен с двух последних баров
   if(GetData(ExtMaHandle,ExtData,ExtRates) && tick_time!=0)
     {
      //--- если цена выше скользящей средней
      if(ExtRates[1].close>ExtData[1])
        {
         //--- создаём текст сообщения и выводим 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));
         /*
         Результат:
         AlertBar time2024.02.16 18:00The price is above the moving average at 2024.02.16 18:47:43
         */
        }
      else
        {
         //--- если цена ниже скользящей средней
         if(ExtRates[1].close<ExtData[1])
           {
            //--- создаём текст сообщения и выводим 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));
            /*
            Результат:
            AlertBar time2024.02.16 19:00The price is below the moving average at 2024.02.16 19:33:14
            */
           }
         else
           {
            //--- создаём текст сообщения и выводим 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));
            /*
            Результат:
            AlertBar time2024.02.16 20:00The price and moving average are equal at 2024.02.16 20:12:22
            */
           }
        }
     }
     
//--- Успешно
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   ResetLastError();
//--- получаем данные скользящей средней и данные цен с двух последних баров
   if(!GetData(ExtMaHandle,ExtData,ExtRates))
      return;
//--- получаем направление пересечения ценой скользящей средней на текущем баре
   ENUM_INTERSECT_DIRECTION intersect=GetIntersectDirection(ExtData,ExtRates);
 
//--- переменная для сохранения предыдущего сообщения
   static string message_prev="";
 
//--- если цена пересекла скользящую среднюю на текущем баре снизу-вверх
   if(intersect==INTERSECT_DIRECTION_UP)
     {
      //--- получаем время тика, на котором произошло пересечение
      datetime tick_time=TickTime();
      if(tick_time==0)
         return;
      //--- создаём текст сообщения
      string message=StringFormat("Bar time: %s. The price crossed the MA from bottom to top",TimeToString(ExtRates[1].time));
      //--- если прошлое сообщение не равно текущему - выводим Alert с сообщением и временем тика
      if(message!=message_prev)
        {
         Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
         message_prev=message;
         /*
         Результат:\
         AlertBar time2024.02.16 09:00The price crossed the MA from bottom to top at 2024.02.16 09:20:35
         */
        }
     }
 
//--- если цена пересекла скользящую среднюю на текущем баре сверху-вниз
   if(intersect==INTERSECT_DIRECTION_DOWN)
     {
      //--- получаем время тика, на котором произошло пересечение
      datetime tick_time=TickTime();
      if(tick_time==0)
         return;
      //--- создаём текст сообщения
      string message=StringFormat("Bar time: %s. The price crossed the MA from top to bottom",TimeToString(ExtRates[1].time));
      //--- если прошлое сообщение не равно текущему - выводим Alert с сообщением и временем тика
      if(message!=message_prev)
        {
         Alert(message+" at "+TimeToString(tick_time,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
         message_prev=message;
         /*
         Результат:\
         AlertBar time2024.02.16 10:00The price crossed the MA from top to bottom at 2024.02.16 10:42:15
         */
        }
     }
  }
//+------------------------------------------------------------------+
//| Получает данные цены и скользящей средней в массивы              |
//+------------------------------------------------------------------+
bool GetData(int handle,double &ma_data[],MqlRates &price_data[])
  {
   ResetLastError();
//--- получаем данные скользящей средней с двух последних баров
   if(CopyBuffer(handle,0,0,2,ma_data)!=2)
     {
      PrintFormat("CopyBuffer() failed. Error code: %d",GetLastError());
      return(false);
     }
//--- получаем данные цен двух последних баров
   if(CopyRates(Symbol(),PERIOD_CURRENT,0,2,price_data)!=2)
     {
      PrintFormat("CopyRates() failed. Error code: %d",GetLastError());
      return(false);
     }
 
   return(true);
  }
//+------------------------------------------------------------------+
//| Возвращает направление пересечения ценой скользящей средней      |
//+------------------------------------------------------------------+
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);
     }
  }
//+------------------------------------------------------------------+
//| Возвращает время тика в секундах                                 |
//+------------------------------------------------------------------+
datetime TickTime()
  {
   MqlTick tick={};
 
   ResetLastError();
   if(!SymbolInfoTick(Symbol(),tick))
     {
      PrintFormat("SymbolInfoTick() failed. Error code: %d",GetLastError());
      return(0);
     }
 
   return(tick.time);
  }