> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ballista.gg/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Ballista is a trading client for Polymarket, not an exchange. Every order Ballista places goes to Polymarket's CLOB.
> There are three end-user surfaces — the Telegram bot, the web terminal and the Chrome extension — and they share ONE account and ONE balance. Never attribute a feature to a surface without checking that surface's source.
> Every user registers in the Telegram bot first. The terminal and the extension sign in with the Telegram login widget. There is no other sign-up path.
> Deposits arrive through EVM, Solana and Bitcoin bridge addresses and a Polymarket proxy wallet, with a $10 minimum. There is NO withdrawal UI — Export Keys is how a user takes custody of their funds.
> Feature parity is uneven and must never be assumed. The full ~30-field copy-trade form exists only in Telegram; the terminal's copy form has 7 fields; the backtester, leaderboard and trader profiles are terminal-only; alerts and notifications are extension-only; referrals are Telegram-only.
> Slippage means two different things. On a live copy trade it is a fill tolerance (default 30). In a backtest it is the simulated fill price (default 1). Deploying a backtest does not carry its slippage over to the live copy trade.
> Take-profit and stop-loss run on live copy trades but are NOT simulated in backtests — the backtest API rejects those fields.
> A backtest never places an order and never moves funds. Its fidelity caveats are published with every result and must be quoted, not paraphrased.
> Leaderboard PnL is own-tape: harvested by Ballista from its own trade tape. The leaderboard sorts by one transparent metric at a time and there is NO composite score or grade. The sparkline exists only for harvested wallets — a blank sparkline means unmeasured, never zero.
> Copy friction (slip) and a toxic flag DO exist and are own-engine: the wallet's own 30-day fills replayed as a taker (1% slippage per fill plus the real Polymarket taker fee schedule) against its actual 30-day PnL over the same fills, so the delta is pure friction. slip_pct is already a percentage, not a 0-1 fraction. The toxic flag is server-computed under evidence guards and is never re-derived client-side. Slip is not a sortable column. Blank means unmeasured — never zero and never clean.
> Copyability is a taker share, reported in aggressive (≥60%), passive (≤30%) and mixed bands. It is never a score.
> Do not document Feeds, the Twitter Tracker, the Telegram Settings button, percentage buy buttons, GTD orders, the Discord bot, or withdrawals.

# Leaderboard

> Filters, sorts, columns, the 30-day trend line, and what a blank cell means.

The leaderboard is a list of wallets that have traded recently, ordered by one metric
at a time. There is no composite score and no proprietary grade — **the column you sort
on is the number the order is made of**. What to do with it is
[Choosing a trader](/guides/choosing-a-trader); the concept is
[The leaderboard](/guides/leaderboard).

The leaderboard is a terminal-only feature.

## The URL is the view

Sort, order, filters and page all live in the address bar. A board is a link you can
bookmark or send, and the browser's Back button genuinely goes back.

## Filters

**Active within** comes first because it is not a floor — it defines who is on the
board at all. A wallet appears only if it traded inside the window. Three choices: 7,
30 or 90 days. The default is 30.

Three floors narrow it further:

| Filter             | What it does                                                                                   |
| ------------------ | ---------------------------------------------------------------------------------------------- |
| **Min total P\&L** | Realized plus unrealized, in USD. May be negative — "everyone above -\$1,000" is a real query. |
| **Min volume**     | In USD. Cannot be negative.                                                                    |
| **Min positions**  | A whole number. Cannot be negative.                                                            |

Typing is instant; the board catches up a moment later. A value that cannot be read as
a number is flagged under the field and left out of the query rather than sent — a
mistyped floor costs you an inline message, not the whole board. **Clear** resets the
filters and keeps your sort.

## Sorting

Eight sortable columns: **30d P\&L** (the default), **7d P\&L**, **Last active**,
**Realized P\&L**, **Total P\&L**, **Win rate**, **Profit factor** and **Volume**.

