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

# A trader profile

> Provenance, recent activity, lifetime stats, copyability, execution profile and recent trades.

A trader profile is everything Ballista knows about one wallet, with each part
labelled by where it came from and how old it is. Open one from any row on the
[Leaderboard](/terminal/leaderboard), from the wallet lookup box, or by going to the
address directly.

The wider question this page exists to answer is
[Choosing a trader](/guides/choosing-a-trader); the concept is
[Trader profiles](/guides/trader-profiles).

## The header

The address with a copy button, its rank if it has one, and two buttons: **Backtest
this wallet** and **Copy this trader**. Both hand the address to the relevant form and
seed nothing else — the run or the copy trade is still one you configure.

A wallet the maintained universe no longer sees trading is badged **rotated out**.

## The provenance line

Under the address, one line saying where the statistics below came from:

* **Live statistics, read *n* ago** — fetched from upstream at most fifteen seconds
  before the page was served.
* **From the last refresh sweep, *n* ago** — the live call did not answer, so these are
  the worker's last maintained values.
* **No statistics available for this wallet yet** — the wallet is in the universe but
  has never been refreshed, so every stat below is blank rather than zero.

Hover or focus the line for the longer version. A wallet outside the maintained
universe also says so, and has no rank.

This distinction is on the page rather than flattened away because "as of fifteen
seconds ago" and "as of an hour ago" are different claims about a number you are about
to risk money on.

## Recent activity

**7d P\&L**, **30d P\&L**, **30d volume**, **Last active**, and a 30-day cumulative P\&L
chart underneath.

The two P\&L tiles and the chart are **realized** P\&L from Ballista's own cached tape for
this wallet, valued the way the [backtester](/terminal/backtester) settles — positions
still open are not in them. The other two tiles are what they say: traded volume over
the last 30 days, and when the wallet last traded.

The block sits above the lifetime one on purpose: it is the only part of a record you
can still follow into a trade.

A blank tile says which of three things is true, and only one of them is worth waiting
through:

| It says                            | What it means                                                                           |
| ---------------------------------- | --------------------------------------------------------------------------------------- |
| **harvesting recent activity…**    | Active wallet, sweep has not reached it. It fills in on its own.                        |
| **rotated out of the universe**    | We stopped seeing it trade, so its tape is no longer harvested. These will not fill in. |
| **not in the maintained universe** | Nothing sweeps it. Running a backtest is what produces a tape we can measure.           |

## Lifetime

Eight tiles: **Realized P\&L** (settled markets only), **Unrealized P\&L** (open
positions at their current mark), **Total P\&L**, **Volume**, **Win rate**, **Profit
factor**, **Positions** and **Wins / losses**.

Where a figure cannot exist it says why rather than showing a zero — "no market has
settled yet", "no losses to divide by".

## Copyability

The block that answers whether a copy trade can actually follow this wallet, and the
answer is mostly its **taker share**: the fraction of its volume that crossed the
spread, weighted by notional rather than by fill count.

The block reads out one of three bands — **aggressive** at 60% or more, **mixed**
between, **passive** at 30% or less — with a sentence on what each means for a copy
trade. What the bands imply, and how to weigh one against a wallet's P\&L, is in
[Choosing a trader](/guides/choosing-a-trader).

The percentage is always on screen beside the words. It is not a score, and nothing
blends it with P\&L or win rate into a grade — a blended number would hide exactly the
disagreement you need to see: a spectacular P\&L with a low taker share is not a wallet
to copy.

### Copy friction

Below the band, under a divider, **Copy friction, last 30 days** shows four tiles: **Slip
rate**, **Slip amount**, **Backtest copy P\&L** — your side, replayed as a taker — and
**Actual 30d P\&L**, the wallet's own, so the two sit next to each other. A line underneath
states the assumptions the replay used, and a wallet the engine has judged carries a badge
beside the heading with a sentence explaining it.

When it cannot be measured the block reads **Copy friction not measured**, shows a dash,
and gives the reason — ending on the point that this is neither zero nor clean, but
unmeasured.

What these numbers mean, and how that verdict is reached, is in
[Choosing a trader](/guides/choosing-a-trader).

### When these figures appear

Everything in this section comes from the wallet's trade tape. Board wallets are swept
automatically, roughly daily, so the numbers arrive on their own. Running a backtest
harvests this wallet's tape immediately and is the way to stop waiting — the block offers
a **Backtest this wallet** button when there is no tape at all. Opening this page
deliberately does not start a harvest: a full tape is heavy, rate-limited work shared with
live copy trading.

There is a second, different blank: a tape exists but has nothing in it to weigh. That
one says so plainly and does not send you after a backtest you have already paid for.

## Execution profile

Four tiles from the cached tape, captioned with how many fills across how many markets
and when the tape was synced:

* **Median hold** — share-weighted, over the closed lots in the tape
* **VWAP entry** — volume-weighted average buy price, in cents
* **Hedged markets** — the share of markets where more than one outcome was bought
* **Last 20 markets** — a wins / losses / flat record, with the P\&L behind it

A blank tile here says either *not measured yet* (no tape yet — wait for the sweep, or
run a backtest to harvest one now) or *not in
the cached tape* (a tape exists, but this particular metric cannot be computed from it
— a VWAP entry for a wallet that has only ever sold, for instance). Hover or focus for
the full explanation.

Two notes appear when they apply: that the fill budget cut the read short, so the tiles
describe only the most recent fills; and that some sold shares had no matching buy
inside the cached window, so the median hold describes only the recent part of the
wallet's behaviour.

## Recent trades

The wallet's last few fills — market, price, size, value, its own side, whether it was
maker or taker, and how long ago. Capped at twenty rows, and labelled as the preview it
is.

The caption says where they came from. **From the harvested tape** means deduplicated
rows out of our own cache. **One live page** means no tape is held for this wallet and
this was fetched on the spot.

## Not found

A well-formed address nobody has traded with says exactly that: a wallet appears here
once it has made at least one trade. A malformed address is caught before the request
is made.

## What to read next

<CardGroup cols={2}>
  <Card title="Choosing a trader" icon="user-check" href="/guides/choosing-a-trader">
    Weighing copyability against a record.
  </Card>

  <Card title="Copy trading" icon="copy" href="/terminal/copy-trading">
    Setting one up, once you have picked a wallet.
  </Card>
</CardGroup>
