FXTAA English version

Индикатор алертов по уровням: звук и push в MT4

Вы разметили важные уровни, а потом весь день смотрели в график, ожидая подхода цены. MT4 умеет ждать за вас — тремя разными способами, у каждого свои слабые места.

Обновлено: 2026-09-22

В MetaTrader 4 есть три независимых механизма, которые все скопом называют «алертами». Работают они по-разному, и выбор неподходящего — обычная причина жалоб на то, что «уведомления не работают».

1. Встроенная вкладка «Сигналы»

Откройте окно «Терминал» через Ctrl+T и перейдите на вкладку Сигналы. Правый клик внутри → «Создать». В диалоге задаются символ, условие (Bid >, Bid <, Ask >, Ask <), значение и действие: проиграть звук, отправить письмо или запустить файл.

Способ самый простой и не требует кода. Ограничение в том, что сигнал привязан к введённому числу, а не к объекту на графике. Передвинете горизонтальную линию — сигнал останется на прежнем месте.

Сигнал срабатывает по приходу тика. В выходные тиков нет, поэтому сработать он не может, а понедельничный гэп прямо через ваш уровень не даст никакого уведомления — цена там попросту не котировалась.

2. Звуковые оповещения

Звуки настраиваются в «Сервис» → «Настройки» → вкладка «События». К каждому событию привязан файл .wav, его можно заменить своим — MT4 ищет файлы в папке Sounds каталога данных терминала. Каталог данных не обязательно совпадает с папкой установки: «Файл» → «Открыть каталог данных» приведёт куда нужно.

Практическая деталь: если терминал свёрнут в трей, а Windows приглушила громкость приложения, событие появится в журнале, но звука не будет. Проверьте микшер громкости, прежде чем винить MT4.

3. Push-уведомления на телефон

Единственный механизм, который достанет вас вдали от компьютера. Установите мобильный MetaTrader 4, откройте его настройки и найдите MetaQuotes ID — код из восьми символов. В десктопном терминале: «Сервис» → «Настройки» → «Уведомления», включите push и вставьте этот ID.

Индикатор, который следит за вашими линиями

Нужное поведение — «сообщи, когда цена пересечёт любую нарисованную мной горизонталь» — требует немного кода на MQL4. Идея простая: на каждом тике обойти объекты графика, оставить горизонтальные линии и сравнить предыдущий Bid с текущим.

// LevelAlerter.mq4 — алерт при пересечении любой горизонтальной линии
#property indicator_chart_window

input bool  UseSound = true;
input bool  UsePush  = false;
input int   CooldownSeconds = 60;

double   prevBid = 0;
datetime lastFire = 0;

int OnInit() { prevBid = Bid; return(INIT_SUCCEEDED); }

int OnCalculate(const int rates_total, const int prev_calculated,
                const datetime &time[], const double &open[],
                const double &high[], const double &low[],
                const double &close[], const long &tick_volume[],
                const long &volume[], const int &spread[])
{
   if(prevBid == 0) { prevBid = Bid; return(rates_total); }

   for(int i = ObjectsTotal() - 1; i >= 0; i--)
   {
      string name = ObjectName(i);
      if(ObjectType(name) != OBJ_HLINE) continue;

      double level = ObjectGet(name, OBJPROP_PRICE1);

      // пересечение в любую сторону между прошлым и текущим тиком
      bool crossed = (prevBid < level && Bid >= level) ||
                     (prevBid > level && Bid <= level);

      if(crossed && TimeCurrent() - lastFire >= CooldownSeconds)
      {
         string msg = StringFormat("%s %s пересёк %s (%s)",
                      Symbol(), DoubleToString(Bid, Digits),
                      DoubleToString(level, Digits), name);

         if(UseSound) Alert(msg);            // Alert() пишет и во вкладку «Сигналы»
         if(UsePush)  SendNotification(msg); // нужен MetaQuotes ID в настройках
         lastFire = TimeCurrent();
      }
   }
   prevBid = Bid;
   return(rates_total);
}

Скомпилируйте в MetaEditor (F7) и перетащите на график из «Навигатора». Горизонтальные линии рисуйте как обычно — индикатор подхватит их сам, потому что читает объекты, а не сохранённый список.

Зачем нужна пауза между срабатываниями

Без CooldownSeconds пользоваться этим невозможно. Цена не пересекает уровень один раз — она колеблется вокруг него, и каждое колебание это пересечение. Спокойный уровень способен выдать сорок алертов за минуту и приучить вас не реагировать на звук вообще.

Шестьдесят секунд — разумное значение по умолчанию. Для уровней на M1 нужно меньше, для дневных — несколько минут.

Что обязательно всплывёт

СимптомПричина
Алерт срабатывает не на том графикеИндикатор работает на своём графике. Повесив его на EURUSD, вы не следите за линиями GBPUSD.
После перезапуска ничего не срабатываетprevBid стартует с нуля, и первый тик лишь инициализирует его. Так задумано: иначе при запуске сработали бы все линии ниже цены сразу.
Push приходит, звука нетAlert() подчиняется настройке «События». Если галочка «Включить» снята, окно появится беззвучно.
Ночью алерты прекращаютсяКомпьютер ушёл в спящий режим вместе с терминалом. Отключите сон или держите терминал на VPS.

Проверка без риска

Логику оповещений стоит неделю погонять на демо-счёте, прежде чем на неё полагаться: большинство перечисленных проблем проявляются только в живом потоке тиков. Push-уведомления особенно зависят от того, насколько ровно сервер брокера отдаёт тики — сервер, рвущий соединение на ролловере, даёт дыры в оповещениях, которых в тестере стратегий не видно.

Если выбираете, на чём это запускать, практические критерии такие: стабильный сервер MT4, глубокая история тиков и отсутствие искусственных ограничений на пользовательские индикаторы. Один из распространённых вариантов разобран здесь: обзор брокера RoboForex.