DEV Community

Áron Lukács
Áron Lukács

Posted on AI-assisted

There is no standard for a Telegram trading signal. Here is what 72,000 of them look like.

Disclosure first: I'm Aron Lukacs, and I build TTMT – Telegram to MetaTrader, a service that reads trading signals posted in Telegram channels and executes them on MetaTrader accounts. Everything below comes out of that work.

A Telegram trading signal is a plain-text message that names a direction and an instrument. It usually adds an entry price or zone, a stop loss, and one or more take-profit levels. There is no standard for any of it. Every channel writes its own way, and the software reading them has to cope.

I wrote the format down as an open specification, and published parser fixtures with a JSON Schema next to it, also on npm as telegram-signal-test-corpus. This post is the short tour for anyone building a parser, a bot, or a trading tool on top of free-text messages.

Start with who owns the failure

Two numbers, measured across just under 72,000 new-trade signals in the 90 days to September 2026:

  • 0.14% failed for a reason the channel owner controlled.
  • Roughly ten percent failed for reasons entirely on the subscriber's side: their own daily-loss limit, a broker connection still syncing, no free margin, or a symbol they had filtered out.

The reader is rarely the bottleneck. A user who says "the bot skipped the trade" is far more likely to be looking at their own settings than at a message nobody could parse.

That changes the first design decision. Before another regular expression, give every failure an owner: the channel that wrote the message, the subscriber whose account or settings blocked it, or your own code. A failure without an owner becomes a support ticket you answer by hand.

The two required fields

A message is a trade instruction if it carries a direction and a symbol. Entry, stop loss, and take profits are all optional.

Direction is BUY, SELL, LONG, SHORT, and the obvious variants. Symbol is where the variety starts: XAUUSD, XAU USD, GOLD, #XAUUSD, and XAUUSDSELL with no space between the symbol and the direction.

So Sell gold now is a valid signal. With no entry, the trade is at market. With no stop, the stop has to be inferred from the channel's history, and an inferred stop is a guess. If your output schema has one field worth adding beyond the obvious ones, make it a flag saying whether each value was stated or inferred.

Layouts seen in the wild

Three shapes, all real, with the channel names removed.

Bare inline, with the target keyword repeated:

XAUUSD BUY 4329

TP 4334
TP 4339
TP 4344
TP 4350 OPEN

SL 4320
Enter fullscreen mode Exit fullscreen mode

A named zone on its own line:

GOLD BUY SETUP

Gold Buy Zone 4438 - 4433

SL: 4428

TP1: 4443
TP2: 4448
TP3: 4453
TP4: Hold
Enter fullscreen mode Exit fullscreen mode

Direction first, price block below:

XAUUSD (Gold)
BUY NOW
4346-4344

TP 1: 4350
TP 2: 4354
TP 3: 4360
Stop Loss: 4342
Enter fullscreen mode Exit fullscreen mode

Repeating a bare TP is fine. Targets are taken in the order written, so the first one is TP1. The spec runs from TP1 to TP6. A message with more than six targets keeps the first six and is still accepted.

What a reader must tolerate

  • Emoji anywhere, including inside the numbers.
  • Stop Lose, Stoploss, S/L, and SL :. All four mean the stop, and the misspelled one is common enough to be in the spec.
  • A numbered or titled prefix such as 3. GOLD BUY SETUP.
  • 4438 - 4433, 4438/4433, and @ 4438-4433. All three are an entry zone, and the zone can be written high to low or low to high.
  • Mixed languages in one message, and risk boilerplate at the end of every post.

The runner deserves its own line. TP4: Hold, TP OPEN, and Hold for more mean the last part of the position stays open with no numeric target. A parser that insists on a number for every TP line will either reject a good message or invent a price. Model the runner as its own value.

Two hazards that survive a perfect parse

The first is an entry zone that crowds the stop. When the entry is a range, orders spread across it, and the deepest one sits at the edge nearest the stop. Measure the gap from that edge: for a buy, the bottom of the zone minus the stop; for a sell, the stop minus the top of the zone.

It is subtler than it looks, because subscribers can widen entry zones in their own settings. A gap that is safe as posted can be eaten by somebody else's configuration. A reader has three options when the gap gets too small: shorten the zone, fall back to a single entry, or refuse the trade. Each one is defensible. Pick one, and report which one fired, because this is exactly the kind of failure whose owner is unclear.

The second is a message that arrives after the price has gone. If the market has already traded through the stop by the time you read the message, the position should not open. Opening it means entering a losing trade against targets anchored to a price that no longer exists. Tight scalps on gold are where this bites.

Alert first, details later

More than half the channels in TTMT's public directory post an alert and fill in the numbers afterwards:

GOLD BUY NOW
Enter fullscreen mode Exit fullscreen mode

then, as a reply:

Entry 4438-4433
SL 4428
TP1 4443
TP2 4448
Enter fullscreen mode Exit fullscreen mode

A reader needs a mode for this: open on the alert, then apply the numbers as a modification when they arrive. The pattern that causes trouble is a channel switching between the two modes without warning.

Replies beat standalone follow-ups

Trade management from a channel is free text too. Real examples:

Move sl to Be
Close worst ones and keep best ones running after making them risk free
Enter fullscreen mode Exit fullscreen mode

Reading those sentences is the smaller problem. The larger one is working out which open trade they refer to. Over the same 90 days, close instructions posted as a reply to the original signal executed at 25.5%, against 15.1% for the identical instruction posted standalone. Modifications ran 59.5% against 52.7%.

A reply removes the guesswork about which trade is meant. It is the one piece of structure a free-text channel gives you for nothing, so use it as your join key before any text heuristic. If you talk to channel owners, this is the cheapest change to ask for: reply to your own signal for every breakeven, partial, or close.

Where to take it from here

The specification has the full field table and tolerance rules. The fixtures repo is there to run your own parser against. Pull requests with real message shapes are welcome, with the channel name removed.

About the product this came out of: TTMT – Telegram to MetaTrader reads the signals in the Telegram channels you already follow and executes them on your MetaTrader account. It does not provide signals of its own. The maintained version of the format lives in the signal format guide, and the product is at telegramtometatrader.com.

Top comments (0)