Bollinger Bands Trading Bot: Mean-Reversion and Breakout
Up to 70% of standard Bollinger Bands signals on the crypto market are false. The reason is that cryptocurrencies often exhibit high volatility, and the classic settings (SMA 20, 2 sigma) don't filter bandwidth. Our specialization is creating bots that account for volatility regime, bandwidth, and volume. Below are typical approaches and engineering solutions we use in every project.
Bollinger Bands are a volatility indicator developed by John Bollinger. Three lines: a middle line (SMA 20) and two channels at a distance of N standard deviations (usually 2). 95% of the time, price stays within the channels. A breakout outside the channels is a statistically significant event. But in the crypto market, due to high impulse frequency, many breakouts turn out to be false.
How Bandwidth Filter Prevents False Signals
Channel width (bandwidth) = (upper–lower)/mid. The normalized value filters out moves that occur during high volatility. Mean-reversion works only when bandwidth < 0.04 — when the channel is narrow (Bollinger Squeeze). Ignoring this filter is a typical mistake leading to catching falling knives. For example, when bandwidth > 0.04, price can move far beyond the band and not return — that's a trend move, not a pullback. Bollinger Squeeze with a bandwidth filter is 3 times more reliable than the standard signal for mean-reversion.
Logic of the Strategy
Mean-reversion approach: price breaks below the lower band → oversold → we buy expecting a return to the middle. Applied only when bandwidth is low.
Breakout approach: price breaks above the upper band with high volume → trend continuation → we buy. Filter by %B > 1 and volume increase >30% from the average.
Comparison of Approaches
| Characteristic | Mean-reversion | Breakout |
|---|---|---|
| Market regime | Flat, squeeze | Strong trend |
| Bandwidth | < 0.04 | > 0.04 |
| Typical mistake | Buying without filter — catching a falling knife | Entry on a breakout with declining volume |
| %B | < 0 | > 1 |
| Signal frequency | Medium (3-5 per day) | Low (1-2 per day) |
Why Strategy Choice Depends on Market Regime
The crypto market is non-uniform. During consolidation (e.g., after a strong rally), bandwidth narrows — ideal for mean-reversion. During news impulses or listings, bandwidth expands, and breakout yields better results. We analyze the last 6 months of history, determine the prevailing regime, and tune the bot's parameters accordingly. If the market switches regimes frequently, we combine both strategies with weight coefficients.
Implementation
import pandas_ta as ta import ccxt class BollingerBandsBot: def __init__(self, symbol: str, period: int = 20, std_dev: float = 2.0): self.exchange = ccxt.bybit({'apiKey': API_KEY, 'secret': SECRET}) self.symbol = symbol self.period = period self.std_dev = std_dev async def get_signal(self) -> str: ohlcv = await self.exchange.fetch_ohlcv(self.symbol, '1h', limit=100) df = pd.DataFrame(ohlcv, columns=['ts','open','high','low','close','vol']) # Compute Bollinger Bands bb = ta.bbands(df['close'], length=self.period, std=self.std_dev) lower = bb[f'BBL_{self.period}_{self.std_dev}'].iloc[-1] mid = bb[f'BBM_{self.period}_{self.std_dev}'].iloc[-1] upper = bb[f'BBU_{self.period}_{self.std_dev}'].iloc[-1] price = df['close'].iloc[-1] # Bandwidth — channel width normalized to the middle bandwidth = (upper - lower) / mid # Mean-reversion only when low volatility (squeeze) if bandwidth < 0.04: # channel is narrow — prepare for a breakout return 'WATCH' if price < lower: return 'BUY' # below lower band elif price > upper: return 'SELL' # above upper band # Return to the middle — exit position if abs(price - mid) / mid < 0.002: # price near the middle return 'CLOSE' return 'HOLD' Turnkey Development Process
- Market analysis — collect historical data for at least 6 months, assess volatility regimes and profit factor.
- Design — choose strategy, band parameters, filters (bandwidth, volume, %B). Write entry/exit logic specification.
- Implementation — code in Python (ccxt, pandas_ta), backtest on historical data, optimize parameters.
- Testing — run on a demo account or testnet for at least 7 days, verify metrics.
- Deployment — deploy on VPS, set up monitoring via Telegram bot, prepare documentation.
What's Included
- Full source code of the bot with comments
- Backtest report on 6+ months of history
- Demo account setup and testing period of 7–14 days
- Deployment and operation manual
- Support during the launch phase (2 weeks)
Timelines and Results
| Stage | Duration | Result |
|---|---|---|
| Analysis and design | 2–3 days | Strategy with parameters and specification |
| Implementation and backtest | 3–7 days | Ready code with test report |
| Testing on demo | 7–14 days | Bug fixes, final metrics |
| Deployment and launch | 1–2 days | Bot on server + manual |
Total timeline: from 7 to 28 days depending on complexity.
%B and Bandwidth
%B shows where price is within the channel (0 = lower band, 1 = upper band):
percent_b = (price - lower) / (upper - lower) # < 0: below lower (oversold) # > 1: above upper (overbought) # 0.5: at the middle line Bandwidth (channel width) — a volatility indicator. Bollinger Squeeze — a strong narrowing often precedes a sharp move. Direction signal comes from the first breakout after the squeeze. To filter noise, we also add a volume filter: if volume at the breakout is below the 20-period average, the signal is ignored.
Guarantees and Verification
We provide the full source code. You can audit it, run tests on a simulator. Experience — over 5 years in the market, dozens of deployed bots. Each bot comes with a backtest report and demo test results. According to John Bollinger's definition, bands are built based on a moving average and standard deviation.
Order a consultation on strategy tuning for your portfolio. Contact us for a free project assessment — we'll find the optimal bot logic for your needs.







