> ## 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 backtest result

> The tiles, the charts, the per-market table, the skip breakdown and the exports.

A finished run opens on its numbers. This page is what each part of that screen is;
how to judge whether a result is worth acting on is
[Reading a result](/guides/reading-a-result).

## The reliability banner

If it is there, read it first. An amber panel at the top of the result opens when any of
four things is true:

* the run was **marked low reliability**, with the engine's own reasons and the
  percentages that tripped each one
* the tape was **truncated** — the fetch budget ran out, so the history is shorter than
  the window label suggests
* **fee confidence is low**, so the modelled fees are less certain than usual
* the engine had **values to guess at**, counted by kind

Once open, the panel also reports two things that do not open it on their own:

* **orphan sells** — how much of the leader's selling had no buy inside your window
  behind it, because the position was opened before the window started
* **structural activity** — the share of this wallet's activity that was splits, merges,
  conversions and redemptions, none of which is a copyable order

<Warning>
  No banner does **not** mean there were no orphan sells and no structural activity. A
  run that trips none of the four opening conditions never shows the panel, so those
  two figures simply go unreported. Read their absence as "not stated", not as zero.
</Warning>

## The assumptions line

One line above the tiles, naming the slippage the run charged and whether fees were
modelled. It matters because a simulated P\&L is a number *plus the cost it was charged*
— the same tape and the same filters answer differently at 1% per fill than at 30%.

## The tiles

<AccordionGroup>
  <Accordion title="The headline eight">
    **Sim P\&L** — what your configuration made, net of modelled fees.

    **ROI** — that P\&L against the starting capital.

    **Target P\&L** — the leader over the same tape and the same settlement rules, so
    the two are comparable by construction.

    **Max drawdown** — the deepest fall below the equity curve's own peak, with the
    percentage and the date it happened.

    **Win rate** — with the market record behind it: wins, losses, flat.

    **Profit factor** — gross profit over gross loss. A dash means there were no
    losing markets to divide by.

    **Fees paid** — modelled from a pinned schedule, and flagged amber when that
    schedule could not be verified for the window.

    **Orders copied** — with the buy/sell split and how many fills your filters
    rejected.
  </Accordion>

  <Accordion title="The second four">
    **Final equity** — split into cash and the value of positions still held.

    **Peak deployed** — the largest cost basis held at once.

    **Missed for cash** — orders that passed every filter and were not placed only
    because the simulated cash was not there. Anything above zero is amber: that
    configuration was starved, not wrong.

    **Markets traded** — with how many tape rows fell inside the window.
  </Accordion>
</AccordionGroup>

## The charts

**Equity** — simulated equity against the capital it started with. The leader's P\&L is
deliberately not on this axis; it is theirs over their own notional, and it stays in
the Target P\&L tile.

**Drawdown** — how far below its own peak the curve sat.

**Daily P\&L** — one bar per day, captioned with the up / down / flat day counts.

**P\&L by entry price** and **P\&L by order size** — bubbles, where the area is the
notional that entered in that band.

## Per-market results

One row per market: the market's name, **Sim in**, **Sim P\&L**, **Leader in**,
**Leader P\&L**, **Missed** and **Orders**. Under each name, whether the market settled
or was marked, what it was marked from, and any shares left open.

Click any header to sort by it; click again to reverse. The default order is sim P\&L,
largest first. Headers with a dotted underline carry a definition — hover or focus
them.

**Missed** is highlighted amber when it is positive. A market where your configuration
ran out of money is a different story from one where it simply lost.

## Why fills were not copied

Every reason a fill was rejected, how many times, and how much of the leader's
notional each reason turned away. Reasons are shown in plain language with their
machine name underneath.

Two of them are labelled **simulation state, not a filter** — they are consequences of
the simulation's own position, not of anything you configured:

* *Simulated cash ran out* — you could not afford the order
* *The leader sold something the simulation never held*

If nothing was rejected, the section says "Every in-window fill was copied."

## Exports

Three CSV buttons, downloaded straight from the result with nothing rounded on the way
out. They are not grouped — each sits beside the section it exports:

| Button               | Where it is                                    | What is in it                                                                                          |
| -------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| **Markets CSV**      | Beside the **Per-market results** heading      | One row per market, in the result's own order rather than your current sort.                           |
| **Skips CSV**        | Beside **Why fills were not copied**           | Reason, count, and the leader notional each reason rejected. Only rendered when something was skipped. |
| **Daily series CSV** | Next to **Deploy as copy trade** at the bottom | The daily equity, cash, positions value, P\&L and drawdown series.                                     |

<Note>
  There is no per-order log. The engine emits aggregates, so the daily series is the
  most granular export there is — and it is labelled as the series it is rather than
  as a trade log it is not.
</Note>

## How this simulation differs from reality

A collapsed panel at the bottom, badged with its own note count. It is the engine's
standing disclosure list, shown word for word. Opening it also reveals six figures:
sells clamped to the position held, fills booked at the leader's price, terminal value
settled and marked, and gross invested and proceeds.

Read it. It is part of the result, not a footnote — and
[Backtest fidelity](/guides/backtest-fidelity) explains why.

## Deploying

At the bottom, **Deploy as copy trade** — see
[Deploying a backtest](/terminal/deploy-a-backtest). If the run used any of the
sim-only controls, a line beneath the button names them and states that a deployed
copy trade carries the other filters and nothing else.

## What to read next

<CardGroup cols={2}>
  <Card title="Reading a result" icon="magnifying-glass-chart" href="/guides/reading-a-result">
    Judging whether a result is worth acting on.
  </Card>

  <Card title="Deploying a backtest" icon="rocket" href="/terminal/deploy-a-backtest">
    Turning it into a copy trade, and the two warnings first.
  </Card>
</CardGroup>
