Alerts & notifications

Atlaas can tell you when something happens on a terminal: an alert raised by your own EA, a copy-trading failure, an order placed or closed, a state change (running, stopped, error), an EA deployment finishing or failing, or the live-vs-backtest monitor flagging decay or slippage.

Channels

A channel is a named place notifications go. Create as many as you like in Settings → Notifications and give each one a name; you then pick channels wherever events come from.

TypeConnectNotes
TelegramOpen the link the portal shows and press Start in a private chat, or pick a groupOne channel per chat or group, as many as you like. Failures are throttled to one per terminal and type per minute. Bursts are capped at about 20 messages, then about one a second to a private chat or 20 a minute to a group; anything over that is dropped.
EmailEvery org member, or one addressAn address gets a confirmation link and receives nothing until it is clicked; every email to it has an unsubscribe link. One email per channel, terminal and type per minute.
DiscordPaste a channel webhook URL (channel settings → Integrations → Webhooks)Posted as an embed. The URL is a credential: the portal never shows it again in full.
WebhookPaste an HTTPS URL; you get a signing secretSigned and retried like the Webhooks page. Body: { id, type, level, title, message, occurred_at, group, channel, source: { instance, strategies, deployment }, link, metadata }. Pro and above.
SlackPaste an incoming-webhook URL (https://hooks.slack.com/services/…)Block Kit message with an Open in Atlaas button.
Microsoft TeamsCreate a Workflows flow "Post to a channel when a webhook request is received" and paste its URLAdaptive Card. Office 365 connector URLs (webhook.office.com) stopped working in May 2026 and are refused.
Google ChatPaste a space webhook URL (space → Apps & integrations → Webhooks)One thread per terminal.
WhatsAppOpen the link the portal shows and send the prefilled messageYour message proves the number. Alerts go out as an approved template. Paid from credits (NOTIFY_CREDITS_WHATSAPP, default 0.5 per message). Only on deployments with Twilio WhatsApp configured.
BrowserAllow notifications in the add dialogWeb Push to that browser, even with the portal closed. On iPhone, add the portal to the Home Screen first. The topbar bell's in-tab notifications are separate.
MT5 app push (experimental)Your MetaQuotes ID (MT5 app → Settings → Messages) and the terminal to push fromThe terminal loads the ID when it next restarts; then a code pushed through it confirms the ID. One ID per terminal: MT5 pushes to every ID it holds, so a second would get the first one's alerts. 255 characters, about 10 a minute per terminal (MetaQuotes' limits), and nothing while the terminal is down.
PushoverYour user (or group) keyErrors are sent at high priority.
ntfyA topic URL on ntfy.sh or your own server, and an optional access tokenPriority follows the alert's level.
PagerDutyAn Events API v2 integration keyA terminal going down opens an incident. The terminal coming back resolves it on every PagerDuty channel of the account, whatever their routes, level or mute say. Risk alerts update one incident per terminal and limit. Send test posts a change event, which pages nobody.
SMSA phone number in international format, confirmed with a texted codePaid from credits per 160-character part (NOTIFY_CREDITS_SMS, default 1). Replying STOP turns the channel off.
Phone callA phone number, confirmed with a code read out on a callReads the alert twice. Starts at errors only. Paid from credits (NOTIFY_CREDITS_VOICE, default 3 per call).

Types whose provider is not configured on a deployment (Telegram, Pushover, browser push, the Twilio ones) are not offered. Credits for a paid message are reserved before it is sent and released if the provider refuses it; an account without enough credits gets no message, and that never turns the channel off.

SMS, WhatsApp and calls cost money per message, so they come with limits:

Every account starts with an Org members email channel. A channel whose destination is gone (a deleted Discord webhook, a bot removed from the chat) or that fails 10 times in a row turns itself off, and every member gets an email saying so. Send test on any channel posts a test message and shows the result.

Delivery settings per channel

Open a channel in Settings → Notifications to set how it delivers:

SettingWhat it does
SendEverything, warnings and errors, or errors only. Anything below is not sent to this channel.
Bundle info messagesSend each, or collect info-level messages and send them as one message every 5, 15 or 60 minutes. Warnings and errors are never held.
Quiet hoursA daily window in your timezone (it may cross midnight). Anything but an error that arrives inside it is held and sent as one message when the window ends.
MuteFor an hour, four hours or until 08:00. Nothing is sent while muted, errors included; held messages are dropped. Use Pause to stop a channel for longer.

Where events go

Events are grouped, and each group can be sent to channels from four places:

