The number on a row is not “did price hit a target.” It is a signed percent move from the Binance USDT-M last price at ingest to the last price after a wait that follows the signal’s timeframe.
The five rules
- Entry is
fapi.binance.comlast price, stored asentry_pricewhen the row is saved (or backfilled within two days if the snapshot missed). - Horizon is a function of timeframe: M15 → 4h, H1 → 8h, H4 → 24h, D1 → 72h. Other TFs have a matching wait; the default is 12 hours.
- Outcome % is
((mark − entry) / entry) × 100, then flipped for Short so a move in the trade’s favor is positive. - Hit rate is scored rows with outcome % > 0, divided by all scored rows. A flat 0% is scored, not a win.
- Mean is the average of those signed percentages. It can sit near zero even when hit rate is around 50% — that is the usual shape of a mark-to-market book.
Right now the public book is 50.8% hit rate with a mean of -0.03% across 16,734 scored rows. Quiet desk (H1+ and majors) is 48.8% on a smaller sample. Those figures update as the 15-minute outcomes cron catches up.
What the extras are for
After ingest we also snapshot about 4h and 24h, plus max adverse / favorable excursion from klines. Those fields are diagnostics. They do not change hit rate on /accuracy.
This is closer to how a research notebook marks a signal book than to how a futures bot would simulate TP/SL. If you need a path-dependent backtest, export CSV from the desk and run your own stops.
Open the accuracy desk for the same math broken down by side, source, oscillator, and kind.