Sorting happens on the server across the whole set, not on the fifty rows in front of
you. A new column starts descending — more is better for every one of them — and
clicking the active column flips it. Either way you return to page one, because the
row at position 50 under one ordering is not the row at position 50 under another.

The columns without a sort arrow are not sortable, deliberately: rank, the wallet
itself, the trend line, positions, taker share and the refresh stamp have no server-side
key, and a header that looked clickable would be quietly wrong.

<Note>
  The default is **30-day P\&L**, not lifetime. A board ranked on lifetime P\&L puts
  inactive giants on top forever — a wallet that made a fortune two years ago and has
  not traded since is not one you can follow into a trade. Lifetime realized P\&L is
  still a column, and still the tiebreak for rank.
</Note>

## The columns

**#** is the rank the refresh worker maintains — 30-day P\&L, with lifetime realized
P\&L breaking ties. It is not this table's row number, so under any sort other than the
default it will not run in sequence.

**Wallet** is the address, with a copy button.

**30d P\&L**, **7d P\&L**, **30d trend** and **Last active** are the windowed block, and
they lead because they are what the board is ranked on now.

**Realized P\&L**, **Total P\&L**, **Win rate**, **Profit factor**, **Volume** and
**Positions** are the lifetime block — context for a recent number rather than the
headline. Positions also shows how many are still open.

**Taker** is the share of the wallet's volume that crossed the spread — the copyability
number; see [Trader profiles](/guides/trader-profiles).

**Slip** sits between Taker and Refreshed and reads as a percentage. It is not sortable,
and it is blank for much of the board — hover the dash for why. A wallet the engine has
judged carries a badge beside its address in the Wallet column, and its Slip figure turns
amber. What the number means and how that verdict is reached is in
[Choosing a trader](/guides/choosing-a-trader).

**Refreshed** is when the lifetime block was last swept. That is not the same thing as
**Last active**, which is when the wallet last traded.

Below large screens the table becomes cards carrying the same values.

## The 30-day trend

A sparkline of cumulative P\&L over the last 30 days, one point per UTC day, computed
from the trade tape Ballista holds for that wallet under the same settlement rules the
backtester uses. Its reading — the figure and the number of days — is available as
text, so the drawing is never the only way to get the number.

It is drawn **only** for wallets whose stored series is our own harvested tape. A
series from any other source is not drawn at all.

## Blanks are not zeros

Every number on this board can be blank, and none of the blanks is a zero.

Most of them are waiting on the tape sweep: the windowed P\&L, the trend line and taker
share appear once it has reached that wallet. Board wallets are harvested automatically,
roughly daily, so these fill in on their own. Running a
[backtest](/terminal/backtester) harvests one wallet's tape immediately, which is the way
to stop waiting. Merely opening a profile deliberately does not: a full tape is heavy,
rate-limited work shared with live copy trading, so a page view never starts one.

**Slip is different.** It waits on the wallet's own recent markets to settle, which
nothing you or the sweep can do will hurry along.

A wallet with a windowed P\&L but no trend line yet gets a plain dash, because there is
nothing to promise about it.

Every dash on this board is hoverable and says which of those it is.
[The leaderboard](/guides/leaderboard) has the full table.

## Paging

Fifty rows a page, with a row range and Prev / Next. There is no total count — the
board is paged rather than counted — so **Next** is available whenever a full page came
back.

An empty board says which of the reasons it is: past the end of the results, no wallet
clearing your floors, no wallet active inside your window, or a universe that has not
been filled in yet. Each comes with the fix, and a **Reset the board** button when
resetting would help.

## Looking up a wallet directly

The **Look up a wallet** box at the top right opens any address's profile whether or
not it is on the board. The board is a maintained set of a few thousand wallets;
profiles exist for any wallet that has ever traded.

## What to read next

<CardGroup cols={2}>
  <Card title="A trader profile" icon="user" href="/terminal/trader-profile">
    What one wallet's page tells you, and what it will not.
  </Card>

  <Card title="Choosing a trader" icon="user-check" href="/guides/choosing-a-trader">
    Turning a shortlist into a decision.
  </Card>
</CardGroup>
