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

April 16, 2026   ·   Capital: $1,006.89

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.

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)

Numbers

Operations

6

Win rate

83.3%

Capital

$1,006.89

Result

+0.69%

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.

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.

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.

Backlog snapshot

Item Status
2-year backtest — bot V1 (current)done
Fix MM50 bug in productiondone
Recalibrate stop loss to BTC/30min volatilityin progress
Recalibration with rolling 6-week windowpending
Regime identification across market cyclespending
Telegram notificationspending
Expand to ETH/USDT and SOL/USDTpending
Move to live trading after paper validationpending

What should I do next?

Leave your comment below — all feedback welcome, technical or not.

Comentários

Postagens mais visitadas deste blog

The Bot That Survived February

Why I'm building this in public