Backtesting Crypto Grid Bots: The 3% Step That Worked (And What the Backtest Couldn't See)
If you remember one thing from this post, make it this: when I swept grid-step sizes across a basket of liquid coins and several months of data, a 3% step came out profitable nearly everywhere, while 1–2% and 5%+ did not. That's a reusable result and you're welcome to steal it. But a backtest is a flattering mirror, and when I ran the same 3% grid live it taught me the one thing my historical window had been too polite to include. Here's the method, the result, and the catch — in that order.
This is a write-up of real testing, not financial advice. A grid bot is a volatility strategy, not a money printer, and the catch at the end is the part that actually matters.
What a grid bot actually does
A grid bot places a ladder of buy and sell orders around the current price. Price dips to a rung, it buys; price rises to the rung above, it sells what it bought there. In a sideways or choppy market this is lovely — you mechanically harvest the wiggles, buying low and selling high over and over without ever predicting direction.
The whole edge comes from volatility without trend. Hold onto that phrase; it's the entire post, and it's exactly what a careless backtest will hide from you.
How to backtest one honestly
I built a small harness that replays historical OHLC data through the grid logic and refuses to skip the unglamorous parts — maker/taker fees, partial fills, and capital genuinely locked in resting orders. Then I swept the three variables that actually move results:
- Grid step — how far apart the rungs sit (I tested 1%, 2%, 3%, 5%).
- Number of rungs — how much of the price range the ladder covers.
- Per-rung size — how much capital each fill commits.
Each configuration got scored on net P&L after fees and on how much capital sat idle. If your harness skips fees or pretends locked capital is free, tight-step grids will look dramatically better than they trade — that's the most common way people fool themselves here.
The result: 3% was the sweet spot
The pattern was consistent enough to act on:
- 1–2% steps churned themselves to death. Rungs filled constantly, but each round trip barely cleared the fees. Tons of activity, near-zero net.
- 5%+ steps slept through the action. Rungs so far apart that ordinary volatility never reached them, so capital sat idle waiting for fills that never came.
- 3% was the consistent winner — wide enough that each round trip comfortably beat fees, tight enough that normal volatility actually triggered the rungs. Net-positive across the pairs and periods tested.
That's why both of my live grids run a ~3% step today. But notice the load-bearing phrase: across the periods tested.
The catch the backtest couldn't show me: regime
A grid backtest is wildly sensitive to which market regime your historical window happened to contain. Mostly-ranging data makes grids look like free money. A window with a sustained trend — especially a downtrend — bags you.
Run a grid into a falling market and every dip reads as a buy signal, so the bot keeps buying rungs all the way down while the sell orders above sit unfilled because price never climbs back to them. You end up holding a stack of underwater positions ("bags"), and your "profitable" grid has quietly become a long-only portfolio bleeding mark-to-market — the exact directional exposure the strategy was supposed to avoid.
That's precisely what happened live. Running two ~3% grids — one on Kraken, one across ten Alpaca pairs — through a trending-down stretch, both ended up holding drifted positions across most of their universe. Realized grid P&L stayed small and slightly negative while unrealized markdown piled up in the bags. The code did exactly what I told it; the regime simply wasn't the one the backtest had been weighted toward.
The bag-management you actually need
Living with grids in the real world turned out to be mostly bag management — something no backtest forced me to take seriously until live trading did:
- Recovery repricing. When a sell order sits dead because price ran away from it, slowly walk it back toward the market so the bag can eventually clear. This works — it cleared two of three stuck positions on the Kraken bot — but it costs you the difference, so it's loss-management, not magic.
- A bag-aging valve. When a position has drifted far from its grid anchor, stop re-anchoring the ladder to chase it. Hold what you've got instead of averaging down into a trend, so one bad coin can't eat unlimited capital.
- Regime awareness. The single biggest lever isn't step size at all — it's not running a full grid into an obvious sustained downtrend. Pausing new entries, or trimming the universe, beats any parameter tweak.
A checklist for backtesting your own grid
- Steal the 3% step as a starting point — but treat it as a starting point, not the edge itself.
- Backtest across regimes, not just a friendly window. Deliberately include a trending stretch and a crash. If your grid only prints during the calm middle, you measured the weather, not the strategy.
- Model locked capital and fees honestly, or tight-step configs will lie to you.
- Plan your bag management before you fund it. Recovery repricing and a hold-don't-chase rule aren't optional extras; they're the difference between a grid that survives a trend and a bag of falling knives.
Grids are a genuinely sound way to harvest volatility, and they're also one of the easiest strategies to fool yourself about with a kind backtest. Both things are true. The live account is just where you find out which one you actually built.
A write-up of real backtesting and live trading — not financial advice or a product. Grid bots harvest volatility, not certainty; size every position so a trending market can't cost you more than you already decided to lose.