Methodology v1 · in force from launchVersion history
Methodology
How every number on this site is produced, what it can't tell you, and how to recompute it yourself.
On this page10 sections
1. The rules
These nine rules apply to every bot, ours included. Every part of the engine exists to enforce one of them.
- 1Forward-only. A bot's record starts at its first accepted signal. Nothing before that counts.
- 2We price the fills. Bots say what they want to hold. We set the price, from public market data.
- 3Server time only. Our server timestamps each signal on receipt. The bot's own timestamps are ignored.
- 4Append-only. Signals and fills can't be edited or deleted, by the developer or by us.
- 5No hiding losers. A bot can be retired, never deleted. A developer's profile lists every bot they ran.
- 6Three active bots at most. Per developer, so nobody can launch fifty bots and advertise the lucky one.
- 7Costs always on. Every fill pays a fee and slippage.
- 8Earned rank only. A rank needs 90 days and 20 fills. Placement is never for sale.
- 9Always a benchmark. Every metric sits next to the same metric for buy-and-hold BTC over the same days.
2. How a signal becomes a fill
A signal says what share of the bot's equity it wants in each asset. We decide the price. For a signal received at server time t:
- Wait for the first 1-minute candle that opens after t. Its open is the reference price. That price doesn't exist yet when the signal arrives, so looking ahead is impossible.
- Size the order: target weight × equity − current position value. Changes smaller than 0.1% of equity are skipped, except a target of 0, which always closes the position.
- Apply slippage against the bot: 5 bps for BTC and ETH, 15 bps for other pairs.
- Charge a 0.10% fee on the traded value.
- Record the fill. It can't be edited or deleted afterwards.
A real fill from Momentum Ladder, step by step:
signal received 2026-10-09 07:22:24 UTC our server's clock
target ETH/USDT 0.20 → 0.15
next candle 07:23 open 3,514.63
order (0.15 − 0.20) × equity ÷ 3,514.63 → sell 0.18581 ETH
slippage 5 bps against the bot
3,514.63 × (1 − 0.0005) = 3,512.87
fee 0.10% × 0.18581 × 3,512.87 = 0.65 USDT
fill recorded 2026-10-09 07:23:00 sell 0.18581 ETH at 3,512.873. Costs
0.10% is a conservative retail taker fee. Every bot starts with 10,000 virtual USDT. The BTC benchmark pays the same entry fee.
4. Metrics
Equity is marked once a day at 00:00 UTC. Yearly figures use 365 days, because crypto trades every day. The risk-free rate is 0 in v1.
Return
AlwaysChange in the bot's virtual account since its first fill, after fees and slippage.
return = equity_today ÷ 10,000 − 1
Max drawdown
AlwaysThe largest fall from a peak to a later low.
max_dd = min over t of (equity_t ÷ peak_t − 1) peak_t = highest equity up to day t
Volatility
After 90 daysHow much daily returns swing, scaled to a year.
volatility = stdev(daily returns) × √365
Sharpe
After 90 daysReturn per unit of volatility, yearly. Higher is better; above 1 is good.
sharpe = mean(daily returns) ÷ stdev(daily returns) × √365
Sortino
After 90 daysLike Sharpe, but only falls count as risk.
sortino = mean(daily returns) ÷ downside_dev × √365 downside_dev = √(mean of min(r, 0)²)
Calmar
After 90 daysYearly return divided by the worst drawdown.
annualized = (1 + return) ^ (365 ÷ days) − 1 calmar = annualized ÷ |max_dd|
Every metric is shown next to the same metric for buy-and-hold BTC over the same days.
5. Ranking
- Provisional
- Fewer than 90 days since the first fill, or fewer than 20 fills. Listed under New bots by start date, with no rank and no yearly figures.
- Ranked
- At least 90 days and 20 fills. Sorted by Sharpe by default; visitors can also sort by return, max drawdown or days live.
- Goes quiet
- A bot that stops sending signals isn't retired. It keeps its last positions, marked to market every day, as it would with real money.
- Retired
- The developer stopped it, for good. Positions close at the next candle open. The record is frozen and stays listed under Retired and on the developer's profile.
No placement is ever for sale. There are no sponsored or featured slots.
6. The benchmark
Each bot is compared with buying 10,000 USDT of BTC on the day its record starts and holding it over the same days. The benchmark pays the same entry fee as a bot and is marked at 00:00 UTC, like the bot. If a bot can't beat that, its rank says so: the leaderboard shows "Ahead" or "Behind" next to every Sharpe.
7. Red flags
Flags are computed by these rules, the same way for every ranked bot. No one can add, remove or buy them, us included.
The last two rules need the full trade list, so they show on bot pages, not in the leaderboard. Each flag shows its measured value next to its rule.
8. Delayed trade log
Signals and fills appear on a bot's page 24 hours after they happen. That keeps copycats from following a developer's signals in real time, while every trade stays checkable a day later. The equity curve and metrics update once a day. The developer sees their own signals live in their dashboard.
9. Known limitations
These numbers are careful, not perfect. Here is what they can't capture.
- Paper trading, not real orders. Real fills can be worse in fast markets, and large orders move prices. Our slippage figures are assumptions, not measurements.
- One-minute resolution. Strategies that act within a minute can't be represented honestly, so we don't try.
- Long only in v1. No shorts, leverage or perpetual futures yet.
- One reference exchange. Prices come from one exchange's 20 or so most liquid USDT pairs. Other venues can differ.
10. Check it yourself
The fill engine and the metrics are open source. Download a bot's signals and candles from its page, then run the replay. The only inputs are the signal log and public candles, so you get the same fills and the same numbers.
Read the code on GitHub