How we test Telegram signals
Methodology · Last updated: 13 October 2026
A signal channel can say anything about its results. We only report what the market allows. This page explains, rule by rule, how every signal is turned into a tested trade, which costs we include, what we cannot test, and where our method has limits. If a rule here and a result in the app ever disagree, tell us at support@myfxpips.com.
The short version
- Prices: Dukascopy historical data, 1-minute candles, separate bid and ask prices.
- Entries: at the real market price after the signal was posted, never the price the channel quoted.
- Costs: spread and slippage are included. Commission and swap are not.
- Same-minute ambiguity: if the stop and a target are both hit in the same minute, we count the stop first and flag the trade.
- Nothing is guessed silently: signals we cannot test are listed separately, with the reason.
On this page: Prices · Entries · Costs · Exits · Follow-up messages · Untestable signals · Deleted and edited messages · How results are calculated · Known limitations
1. Where the prices come from
We use historical price data from Dukascopy at 1-minute resolution, with separate bid and ask candles. This lets every trade be filled at the side of the market a real trader would get.
If a minute has no ask price in the data, we use the bid plus a fixed default spread for that symbol, and mark that candle as estimated.
All times are based on Telegram's own message timestamp, in UTC.
2. How a trade is entered
- Timing: a signal takes effect at the open of the first 1-minute candle starting at or after the moment it was posted, plus a 10-second delay. A signal posted at 10:00:35 is entered at the open of the 10:01 candle.
- Price: we use the real market price at that moment, not the price the channel quoted. A BUY fills at the ask, a SELL at the bid, plus slippage. So every trade starts a spread behind, as it would in a real account.
- Market already past the levels: if, at entry time, the market is already beyond the stop loss or the first target, the trade is skipped and marked "price beyond levels".
- Sanity check: a signal whose entry, stop or targets are implausibly far from the market price, or whose stop or target is on the wrong side, is kept on record but excluded from results as "failed sanity check".
- Pending orders (buy limit, sell stop and so on) are supported. They fill only if the price actually reaches them, and expire if not filled within 24 hours. Expired or cancelled orders are listed as "not triggered", not as losses. Stop orders fill with slippage; limit orders do not.
- Entry zones such as "buy 2648–2652" are treated as a limit order at the edge that is worst for the trader: the top of the zone for a BUY, the bottom for a SELL. If the market opens at a better price, it fills there.
3. Costs included
Spread is built in through bid and ask prices. Slippage is a fixed amount per symbol, added to market entries, stop-order entries and stop-loss fills. It is not added to take-profit fills or to closes requested by the channel.
Default values, in pips (the spread value is used only for estimated candles):
| Symbol | Slippage | Default spread | One pip equals |
|---|---|---|---|
| FX pairs | 0.2 | 1 | 0.0001 (0.01 on JPY pairs) |
| XAUUSD (gold) | 2 | 3 | $0.10 |
| XAGUSD (silver) | 2 | 3 | $0.01 |
| BTCUSD | 10 | 30 | $1 |
| ETHUSD | 5 | 15 | $0.10 |
| USOIL, UKOIL | 2 | 3 | $0.01 |
| US30 | 1 | 3 | 1 point |
| SPX500 | 0.5 | 1 | 1 point |
| NAS100, GER40, UK100 | 1 | 2 | 1 point |
| JP225 | 3 | 8 | 1 point |
Not included: commission and swap. Results are therefore slightly better than a real account would show. The difference is largest for channels that take many small trades or hold positions overnight.
4. How a trade exits
- Stops and targets are checked against the exit side of the market: the bid for a BUY, the ask for a SELL.
- Several targets (TP1, TP2, TP3): by default the position is split equally across them, and each part closes when the price actually touches its own target. The stop covers whatever is still open.
- Stop and target in the same minute: 1-minute data cannot show which came first, so we assume the stop was hit first and flag the trade as uncertain. This can only make a channel look worse, never better.
- Trades still open at the end of the test are shown separately as "open at end" and are not counted in wins, losses or totals.
5. Follow-up messages
Channels often post updates after a signal: "move SL to breakeven", "close half", "close now". We apply them, but only from the moment they were posted.
When and at what price
- An update takes effect at the open of the first 1-minute candle at or after its post time plus 10 seconds, before that candle's high and low are checked. It is never applied earlier.
- "Close now" and partial closes fill at that candle's open, at the exit-side price.
- Partial closes close the share the message states, or 50% if it gives none.
- "Move SL to breakeven" with no price sets the stop at your actual fill price, including spread and slippage, not at the entry the channel quoted.
- "TP1 hit" and similar messages are treated as claims, not actions. A target only counts if the price really reached it.
- For an order that has not filled yet, a stop move or partial close is ignored, and "close now" cancels the order.
Which trade an update belongs to
Updates do not always say which trade they mean. We match them in this order:
- Direct reply: the update replies to the signal in Telegram (or to an update that was itself a reply). This is the most reliable link.
- Same symbol: the update names a symbol, so it is linked to the most recently posted open signal on that symbol. If it names no symbol and only one signal is open, it is linked to that one.
- AI check: where enabled, an AI model reviews the five most recent open signals and links the update only if it is highly confident.
- No match: the update is recorded as ambiguous and flagged. It never changes any trade.
For channels whose updates are reliably posted as replies, we can restrict testing to direct replies only.
Known weak spot: rule 2 knows which trades the channel has not closed, not which ones the market has already closed. If two trades are open on the same symbol and the newer one already hit its stop, an unreplied "close now" is linked to that newer trade, and the older trade the channel probably meant is left unchanged.
6. Signals we cannot test
We do not guess. A signal is listed as untestable, with its reason, when:
- the symbol is unknown or not supported;
- it fails the sanity check described above;
- it is a pending order with no entry price;
- there is no price data for that time;
- it has no stop loss on a symbol where we use no default stop.
Signals without a stop loss on FX pairs, gold and silver are tested with a default stop (50 pips on FX, 100 pips on gold and silver) and flagged, which lowers the channel's confidence level. On crypto, oil and indices they are untestable.
Screenshot-only signals (an image with no text) are not read. If an image has a caption, the caption is read. Messages that no rule can understand are recorded as unparsed.
Supported markets: about 40 symbols, covering FX majors and crosses, gold, silver, BTC, ETH, two oil contracts and six indices (US30, SPX500, NAS100, GER40, UK100, JP225).
7. Deleted and edited messages
- Deleted messages: every message is stored when we first read it, and a later deletion by the channel does not remove it from your results. A message deleted before we first read it cannot be recovered, because Telegram removes it for everyone.
- Edited messages: the latest version of a message is the one tested. Earlier versions are stored. This means that if a channel edits a signal after the outcome is known, for example by moving the stop, the test currently uses the edited values.
8. How results are calculated
- R (risk multiple): the result of each trade measured against its initial risk: (exit price − fill price) ÷ (fill price − initial stop), using real fills, weighted across partial closes.
- Wins, losses and breakevens: a trade within ±0.1R of zero is a breakeven. Win rate is wins ÷ (wins + losses); breakevens are excluded.
- Maximum drawdown: the largest peak-to-trough fall of the equity curve, in percent, assuming each trade risks 1% of the current balance. The leaderboard also shows the largest drop in R.
- Confidence level: based on how many trades were tested and how many are uncertain (default stop used, or stop and target in the same minute). Low: fewer than 10 tested trades, or 15% or more uncertain. High: 20 or more tested trades and under 5% uncertain. Medium: everything in between.
9. Known limitations
- 1-minute candles cannot show the order of prices within a minute. We resolve this conservatively, but it is still an assumption.
- Commission and swap are not included.
- Your broker's prices, especially on gold and indices, can differ slightly from Dukascopy's.
- Updates that do not reply to their signal are matched by rules and, where enabled, AI. These links can be wrong.
- Edited signals are tested in their final form.
- Screenshot-only signals are not read.
- Price history is limited by the data available: up to 60 months for gold, 48 months for the main FX pairs and 12 months for other symbols.
Past results do not predict future results, and nothing on myfxpips is financial advice. See our risk disclosure.