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.
| Type | Connect | Notes |
|---|---|---|
| Telegram | Open the link the portal shows and press Start in a private chat, or pick a group | One 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. |
| Every org member, or one address | An 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. | |
| Discord | Paste 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. |
| Webhook | Paste an HTTPS URL; you get a signing secret | Signed 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. |
| Slack | Paste an incoming-webhook URL (https://hooks.slack.com/services/…) | Block Kit message with an Open in Atlaas button. |
| Microsoft Teams | Create a Workflows flow "Post to a channel when a webhook request is received" and paste its URL | Adaptive Card. Office 365 connector URLs (webhook.office.com) stopped working in May 2026 and are refused. |
| Google Chat | Paste a space webhook URL (space → Apps & integrations → Webhooks) | One thread per terminal. |
| Open the link the portal shows and send the prefilled message | Your 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. | |
| Browser | Allow notifications in the add dialog | Web 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 from | The 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. |
| Pushover | Your user (or group) key | Errors are sent at high priority. |
| ntfy | A topic URL on ntfy.sh or your own server, and an optional access token | Priority follows the alert's level. |
| PagerDuty | An Events API v2 integration key | A 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. |
| SMS | A phone number in international format, confirmed with a texted code | Paid from credits per 160-character part (NOTIFY_CREDITS_SMS, default 1). Replying STOP turns the channel off. |
| Phone call | A phone number, confirmed with a code read out on a call | Reads 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:
- Solo plan and above, and only numbers in the countries the deployment allows
(
NOTIFY_PHONE_COUNTRIES, comma-separated dialling codes, default+91). - At most 3 numbers waiting for confirmation at once.
- Confirmation codes (SMS, calls and MT5 push): 5 a day per account, 3 a day per number or MetaQuotes ID whichever account asks, and a minute apart. A code allows 5 wrong tries.
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:
| Setting | What it does |
|---|---|
| Send | Everything, warnings and errors, or errors only. Anything below is not sent to this channel. |
| Bundle info messages | Send 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 hours | A 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. |
| Mute | For 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:
| Group | Fires on | Plan | Account default | Terminal | Strategy | EA deployment |
|---|---|---|---|---|---|---|
| EA alerts | alert.ea | Pro and above | yes | yes | yes | |
| Failures | alert.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 above | yes | yes | yes | yes |
| Trades | trade.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 above | yes | yes | yes | yes |
| Signals | strategy.signal: a strategy webhook signal was accepted and sent to its terminals | Solo and above | yes | |||
| Account risk | risk.margin, risk.daily_loss, risk.drawdown: a terminal crossed a limit you set on it (below) | Solo and above | yes | yes | ||
| Daily summary | strategy.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 above | yes | |||
| Terminal state | instance.state at level INFO or WARN | Solo and above | yes | yes | ||
| Deployment status | deployment.completed, deployment.failed | Solo and above | yes | |||
| Live vs backtest | ea.monitor at WARN (decay or slippage) | Solo and above | yes |
- Account default (Settings → Notifications): where a terminal's events go until you pick channels on that terminal.
- Terminal (the Notifications card on its Overview tab): a switch per group decides which events the terminal sends, and a channel picker next to it decides where. The switches default to EA alerts and Failures on, Trades and Terminal state off.
- Strategy: its signals, trades and failures, from every terminal it trades on. Atlaas matches the trade's magic number (for a close, the magic of the position's opening deal) to the strategy.
- EA deployment: that chart's alerts (matched by the alert's chart symbol and timeframe), trades and failures (by its magic number), deployment status and monitor verdicts.
Account risk limits are set per terminal on its Notifications card, each optional:
| Limit | Fires when | Re-arms when |
|---|---|---|
| Margin level below | equity ÷ used margin falls below the % you set | it is back above 1.1 × the limit |
| Daily loss over | equity is that % below the trading day's first equity (the broker's day), so a loss carried overnight is not today's | the next trading day |
| Drawdown over | equity is that % below its peak since you set the limit | the 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"}
| Field | Required | Notes |
|---|---|---|
message | yes | The alert text. Capped at 512 characters. |
symbol | no | Shown with the alert and stored in the event metadata. |
price | no | A number; stored in the event metadata. |
level | no | INFO (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
- 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.
- 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.
- 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.
- 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.