Индикатор алертов по уровням: звук и push в MT4
Вы разметили важные уровни, а потом весь день смотрели в график, ожидая подхода цены. MT4 умеет ждать за вас — тремя разными способами, у каждого свои слабые места.
В MetaTrader 4 есть три независимых механизма, которые все скопом называют «алертами». Работают они по-разному, и выбор неподходящего — обычная причина жалоб на то, что «уведомления не работают».
1. Встроенная вкладка «Сигналы»
Откройте окно «Терминал» через Ctrl+T и перейдите на вкладку Сигналы. Правый клик внутри → «Создать». В диалоге задаются символ, условие (Bid >, Bid <, Ask >, Ask <), значение и действие: проиграть звук, отправить письмо или запустить файл.
Способ самый простой и не требует кода. Ограничение в том, что сигнал привязан к введённому числу, а не к объекту на графике. Передвинете горизонтальную линию — сигнал останется на прежнем месте.
Сигнал срабатывает по приходу тика. В выходные тиков нет, поэтому сработать он не может, а понедельничный гэп прямо через ваш уровень не даст никакого уведомления — цена там попросту не котировалась.
2. Звуковые оповещения
Звуки настраиваются в «Сервис» → «Настройки» → вкладка «События». К каждому событию привязан файл .wav, его можно заменить своим — MT4 ищет файлы в папке Sounds каталога данных терминала. Каталог данных не обязательно совпадает с папкой установки: «Файл» → «Открыть каталог данных» приведёт куда нужно.
Практическая деталь: если терминал свёрнут в трей, а Windows приглушила громкость приложения, событие появится в журнале, но звука не будет. Проверьте микшер громкости, прежде чем винить MT4.
3. Push-уведомления на телефон
Единственный механизм, который достанет вас вдали от компьютера. Установите мобильный MetaTrader 4, откройте его настройки и найдите MetaQuotes ID — код из восьми символов. В десктопном терминале: «Сервис» → «Настройки» → «Уведомления», включите push и вставьте этот ID.
- Нажмите «Тест». Если ничего не пришло — либо ID неверен, либо на телефоне запрещены уведомления для приложения. Третьего варианта нет.
- Десктопный терминал должен оставаться запущенным: push отправляет он через сервер MetaQuotes, а не брокер.
- Есть ограничение примерно в два уведомления в секунду, длинные сообщения обрезаются.
Индикатор, который следит за вашими линиями
Нужное поведение — «сообщи, когда цена пересечёт любую нарисованную мной горизонталь» — требует немного кода на 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.