1711 closed trades · 53.7% win rate · paper trading
Performance
Real win rate, profit factor, Sharpe, and drawdown per scalp signal type, computed fresh on every load from the actual resolved-signal log.
Why this page exists
Every signal type currently under test is published here, whether or not it actually works — nothing removed, nothing rounded up. Win rate alone doesn't determine profitability; profit factor and average win against average loss are shown alongside for exactly that reason.
- Signals tracking now
- 78
- Closed trades
- 1,711
- Hit rate
- 53.7%
- Average result
- +0.65
open signals with a live stop and target
every paper trade resolved and recorded, win or lose — all time, and a different ledger from the signals above
over 1,711 closed trades
mean profit per closed trade, in dollars
Two different real populations below, never blend them: journal = trades this bot's auto-trader actually executed through a broker (small, real money); signals/backtest = every signal this bot posted and tracked to a real resolved outcome, whether or not it was ever traded (much larger population, same real price data - not a simulation or a re-run against history with different parameters, see PROJECT_DOCUMENTATION.md's backtest_engine.py notes). A stock/crypto win rate from one population can differ from the other without either being wrong - they're not the same sample.
- closed trades (journal)
- 1711
- win rate (journal)
- 53.7%
- stock win rate (journal)
- 22.9%n=105
- crypto win rate (journal)
- 55.7%n=1606
- stock net P/L (journal)
- -19,248-183 per position
- crypto net P/L (journal)
- +20,366+13 per position
- entry slippage (journal, stock)
- -5,793 0.26% avg on n=103
- share of the stock loss
- 33%execution, not thesis
- scalp signals (backtest, 90d)
- 879
- swing signals (backtest, 90d)
- 609
- stock max loss streak (backtest, 90d)
- 31
- crypto max loss streak (backtest, 90d)
- 28
By market regime, at entry
Every closed position, grouped by the market regime it was opened in.
| Regime at entry | Asset | Positions | Net P/L | Per position | Win rate |
|---|---|---|---|---|---|
| Trending | crypto | 2,103 | +15,518 | +7 | 67.5% |
| Range Bound | crypto | 626 | +6,008 | +10 | 71.2% |
| Trending | stock | 82 | -10,321 | -126 | 28.0% |
| Range Bound | stock | 23 | -8,927 | -388 | 4.3% |
| Unknown | crypto | 12 | -1,160 | -97 | 41.7% |
The regime is read from SPY's own trend structure and is applied to every position opened in that window, including crypto — which is a framing, not a claim about the coin. Rows are ordered by population, because a bucket of eight and a bucket of seven hundred are not equally informative. Regime snapshots are taken periodically, so each position takes the most recent reading at or before its entry; anything opened before the first snapshot is counted as unknown rather than assigned to the nearest one.
Win Rate by Signal Type
Every type that has resolved at least one trade, swing and scalp together. The dashed line marks 30%, a visual anchor only.
Every real signal type, swing and scalp together — green marks types clearing a 30% win rate, not a claim of profitability by itself, just a visual anchor since profit factor/avg win vs loss (tables below) is what actually determines that.
Known Issues
The min_rr gate checked R:R against a signal's planned entry, so a bracket order filling away from the signal price could realize a materially worse ratio than the gate cleared — confirmed live: GSAT opened at 0.49:1 despite clearing a 1.5 minimum. R:R is now re-tested at submission against a live quote, and a signal whose edge has drifted below the minimum is skipped rather than entered. The ratio each position actually got is also recorded from its real fill, so any residual slippage is measurable instead of only findable by hand.
13 of 43 closed positions (all BTC) exited on a 2-hour hold-time timeout rather than a stop or target. Root cause: crypto signals were labelled "scalp" by default, but their stops and targets are sized from daily ATR — a target sits about two daily ranges away, which two hours cannot reach. Only positions that hit their stop quickly ever resolved, and BTC, the least volatile name in the universe, mostly didn't — so the timer collected BTC. The hold limit is now derived from each position's own geometry, so a multi-day target is given a multi-day horizon instead of being closed at 120 minutes, with a longer backstop still preventing a slot being held indefinitely.
Scale-outs (a partial profit-take followed by the final close of the same position) were counted as two separate closed trades, inflating both trade count and win rate. Now grouped by position — a partial fill shows as a badge on its position's single row, not a second row.
Signal-Level Factor Research and Feature Redundancy on Research Lab were silently checking field names that don't exist in the real data (a stale key list left over from an earlier factor-consolidation change) — every real correlation/bucket read was against the wrong keys. Restored to the real shape and verified against live production data.
Publishing the defects next to the numbers is the point — a performance page that never changes its own methodology isn't being audited.
Scalp — By Signal Type (90d)
| Type | Resolved | Win Rate | Profit Factor | Sharpe | Max DD | Avg Win | Avg Loss |
|---|---|---|---|---|---|---|---|
| PM_HIGH | 63 /66 logged | 22.2% | 0.32 | -0.50 | 49.2% | +1.75% | -1.60% |
| GAP | 74 /75 logged | 16.2% | 0.35 | -0.49 | 54.6% | +3.13% | -1.74% |
| CANDLE | 100 /101 logged | 12.0% | 0.28 | -0.61 | 63.9% | +2.94% | -1.46% |
| VWAP | 134 /135 logged | 9.7% | 0.13 | -1.00 | 74.7% | +1.55% | -1.29% |
| ORB | 137 /154 logged | 7.3% | 0.03 | -1.82 | 82.2% | +0.56% | -1.39% |
| EMA_PULL | 30 /32 logged | 3.3% | 0.05 | -1.74 | 34.4% | +2.07% | -1.44% |
| MOM | 258 /263 logged | 0.8% | 0.02 | -2.61 | 92.9% | +2.46% | -1.05% |
| HOD_BREAK | 73 /76 logged | 0.0% | — | -3.71 | 65.1% | — | -1.43% |
| BULL_FLAG | 8 | — | — | — | — | — | — |
| FIB_BOUNCE | 2 | — | — | — | — | — | — |
Sample-size warning applies below 30 resolved trades — treat those numbers as directional, not conclusive. "Resolved" only counts entries with a real recorded exit price — the "/N logged" figure shows how many were logged in total, including any still open or never filled.
Swing — By Signal Type (90d)
| Type | Resolved | Win Rate | Profit Factor | Sharpe | Max DD | Avg Win | Avg Loss |
|---|---|---|---|---|---|---|---|
| SETUP | 87 /88 logged | 34.5% | 0.25 | -0.45 | 62.3% | +1.04% | -2.24% |
| MEAN_REVERSION | 510 /530 logged | 21.0% | 0.60 | -0.14 | 96.0% | +3.57% | -1.59% |
| BREAKOUT | 12 | — | — | — | — | — | — |
Sample-size warning applies below 30 resolved trades — treat those numbers as directional, not conclusive. Rows under 5 show their raw count instead of a colored pill since a single trade can otherwise read as a false 0%/100%. Real swing volume is still thin compared to scalp, so profit factor/Sharpe/drawdown will often show "—" until more trades resolve.
Crypto Backtest
- resolved (90d)
- 4547
- win rate (90d)
- 48.9%
- profit factor (90d)
- 3.03
| Type | Resolved | Win Rate |
|---|---|---|
| ALT_RS | 995 | 56.0% |
| MOMENTUM | 1036 | 50.2% |
| BREAKOUT | 1003 | 49.5% |
| VWAP | 1513 | 43.0% |
Sample-size warning applies below 30 resolved trades — treat those numbers as directional, not conclusive. Rows under 5 show their raw count instead of a colored pill since a single trade can otherwise read as a false 0%/100%.