GroupFires onPlanAccount defaultTerminalStrategyEA deployment
EA alertsalert.eaPro and aboveyesyesyes
Failuresalert.copy, any order.* event at level ERROR, a stop out (trade.close at ERROR), a refused strategy signal (strategy.signal_rejected), and ea.disconnected at level ERROR (the terminal stopped responding). The "every org member" email skips that last one; the pooled terminal-state digest email covers it within ten minutes.Solo and aboveyesyesyesyes
Tradestrade.open and trade.close: every position an MT5 terminal opens or closes, by any EA, by hand or through Atlaas, titled "Stop loss hit", "Take profit hit" or "Partial close" when that is what happened. Terminals on brokers without a deal stream (Dhan, Kite and the other Indian brokers) use order.place / order.close at INFO instead.Solo and aboveyesyesyesyes
Signalsstrategy.signal: a strategy webhook signal was accepted and sent to its terminalsSolo and aboveyes
Account riskrisk.margin, risk.daily_loss, risk.drawdown: a terminal crossed a limit you set on it (below)Solo and aboveyesyes
Daily summarystrategy.daily_summary: once a day after 23:30 in your account's timezone (Settings → Account, default Asia/Kolkata), the strategy's closed trades, wins, losses and net result. Nothing is sent on a day without closed trades.Solo and aboveyes
Terminal stateinstance.state at level INFO or WARNSolo and aboveyesyes
Deployment statusdeployment.completed, deployment.failedSolo and aboveyes
Live vs backtestea.monitor at WARN (decay or slippage)Solo and aboveyes

Account risk limits are set per terminal on its Notifications card, each optional:

LimitFires whenRe-arms when
Margin level belowequity ÷ used margin falls below the % you setit is back above 1.1 × the limit
Daily loss overequity is that % below the trading day's first equity (the broker's day), so a loss carried overnight is not today'sthe next trading day
Drawdown overequity is that % below its peak since you set the limitthe drawdown is back under half the limit

Each limit sends one alert per crossing, not one per heartbeat. Deposits and withdrawals move the day's starting point and the peak with them, so they never read as profit or loss. Changing a limit starts that limit over; the others keep their state. Risk alerts are errors, so they come through quiet hours and bundling.

When several of these match one event, it goes to all of them and each channel gets it once: a Gold Scalper trade on terminal XAU-Live-01 reaches the strategy's channels and the terminal's.

Alerts also appear in the Logs page under the Alerts category and in GET /v1/events?category=alert.

Send an alert from your EA

Print a line that starts with ATLAS_ALERT to the Experts log. The runner already tails that log, so nothing else is needed on the terminal. Either form works:

ATLAS_ALERT RSI crossed 70 on EURUSD
ATLAS_ALERT {"message":"RSI crossed 70","symbol":"EURUSD","price":1.0852,"level":"WARN"}
FieldRequiredNotes
messageyesThe alert text. Capped at 512 characters.
symbolnoShown with the alert and stored in the event metadata.
pricenoA number; stored in the event metadata.
levelnoINFO (default), WARN or ERROR. ERROR emails are titled "Alert", the rest "Notice".

A helper you can paste into any MQL5 program. It escapes quotes and backslashes, which would otherwise break the JSON and turn the whole line into a plain-text alert:

void AtlasAlert(string message, string level = "INFO", double price = 0)
{
   StringReplace(message, "\\", "\\\\");
   StringReplace(message, "\"", "\\\"");
   Print("ATLAS_ALERT {\"message\":\"", message, "\",\"symbol\":\"", _Symbol, "\",\"level\":\"", level,
         "\",\"price\":", DoubleToString(price, _Digits), "}");
}

Use Print. MT5's Alert() and SendNotification() don't create Atlaas alerts. In a backtest the lines stay in the tester's log.

Alerts reach Atlaas within about 2 seconds of the Print. A line that repeats with the same timestamp and message (the runner re-sends the log tail after a reconnect) is recorded once.

Set up Telegram alerts

  1. In the portal open Settings → Notifications, press Add channel, choose Telegram and name the channel. If Telegram is greyed out, this deployment has no bot.
  2. Open the link it shows. For a private chat, Telegram opens the bot with a Start button; press it. For a group, the second link lets you pick the group and adds the bot to it, which sends the same start command there.
  3. Back in the portal press I pressed Start. Atlaas looks for your start message, records the chat it came from, and shows its name. The link is valid for 10 minutes; Finish connecting on the channel gets a new one.
  4. Tick the groups it should get as the account default, or pick it on a terminal, strategy or EA. Send test posts "Atlaas is connected to …" to confirm.

Repeat for every chat or group you want; each is its own channel. The chat id is never typed in: it is taken from the start message the bot received, which proves the chat is yours. Telegram broadcast channels cannot be connected this way; use a group. Move to another chat on a channel re-runs the handshake; Delete removes it everywhere it was picked.