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.
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.
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.