Elder Impulse System Backtest on BTC/USDT: -16.28% Net β a 'System' That Trades Like a Mook
Elder Impulse (MACD histogram + EMA13 slope) on real hourly BTC/USDT 2023: +51.08% naive, -16.28% after fees and funding across 556 trades. The famous 'system' is just a fast MACD variant that trades twice as often as plain MACD.
Elder Impulse System Backtest on BTC/USDT (2023, hourly, real fees)
Dr. Alexander Elder's Impulse System is famous as a two-bar confirmation: an EMA slope and a MACD histogram agreeing. On paper it filters out weak entries. On hourly crypto it does something worse: the EMA-slope condition flips on nearly every pullback, so the "filter" doubles the trade count compared to plain MACD β and the strategy gives back its entire gross edge to the exchange. Strategy Lab #64.
The setup
Long when the MACD histogram is positive AND the 13-period EMA is rising; exit when either flips. Same engine, same costs.
Results
| Strategy | Category | Total return | CAGR | MaxDD | Sharpe | Trades |
|---|---|---|---|---|---|---|
| elder_impulse | trend | -16.28% | -16.33% | -44.34% | -0.50 | 556 |

The fee bill
| Scenario | Cost/leg | Total return | MaxDD | Sharpe | Trades | |---|---:|---:|---:|---:|---:|---:| | naive (zero cost) | 0.00% | +51.08% | -22.07% | 1.62 | 556 | | taker fee 0.05%/leg | 0.05% | -13.37% | -43.27% | -0.38 | 556 | | + funding 0.01%/8h | 0.05% | -16.28% | -44.34% | -0.50 | 556 | | + slippage 10bp/leg | 0.15% | -72.50% | -75.23% | -4.45 | 556 | | + slippage 25bp/leg | 0.30% | -94.83% | -95.05% | -10.00 | 556 |
The gross result is respectable (+51.08%) β the impulse confirmation does catch trends. Then it trades itself to death: 556 round trips. An EMA(13) slope is "up" whenever the last bar is above the smoothed trend, so the exit condition triggers on any two-bar pullback, and re-enters on the very next push. Plain MACD (post 15) traded 333 times and made +22.21%; the Impulse System trades 67% more often and loses 38 points.
The MACD-derived family, sorted by trade count
| Strategy | Post | Trades | Naive | Fees+funding | |---|---:|---:|---:|---:|---:| | Elder Impulse (this) | β | 556 | +51.08% | -16.28% | | PPO | 45 | 333 | +79.20% | +22.32% | | MACD | 15 | 333 | +79.08% | +22.21% | | KST | 55 | 235 | +109.28% | +57.40% | | TRIX | 32 | 201 | +111.94% | +64.74% |
Every single MACD-family result in the lab ranks by trade count: the fewer times the rule fires, the more it keeps. KST and TRIX smooth the signal so hard they trade 200-235 times and keep ~60%; the Impulse System's extra condition (EMA slope) doesn't smooth anything β it adds a hair trigger. The Impulse System is the family's proof that "more confirmation" can mean more, not better, trades. The confirmation it adds is the wrong one for hourly data.
What this does NOT prove
- Elder designed the system as a discretionary filter (buy only when both agree, and use a separate exit), not a mechanical go-flat-on-flip rule. A version that exits on MACD cross instead of EMA-slope flip would trade less; untested here.
- On daily bars the EMA(13) slope flips far less often, and β following the lab's consistent frequency pattern β the Impulse System would likely survive costs on daily. That is speculation, not a result.
- One pair, one year, one regime.
Code
from backtest_base import fetch, backtest_signal, metrics
from strategy import sig_elder_impulse
df = fetch("BTCUSDT", "binance", "2023-01-01", "2023-12-31", "1h")
signal = sig_elder_impulse(df, fast=12, slow=26, signal=9, ema_period=13)
res = backtest_signal(df, signal, cost_per_leg=0.0005, funding_per_bar=0.0000125)
print(metrics(res, 8760))Reproduce it
cd blog-drafts/scripts
python gen_post_assets.py --ids 64Data: Binance public API, hourly OHLCV, 8,735 bars. Tables above reproduce exactly from this command.
This is a backtest on historical data, not investment advice. Past performance does not predict future results.