+First time on the top traders desk?
The desk runs its own numbers and publishes its calls next to the account that trades them. The short route:
toptraders · cross-lab v2 · algorithm report
donchian 1d, long only — a bull-phase algorithm
xl-donchian-1d-l · 1d bar · window 2020-09-01 to 2026-08-13 · 547 instruments · book $1m
Leverage 1.0: it cannot lose more than the book. There is no hedge. It does not short.
1. What it does
- Entry: a price-channel breakout: the bar closes outside the range of the preceding bars
- Filter: the phase picks the side: longs in the bull phase, shorts in the bear one
- Exit: on time: the position is held a fixed number of bars and closed on the next open
- Side: long only
- The decision is made at the bar close and the order goes at the next open. The rule sees no data after the trigger bar.
2. The two constraints
Leverage 1.0 and no hedge: it cannot lose more than the book on any price move.
Both sides are never open on one instrument at once; a share of the book holds one position at a time. There is no short side, so the book only pays funding.
The equity curve
3. The nulls
Every number above is quoted against a distribution, not an average. p95 means five per cent of the random runs came out better than that level. A rule that sits inside the cloud has proved nothing.
| compared against | runs | the rule | control median | control p95 | verdict |
|---|---|---|---|---|---|
| the rule | — | +36% | — | — | — |
| random entry | 200 | +36% | +2% | +7% | beats p95 |
| relabelled instruments | 200 | +36% | +4% | +8% | beats p95 |
| filter reshuffled | 60 | +36% | +18% | +24% | beats p95 |
| random entry inside the bull phase | 60 | +51% | +8% | +22% | beats p95 |
| alt index: hold the whole list | — | +36% | -21% | — | the rule is ahead |
| BTC buy and hold | — | +36% | +432% | — | beats the rule |
Each control prints its number of runs: a p95 without its n is not a band but a single number of unknown precision. The relabelling takes ONE fixed permutation per run and holds it for the whole window; reshuffling on every bar would pay turnover the real book never pays and would understate the control.
The own-phase null is measured on that phase, not the whole window: comparing a phase result with the noise total would compare three years with one.
4. What it traded
The instrument list is rebuilt quarterly by dollar turnover, with no survivor selection: a name that was large and died is traded in the quarter where it stood at the top. Instruments measured: 547. Trades in the window: 2217, trades started before it: 0.
Never touched: names the desk does not trade, leveraged tokens, and anything past a seam in the series — past a seam it is a different instrument.
5. The timing audit
Verdict: clean. Trades checked: 100 of 2217. Mismatches: 0.
DSR and the trial count
| value | number |
|---|---|
| DSR | 0.003 |
| threshold | 0.50 |
| trials in total | 12109 |
| annual sharpe | 0.46 |
| expected maximum of the noise | 1.60 |
The rest of the metrics
The six tiles above are a headline, not the set. Here it is in full, including the tail check: the share of the best three trades and the total without them. One without the other reads wrong in both directions.
| value | number |
|---|---|
| sortino | 0.64 |
| calmar | 0.20 |
| pf | 1.72 |
| recovery | 1.34 |
| stagnation, days | 1816 |
| time in market | +5% |
| median trade | -0.6% |
| median trade in R | -0.091 |
| mean trade in R | 0.746 |
| win to loss | 1.90 |
| losses in a row | 25 |
| best month | +24.1% |
| worst month | -9.7% |
| positive months | +28% |
| share of the best three trades | +9.7% |
| total without the best three | +10315% |
Distribution of trades in R
R is how many units of risk a closed trade returned. The passport carries percentiles, not buckets, so percentiles are what stands here: a histogram off five numbers would draw a shape nobody measured.
| point | R |
|---|---|
| p5 | -3.45 |
| p25 | -1.69 |
| p50 | -0.09 |
| p75 | 2.03 |
| p95 | 7.47 |
| worst trade | -6.80 |
| mean loss | -1.80 |
| mean win | 3.43 |
| best trade | 68.69 |
The rules in full
The field and what it means. Thresholds, windows and multipliers are not here: an algorithm is reproduced from those, and the desk does not print them. The bot reads them from an internal file on its own machine.
| field | what it means |
|---|---|
| timeframe | 1d bar; decided at the close, filled at the next open |
| entry | a price-channel breakout: the bar closes outside the range of the preceding bars |
| side | long only |
| filter | the phase picks the side: longs in the bull phase, shorts in the bear one |
| exit | on time: the position is held a fixed number of bars and closed on the next open |
| exit check | a bar counter from the entry |
| exit fill | the close of the exit bar — the engine fills there, not at the next open |
| intrabar stop | no: only closes trigger, otherwise the test would see a price the decision did not have |
| trailing | none |
| averaging down | none |
| position % of equity | equal shares: the book is split across the instrument list and each share compounds inside itself |
| simultaneous positions | one per instrument on the list; a share holds one position at a time |
| instrument list | a per-bar basket ranked quarterly by dollar turnover; names measured: 547 |
| excluded | names the desk does not trade; leveraged tokens; the series is cut at seams, and return is never computed across a seam |
| window and why | 2020-09-01 to 2026-08-13; each bar has its own window and it is printed, not generalised |
| costs | 0.1% per side: perp taker plus slippage; funding always accrues, the long pays and the short receives |
| leverage / short / hedge | 1.0 / no / no |
| engine | the same file runs the backtest and the bot's book |
Returns by year
The years come from the same months as the grid below. A partial year carries its month range. The controls have no monthly series in the artefact — only their window total is printed, and the desk will not invent yearly numbers for them.
| year | total |
|---|---|
| 2020 (09-12) | +5.9% |
| 2021 | +50.4% |
| 2022 | -15.5% |
| 2023 | +2.6% |
| 2024 | +9.4% |
| 2025 | -10.0% |
| 2026 (01-08) | +0.0% |
| BTC buy and hold, whole window | +431.9% |
| alt index, whole window | -20.8% |
The shape of the result
The four figures below are drawn from the same published values as the tables: the monthly grid, the drawdown, the windowed sharpe and the trades in R. No rule settings are in them.
By month
The sign of the month is the colour, the size is the saturation.
Drawdown over time
How long the book sat below its own peak. More honest than the single worst-drawdown number: both the depth and the length are visible.
Sharpe over a rolling six-month window
One window for every desk report. It shows whether the sharpe was bought by a single lucky stretch.
Trades in units of risk
The halves of the window
| span | total | annualised | drawdown | sharpe | trades | profitable |
|---|---|---|---|---|---|---|
| 2020-09-01..2023-08-23 | +26% | +8.1% | -26.9% | 0.54 | 957 | +47% |
| 2023-08-23..2026-08-13 | +8% | +2.6% | -14.0% | 0.36 | 1260 | +50% |
| the tuning part | +38% | — | — | 0.59 | — | — |
| the check part | -2% | — | — | -0.12 | — | — |
Cycle phases
An algorithm is not required to work in every phase. Its best phase is in the headline; the statistics outside that phase are printed too, and the drawdown outside it is part of the passport, not a footnote.
| phase | days | share of time | total | annualised | sharpe | drawdown |
|---|---|---|---|---|---|---|
| bull | 1164 | 54% | +50.9% | +13.8% | 0.87 | -23.0% |
| bear | 605 | 28% | -12.8% | -8.0% | -1.04 | -17.0% |
| accumulation | 403 | 19% | +3.4% | +3.0% | 0.38 | -8.4% |
Costs and funding
| run | total | sharpe | difference from the base |
|---|---|---|---|
| x0 of the fee | +38% | 0.47 | +2.0% |
| x2 of the fee | +34% | 0.44 | -1.8% |
| x3 of the fee | +32% | 0.42 | -3.7% |
| funding switched off | +42% | 0.50 | -5.8% |
On $1m
| book | total | sharpe | drawdown | trades | orders that did not fit | share skipped |
|---|---|---|---|---|---|---|
| on paper | +36% | 0.46 | -26.9% | 2217 | — | — |
| $250k | +36% | 0.46 | -26.9% | 2217 | 0 | 0% |
| $500k | +36% | 0.46 | -26.9% | 2217 | 0 | 0% |
| $1m | +36% | 0.46 | -26.9% | 2217 | 0 | 0% |
| $2m | +36% | 0.46 | -26.9% | 2217 | 0 | 0% |
| $4m | +36% | 0.46 | -26.9% | 2217 | 0 | 0% |
- AN EXIT ALWAYS FILLS: a position cannot be left open, and a perp the desk holds will be closed at any price. The bar-share cap therefore applies to entries only, while the exit's addition is capped at min(participation, 1). How many exits did not fit their bar is in exits_over_cap, and the heaviest one in max_exit_participation
- AN EXIT ON A BAR WITHOUT TURNOVER is counted separately (exits_without_turnover) and stays out of max_exit_participation: there participation is unmeasurable, not infinitely large. An empty max_exit_participation means no exit had measurable participation, not that exits took no part of a bar
- PARTICIPATION IS TAKEN AGAINST THE BAR'S FULL TURNOVER, a quantity known only at its close, while a real order sees the book at the moment it is sent. The error is optimistic, so the share skipped here is a LOWER bound
- the model does not know the order book: it cannot tell a bar whose turnover was one trade from a bar built out of a thousand
- AN EXIT ON BAR t IS FILLED BY THE BOT AT THE OPEN OF t+1. This is a standing caveat of the desk's paper topology: the engine closes the trade by its own rule, while the bot's book moves on the next bar. The difference between them is the price of the schedule, not of the rule.
6. What this leaves
controls failed: DSR, sharpe
Failed: DSR, sharpe. No account and no panel row are opened for such an algorithm. The row stays here because a negative result is published the same way as a winning one.