What the file is

One CSV per channel, generated when you click, containing that channel’s entire history we hold — not a sample and not a rolling window. The rows are the same facts the channel’s page shows one signal at a time; the file exists so they can go into your own model instead of your eyes.

  • Encoding UTF-8, comma-separated, one header row, one row per signal.
  • Ordered oldest signal first, so the file reads as a time series.
  • Timestamps are UTC, ISO 8601, to the second (2026-08-28T14:03:00Z).
  • Empty cell means we do not hold that value — never zero. A stop we were never given and a stop at zero are different claims about a channel.
  • Prices and percentages are plain decimal numbers, never scientific notation.
  • A text cell that would otherwise start a spreadsheet formula (=, +, @) is prefixed with an apostrophe, so opening the file cannot run someone else’s text as code.
The text of the post is not in the file

We export the levels, the timestamps and the outcomes, not the channel’s words: a full copy of someone’s posts is a mirror of their channel, and the analysis does not need it. Every row carries source_channel and source_message_id, so the original is one link away at t.me/<channel>/<id>.

Who can download it

The export is part of Pro, alongside unlimited backtests — the same subscription, no separate price. The button is on every channel page whether or not you have Pro, because a paid feature nobody can see is a feature nobody buys.

  • Up to 60 exports a day per account — a seatbelt against a looping script, not a rationing of the data.
  • One channel per file. We do not sell the whole database as a single download.
  • Every download is logged with the account, the channel and the row count.

What Pro costs →

Every column

Column order is part of the contract: new columns are appended at the end, existing ones are never reordered or renamed, so a script that reads by position keeps working.

  • published_at — When the channel published the signal (UTC, ISO 8601).
  • symbol — Exchange symbol as we normalised it, e.g. BTCUSDT. Empty when the post named no tradeable pair.
  • direction — long, short, or unknown when the post did not say.
  • entry_price — Entry level. See entry_is_market: on a market-entry signal this price is our reconstruction, not the channel’s word.
  • entry_is_market — true when the channel said "enter at market" and we filled entry_price from the first minute after publication.
  • targets — Every take-profit level the channel published, in its own order, semicolon-separated. Empty when it published none.
  • sl_price — Stop level as a price. Empty when the channel gave none, or gave it as a percentage — see stop_loss_pct.
  • stop_loss_pct — Stop stated as a percentage of entry instead of a price (some channels write "Stop: 5-10%"). Percent, not a ratio.
  • leverage — Leverage the channel advertised. Empty when unstated; it never enters our replay, which is unleveraged.
  • levels_consistent — false when the published levels contradict the direction (targets below entry on a long, and so on). Usually the channel’s own slip; kept rather than dropped, but such a row must not feed a track record unexamined.
  • source_channel — Telegram username the signal was read from, without the @. With source_message_id: t.me/<source_channel>/<id>.
  • source_message_id — Telegram message id — the row’s receipt at the source.
  • source_edited_at — Telegram’s edit_date when we last re-read the message, if it had been edited. Empty means "not edited, as far as we looked" — we only re-read messages under 90 days old, so an edit to an older post is not detected. An edit never moves the outcome: a signal is scored against the snapshot taken at publication.
  • source_deleted_at — When WE first found the message gone — Telegram gives no deletion timestamp. Same 90-day window as above.
  • source_checked_at — When we last re-read the source message. Empty means never checked, which is a different thing from "unchanged".
  • content_hash — Hash of the signal as first stored, computed once and never recomputed. Empty on rows imported before hashing.
  • is_final — false when the verdict is provisional: the row was resolved before the signal’s 30-day window closed and says only "our candles ran out". Treat those as unfinished, not as losses — filter on this column before computing anything.
  • category — Baseline replay category from our engine, verbatim (ALL_TP_3, TP2_THEN_SL, SL_NO_TP, NO_FILL, NO_DATA, ...).
  • exit_reason — How the baseline replay ended (all_tp, sl, truncated, no_fill, no_data, cancelled, liquidated).
  • entry_filled_at — When the entry filled in the replay (UTC). Empty when it never did.
  • exit_at — When the baseline replay closed the trade (UTC).
  • tp_hits — How many of the channel’s own targets the price reached.
  • pnl_pct — Baseline result — following this one signal exactly as published, equal size, no leverage — in percent of the money committed to it.
  • mae_pct — Worst unrealised excursion against the trade before it ended, percent of entry.
  • mfe_pct — Best unrealised excursion in favour of the trade, percent.
  • one_take_result — The public ranking metric: tp / sl / expired / cancelled / no_fill / no_data for one take at +2%, full position, the channel’s stop or a 10% fallback.
  • one_take_exit_at — When the one-take run ended (UTC).
  • one_take_stop_source — channel when the stop was the channel’s own, fallback when it published none usable and we used 10%.
  • one_take_mae_pct — Worst excursion against the trade during the one-take run. Empty means the trade never started — a drawdown nobody lived through is not a zero.
  • candle_exchange — Which exchange’s 1-minute candles the replay used.
  • resolved_at — When we last replayed this signal (UTC). Compare with published_at and is_final to see how much of the window the replay could actually see.

What the numbers do not say

Three limits worth knowing before the file reaches a model. None of them is hidden anywhere else on this site either.

  • is_final=false means our replay ran out of candles before the signal’s 30-day window closed. Those rows are unfinished, not failures — counting them as losses is exactly the mistake we made on our own pages in August 2026 and had to correct publicly.
  • source_edited_at and source_deleted_at only cover messages younger than 90 days, because that is how far back we re-read a channel. An edit to an older post is not detected, and an empty cell there therefore means "not seen", not "did not happen".
  • Outcomes are recomputed when candle data is backfilled or a resolver bug is fixed, so a file downloaded today and one downloaded next month can disagree about the same signal. resolved_at tells you which replay you are holding.

How the outcomes are computed →