Two years of data, seven versions, one uncomfortable number
Help My Bot
Two years of data, seven versions, one uncomfortable number. paper trading
Session #2
01
What happened today
I came into this session with one clear objective: run a 2-year backtest on the bot as it currently stands and find out if the results from the 6 and 12-week tests were real or just lucky.
They were not entirely lucky. But they were optimistic.
Getting the data turned out to be its own adventure. The Binance API blocked access from Google Colab — geographic restriction. Yahoo Finance only covers 60 days of 30-minute candles. CryptoCompare had a 7-day limit on their free tier. We eventually found a Kaggle dataset with BTCUSDT 30-minute data from 2020 to 2024 — 82,359 candles, clean, reliable. That became the foundation.
Then we ran the backtest. Seven versions in total, each one trying to fix what the previous one revealed. The bot went from -14.63% to +0.37% — not by improving the strategy, but by removing the stop loss. That's the uncomfortable number. The best result we found requires operating without a safety net. I'm not ready to accept that. But I'm also not ready to pretend the data didn't say it.
02
Technical parameters
Entry conditions — all must be true simultaneously
- RSI < 45
- Price at or below Bollinger Band inferior × 1.005
- ATR current > ATR average (6-week rolling window)
- Volume current > 20-period average
- MM50 current > MM50 3 candles ago (updated — was 10 candles)
- ATR current < ATR average × 1.7 (no spike)
Exit conditions — any one triggers the exit
- RSI > 70
- Price at or above Bollinger Band superior × 0.995
- ATR < 70% of average AND position negative
- ATR > ATR average × 1.7 (spike lock with open position)
- Stop-loss: on hold pending recalibration (updated)
Other parameters
- Timeframe: 30 minutes
- Pair: BTC/USDT
- Fee per cycle: 0.20% (Binance maker)
- Breakeven win rate: 52.6%
- Capital: $1,000 (simulated)
03
Numbers
Operations
6
Win rate
83.3%
Capital
$1,006.89
Result
+0.69%
04
What the data showed
The 2-year backtest covered September 2022 to September 2024 — bear market bottom, full recovery, and bull run. 34,943 candles. Solid ground for a real test.
Version 1, faithful to the bot in production, returned -14.63%. The stop loss was the main culprit — it was being triggered by normal BTC volatility, cutting positions that would have recovered. We found 19 operations where the stop was exceeded beyond its own threshold. Not because the market crashed. Because 30-minute BTC candles are simply noisier than 1.8% allows.
We tried seven versions — adding dynamic stops, regime filters, rolling windows, confirmation logic on the Bollinger exit. Most things made it worse. The one thing that made it better was removing the stop entirely. Version 3, no stop loss, returned +0.37% over 2 years.
The deeper finding was harder to accept: at the moment of entry, winning and losing operations are statistically identical. Same RSI, same ATR, same volume, same Bollinger width. The indicators cannot distinguish them. What differentiates a good year from a bad one isn't the entry — it's what the market does afterward.
05
What I decided
I decided not to remove the stop loss from production.
The stop is not a strategy component — it's a safety layer. The bot needs to be profitable without it, and right now it barely is. But operating without any hard floor on a real account is not something I'm willing to do. The correct path is to recalibrate the stop to match the actual volatility of BTC on a 30-minute timeframe — not to eliminate it.
The backtest also revealed a bug that was silently active since the beginning: the MM50 filter was checking mm50 > 0 instead of mm50 > mm50_3_candles_ago. It was never actually filtering anything. That has been fixed and deployed to production.
06
What's next
Recalibrate the stop loss using the actual volatility distribution of BTC/30min — the minimum stop should be at least 2× the average candle movement, so it only triggers on real adverse moves, not noise.
07
Backlog snapshot
| Item | Status |
|---|---|
| 2-year backtest — bot V1 (current) | done |
| Fix MM50 bug in production | done |
| Recalibrate stop loss to BTC/30min volatility | in progress |
| Recalibration with rolling 6-week window | pending |
| Regime identification across market cycles | pending |
| Telegram notifications | pending |
| Expand to ETH/USDT and SOL/USDT | pending |
| Move to live trading after paper validation | pending |
What should I do next?
Leave your comment below — all feedback welcome, technical or not.
Comentários
Postar um comentário