# MACD and Bollinger Bands on crypto: a backtest

> Textbook MACD and Bollinger Band rules on 10 coins, Binance spot 2020–2026: MACD beat buy and hold in 3 of 20 runs, Bollinger in 1 of 20.

Research · Janorium · Published 2026-10-20  
Web page: https://janorium.com/articles/macd-bollinger-bands-crypto-backtest

Rarely better than holding. On 10 large coins in 2020–2026 the MACD(12,26,9) signal-line cross made money in 14 of 20 runs but beat buy and hold in 3; Bollinger(20,2) mean reversion made money in 4 of 20 and beat holding in 1. Against random entries with the same holding time MACD came out ahead in 16 of 20 runs, Bollinger in 5.

Two of the most quoted chart signals, tested exactly as the textbooks write them, on the same ten coins, two timeframes
and costs as [the RSI 30/70 test](https://janorium.com/articles/rsi-30-70-crypto-backtest). The short answer: MACD on daily candles made
money on 9 of 10 coins — but in a period when holding the coin did better on 7 of them — and lost most of what it
caught to fees on 4-hour candles. Bollinger mean reversion won about two trades of three and still lost money in 16 of
20 runs. Against random entry dates, the two rules split: MACD's timing looked better than chance, Bollinger's worse.

## Setup

- **MACD rule:** MACD(12, 26, 9) on the run's timeframe. Buy when the MACD line crosses above the signal line, sell when
  it crosses back below. Long only, no stop.
- **Bollinger rule:** Bollinger Bands (20, 2) on closes. Buy when the close crosses back above the lower band (it was at
  or below the band on the previous candle and is above it now). Sell when the close reaches the middle band — the
  20-period average — or goes above it. Long only, no stop, no time limit.
- **Coins:** BTC, ETH, BNB, XRP, ADA, DOGE, LTC, LINK, BCH and TRX — ten large coins with Binance spot history on the
  platform from the start of 2020.
- **Market and period:** Binance spot, 4h and 1d candles, 2020-01-01 → 2026-10-01. 20 coin × timeframe runs per rule,
  40 in all.
- **Costs and fills:** 95% of equity per trade, 0.1% fee and 0.05% slippage on each side, orders filled at the next
  candle's open after the signal, 10,000 USDT per run.
- **Two baselines:** buy and hold of the same coin over the same run, as the platform reports it; and a random-entry
  baseline computed from candles — 2,000 simulated runs per cell with the same number of trades and the same average
  holding time as the rule, entered at random dates, with the same size and costs.

Nothing was tuned: one set of textbook parameters per rule. What the numbers on the cards mean is in
[backtest metrics explained](https://janorium.com/guides/backtest-metrics-explained).

## The scorecard

|                                 |  MACD 1d | MACD 4h | Bollinger 1d | Bollinger 4h |
| ------------------------------- | -------: | ------: | -----------: | -----------: |
| Runs in profit                  |   9 / 10 |  5 / 10 |       4 / 10 |       0 / 10 |
| Runs ahead of buy and hold      |   3 / 10 |  0 / 10 |       1 / 10 |       0 / 10 |
| Runs ahead of the random median |   8 / 10 |  8 / 10 |       3 / 10 |       2 / 10 |
| Median return                   | +468.32% |  -0.56% |       -2.19% |      -62.71% |
| Median win rate                 |    36.3% |   34.1% |        70.1% |        65.0% |
| Median time in the market       |    51.9% |   51.1% |        21.6% |        22.9% |

## MACD: a trend follower that pays for every wiggle

MACD is a trend rule in disguise: it is long roughly half the time, wins only about one trade in three, and lives off
the few trades that ride a long move. On daily candles in 2020–2026 there were enough of those for 9 of 10 coins to end
in profit — the median daily run made +468.32%.

**Backtest: [MACD 12/26/9 signal-line cross — article study](https://janorium.com/backtests/710)**  
BTCUSDT · 1d · Spot · 2020-01-01 → 2026-10-01

| Return | Max drawdown | Sharpe | Win rate | Trades |
| --- | --- | --- | --- | --- |
| +597.61% | 52.29% | 0.94 | 36.7% | 90 |

*MACD, BTC daily: +597.61% against +1,078.75% for holding*

That is still less than holding on 7 of 10 coins. MACD got ahead only on XRP (+1,597.10% against +673.84%), ADA and BCH.

On 4-hour candles the same rule fires about six times as often — 560 to 595 trades per coin — and every round trip pays
0.3% in fees and slippage. Adding up the fees and slippage each run reports, those costs came to more than the
10,000 USDT starting capital on 8 of 10 coins, and only 5 of 10 runs ended in profit.

**Backtest: [MACD 12/26/9 signal-line cross — article study](https://janorium.com/backtests/711)**  
BTCUSDT · 4h · Spot · 2020-01-01 → 2026-10-01

| Return | Max drawdown | Sharpe | Win rate | Trades |
| --- | --- | --- | --- | --- |
| -26.67% | 77.99% | 0.08 | 33.9% | 563 |

*MACD, BTC on 4-hour candles: -26.67% against +1,059.22% for holding*

The best and the worst MACD cells:

**Backtest: [MACD 12/26/9 signal-line cross — article study](https://janorium.com/backtests/714)**  
DOGEUSDT · 1d · Spot · 2020-01-01 → 2026-10-01

| Return | Max drawdown | Sharpe | Win rate | Trades |
| --- | --- | --- | --- | --- |
| +2,766.96% | 80.00% | 0.94 | 39.2% | 79 |

*The best MACD cell, DOGE daily: +2,766.96% against +3,806.69% for holding*

**Backtest: [MACD 12/26/9 signal-line cross — article study](https://janorium.com/backtests/715)**  
LTCUSDT · 4h · Spot · 2020-01-01 → 2026-10-01

| Return | Max drawdown | Sharpe | Win rate | Trades |
| --- | --- | --- | --- | --- |
| -86.51% | 95.49% | -0.24 | 35.8% | 595 |

*The worst MACD cell, LTC on 4-hour candles: -86.51% against +53.22% for holding*

## Bollinger Bands: right two times out of three, and still losing

The Bollinger rule is the opposite shape: it buys a close back above the lower band and sells at the average, so it wins
often and small. 1,971 of its 3,029 trades across the 20 runs closed in profit, and every run won more than half of its
trades — yet in all 20 the average losing trade was larger than the average winning one. Without a stop, a band bounce
that fails keeps falling: in 16 of 20 runs the worst single trade lost 30% or more.

**Backtest: [Bollinger 20/2 lower-band reversion to middle — article study](https://janorium.com/backtests/716)**  
BTCUSDT · 1d · Spot · 2020-01-01 → 2026-10-01

| Return | Max drawdown | Sharpe | Win rate | Trades |
| --- | --- | --- | --- | --- |
| +44.32% | 45.27% | 0.34 | 64.9% | 37 |

*Bollinger, BTC daily: +44.32% against +1,078.75% for holding*

**Backtest: [Bollinger 20/2 lower-band reversion to middle — article study](https://janorium.com/backtests/717)**  
BTCUSDT · 4h · Spot · 2020-01-01 → 2026-10-01

| Return | Max drawdown | Sharpe | Win rate | Trades |
| --- | --- | --- | --- | --- |
| -65.81% | 72.62% | -0.39 | 62.8% | 253 |

*Bollinger, BTC on 4-hour candles: -65.81% against +1,059.22% for holding*

On 4-hour candles not one of ten coins ended in profit. On daily candles four did; the only one that beat holding was
LTC, +68.77% against +19.11%.

**Backtest: [Bollinger 20/2 lower-band reversion to middle — article study](https://janorium.com/backtests/720)**  
BNBUSDT · 1d · Spot · 2020-01-01 → 2026-10-01

| Return | Max drawdown | Sharpe | Win rate | Trades |
| --- | --- | --- | --- | --- |
| +169.76% | 43.01% | 0.64 | 75.6% | 41 |

*The best Bollinger cell, BNB daily: +169.76% against +5,525.66% for holding*

**Backtest: [Bollinger 20/2 lower-band reversion to middle — article study](https://janorium.com/backtests/721)**  
BCHUSDT · 4h · Spot · 2020-01-01 → 2026-10-01

| Return | Max drawdown | Sharpe | Win rate | Trades |
| --- | --- | --- | --- | --- |
| -83.83% | 90.10% | -0.33 | 64.6% | 285 |

*The worst Bollinger cell, BCH on 4-hour candles: -83.83% against +37.67% for holding*

## Was it the signal or just the market?

A long-only rule can make money just by being in a coin that went up. The random-entry baseline takes that away: for
each run, 2,000 simulated runs with the same number of trades and the same average holding time, entered at random
dates and charged the same costs. If a signal added nothing, about half of the runs would end above their random median
and about two in twenty would land in each 10% tail.

**MACD did better than that.** It ended above the random median in 16 of 20 runs — 8 of 10 on each timeframe — and in
the top 10% of its random runs in 4 (XRP daily; ETH, ADA and DOGE on 4-hour candles), never in the bottom 10%. The
median MACD run beat 81.1% of its random runs. Being in the market during the long moves and out of the market in the
chop is what a trend rule is for, and in 2020–2026 crypto trended. On 4-hour candles this mostly meant losing less:
the random runs paid the same costs, and the median of the ten coins' random medians was -40.85%.

This is a hint, not an edge. It is one rule on one market history, the 20 runs are far from independent — the coins
move together, and each coin appears twice — and no holdout was kept; a claim that MACD has an edge would need a
proper out-of-sample test. And beating random entry is a lower bar than beating holding, which MACD cleared in only 3 of
20 runs.

**Bollinger did worse than random.** It ended above the random median in 5 of 20 runs, in the top 10% in none and in
the bottom 10% in 3 (ADA daily, BTC and ETH on 4-hour candles); the median run beat 28.1% of its random runs. Buying
bounces off the lower band was, if anything, worse than buying at random dates and holding for the same time.

One simplification applies to both rules: every random trade is held for exactly the rule's average time, while the
rules' own trades vary in length.

### MACD, all 20 runs

| Coin | TF  |                         Rule | Buy & hold | Random entry, median | Random runs beaten | Trades | Max drawdown |
| ---- | --- | ---------------------------: | ---------: | -------------------: | -----------------: | -----: | -----------: |
| BTC  | 1d  |   [+597.61%](https://janorium.com/backtests/710) | +1,078.75% |             +176.17% |              89.9% |     90 |       52.29% |
| ETH  | 1d  |   [+446.72%](https://janorium.com/backtests/712) | +1,969.60% |             +280.69% |              63.3% |     93 |       57.72% |
| BNB  | 1d  |                   +2,052.11% | +5,525.66% |             +545.74% |              88.9% |     83 |       44.43% |
| XRP  | 1d  |                   +1,597.10% |   +673.84% |             +127.26% |              94.7% |     78 |       72.41% |
| ADA  | 1d  |                     +489.93% |   +332.58% |              +91.33% |              83.6% |     84 |       87.95% |
| DOGE | 1d  | [+2,766.96%](https://janorium.com/backtests/714) | +3,806.69% |             +549.32% |              82.9% |     79 |       80.00% |
| LTC  | 1d  |                      -47.29% |     -2.20% |              -17.70% |              32.7% |     86 |       84.58% |
| LINK | 1d  |                     +196.19% |   +419.16% |              +95.02% |              62.7% |     94 |       81.80% |
| BCH  | 1d  |                      +93.54% |    -19.51% |              -29.12% |              81.1% |    100 |       77.06% |
| TRX  | 1d  |                      +61.71% | +2,432.53% |             +296.75% |              15.3% |    102 |       77.55% |
| BTC  | 4h  |    [-26.67%](https://janorium.com/backtests/711) | +1,059.22% |              -37.40% |              58.7% |    563 |       77.99% |
| ETH  | 4h  |   [+217.89%](https://janorium.com/backtests/713) | +1,970.71% |              -17.72% |              91.5% |    566 |       80.57% |
| BNB  | 4h  |                     +214.75% | +5,469.44% |              +32.06% |              83.0% |    594 |       85.19% |
| XRP  | 4h  |                      -16.91% |   +673.83% |              -44.31% |              64.6% |    588 |       87.68% |
| ADA  | 4h  |                     +223.83% |   +601.20% |              -47.33% |              93.4% |    560 |       86.90% |
| DOGE | 4h  |                   +1,354.77% | +4,436.97% |              +27.98% |              93.2% |    578 |       87.98% |
| LTC  | 4h  |    [-86.51%](https://janorium.com/backtests/715) |    +53.22% |              -76.05% |              29.5% |    595 |       95.49% |
| LINK | 4h  |                      +15.79% |   +672.78% |              -44.65% |              71.0% |    577 |       90.86% |
| BCH  | 4h  |                      -74.41% |    +31.58% |              -76.28% |              52.1% |    567 |       93.11% |
| TRX  | 4h  |                      -38.55% | +2,447.03% |               -6.26% |              32.2% |    591 |       90.18% |

### Bollinger Bands, all 20 runs

| Coin | TF  |                       Rule | Buy & hold | Random entry, median | Random runs beaten | Trades | Max drawdown |
| ---- | --- | -------------------------: | ---------: | -------------------: | -----------------: | -----: | -----------: |
| BTC  | 1d  |  [+44.32%](https://janorium.com/backtests/716) | +1,078.75% |              +43.85% |              50.1% |     37 |       45.27% |
| ETH  | 1d  |   [-3.95%](https://janorium.com/backtests/718) | +1,969.60% |              +67.76% |              24.9% |     40 |       56.28% |
| BNB  | 1d  | [+169.76%](https://janorium.com/backtests/720) | +5,525.66% |              +81.64% |              69.6% |     41 |       43.01% |
| XRP  | 1d  |                    +30.19% |   +673.84% |              +36.59% |              47.9% |     48 |       74.30% |
| ADA  | 1d  |                    -76.27% |   +462.81% |              +49.87% |               4.4% |     37 |       83.29% |
| DOGE | 1d  |                    -57.82% | +3,871.80% |             +119.89% |              12.0% |     38 |       72.19% |
| LTC  | 1d  |                    +68.77% |    +19.11% |               -8.73% |              78.1% |     40 |       55.13% |
| LINK | 1d  |                    -15.40% |   +435.19% |              +26.51% |              35.7% |     36 |       58.94% |
| BCH  | 1d  |                    -50.10% |     -9.93% |              -18.10% |              31.0% |     41 |       72.97% |
| TRX  | 1d  |                     -0.43% | +2,432.53% |              +40.66% |              28.1% |     30 |       51.67% |
| BTC  | 4h  |  [-65.81%](https://janorium.com/backtests/717) | +1,059.22% |              -18.28% |               7.1% |    253 |       72.62% |
| ETH  | 4h  |  [-73.41%](https://janorium.com/backtests/719) | +1,970.71% |               -6.73% |               7.4% |    258 |       79.22% |
| BNB  | 4h  |                    -35.24% | +5,469.44% |              +12.09% |              25.8% |    256 |       62.58% |
| XRP  | 4h  |                    -32.15% |   +673.83% |              -32.19% |              50.1% |    284 |       60.26% |
| ADA  | 4h  |                    -59.60% |   +637.88% |              -19.75% |              26.0% |    264 |       84.63% |
| DOGE | 4h  |                    -72.16% | +4,580.87% |              +11.92% |              15.1% |    263 |       86.49% |
| LTC  | 4h  |                    -26.86% |    +58.96% |              -48.04% |              66.5% |    268 |       68.74% |
| LINK | 4h  |                    -74.73% |   +705.92% |              -24.97% |              14.8% |    260 |       83.34% |
| BCH  | 4h  |  [-83.83%](https://janorium.com/backtests/721) |    +37.67% |              -55.41% |              14.1% |    285 |       90.10% |
| TRX  | 4h  |                    -31.33% | +2,447.03% |              -11.18% |              35.0% |    250 |       77.09% |

Each return links to its run where it was saved — BTC and ETH on both timeframes plus the best and worst cell of each
rule; the others are re-runs of the same two strategies that were not stored, and the saved runs reproduce them to the
cent. "Random runs beaten" is the share of the 2,000 random-entry runs that ended below the rule.

> **What this test does not show**
>
> - **Two rules, as written, no variants.** MACD(12,26,9) and Bollinger(20,2) with the textbook entries and exits; no
>   other parameters, filters, stops or exits were tried. A search over them would find a combination that looks good in
>   hindsight — that is overfitting, not a signal.
> - **The Bollinger exit is one choice of two.** This test sells at the middle band; selling at the upper band holds
>   longer and is a different rule.
> - **Spot, 2020–2026, ten coins.** One market history with two large bull runs, which flatters any rule that stays long
>   half the time. A long-only rule on spot cannot profit from the falls.
> - **Warm-up on coins whose platform history starts on 2020-01-01** (ADA, DOGE, LTC, LINK, BCH): the first 33 candles
>   for MACD and 19 for Bollinger are spent on the indicators, and buy and hold is counted from the same later start — so
>   holding ADA shows different returns in different runs.

## Conclusion

- MACD on daily candles made money on 9 of 10 large coins in 2020–2026, but beat simply holding on only 3 — and on
  4-hour candles fees and slippage ate most of what it caught.
- Bollinger mean reversion won about two trades of three and lost money in 16 of 20 runs: without a stop, the losers
  were bigger than the winners every time.
- Against random entries with the same holding time MACD came out ahead in 16 of 20 runs and Bollinger in 5 — a hint
  that trend timing mattered in 2020–2026 and band bounces did not, from one untuned test without a holdout.

The same test for RSI: [RSI 30/70 on crypto](https://janorium.com/articles/rsi-30-70-crypto-backtest). A trend rule on a wider set of coins:
[the golden cross on the top-20](https://janorium.com/articles/golden-cross-top-20-crypto-2020-2025).
