After my crypto trading bot had been live for a few days, I wanted real
trading bot backtesting data instead of a guess: were the parameters
we’d picked — an EMA crossover threshold here, an ADX cutoff there —
actually the best choice, or just the first reasonable-sounding numbers
we tried?
So instead of guessing, we tested. Every combination of six parameters, run against three years of ETH price history, ranked by actual return.
324 backtests later, the answer was clear — and it wasn’t what I expected.
The setup
The bot’s core strategy hadn’t changed: buy when a fast EMA crosses above a slow EMA, confirmed by trend strength (ADX) and momentum (RSI), sell on a trailing stop-loss. What I wanted to know was whether the specific thresholds we’d chosen were actually good, or just plausible.
I tested every combination of:
- EMA periods: three combinations (8/21, 10/50, 12/26)
- RSI ceiling: 65, 70, 75
- ADX minimum: 20, 25, 30
- Cooldown after a sell: 2, 4, or 8 hours
- Trailing stop-loss: 3% or 5%
- Volume confirmation: on or off
That’s 3 × 3 × 3 × 3 × 2 × 2 = 324 combinations, each backtested independently against the same three years of hourly ETH-EUR data.
The result
The best combination returned +68.6% over the test period. Our existing settings, which I’d assumed were reasonable, landed at +45.2% — ranked #16 out of 324.
That’s not a small gap. The difference between “reasonable guess” and “systematically tested” was 23 percentage points on the same capital.

What actually moved the needle
Here’s the part that surprised me: most of the six parameters barely mattered. The top 20 results were dominated by exactly one variable — the ADX threshold.
Lowering ADX from 25 to 20 was the single biggest lever in the entire test. It let the bot catch more moderately-trending moves instead of waiting only for the strongest trends, and the extra trade volume more than made up for slightly lower average quality per trade.
Volume confirmation, on the other hand, actively hurt performance — every top result had it turned off. The theory made sense on paper (only buy when a move has real conviction behind it), but in practice it filtered out too many genuinely good signals on ETH’s price action.
The EMA periods, RSI ceiling, and cooldown length barely moved the result at all once ADX and the trailing stop were set correctly. I’d assumed all six parameters mattered roughly equally going in. They didn’t.
Why this matters beyond the specific numbers
The bigger lesson wasn’t “use ADX 20 instead of 25” — that number is specific to this strategy, this coin, and this time period, and it may not hold in the future. The lesson was that intuition about which parameters matter is often wrong, and the only way to find out is to actually test the combinations rather than adjust one variable at a time based on a hunch.
If I’d only tuned ADX (the variable that turned out to matter most) and left the rest alone, I’d have gotten close to the optimal result. If I’d tuned volume confirmation first, thinking it was an obvious improvement, I’d have made things worse while feeling like I was being rigorous.
Running the full grid — even though most of it turned out to be noise — was the only way to know which variable actually carried the result.
What changed in the live bot
Two changes went into production after this test:
- ADX minimum: 25 → 20
- Everything else stayed as it was, since the test confirmed the existing values were already near-optimal
Small change, meaningful backtested impact. The bot has been running with the updated threshold since, and I’ll be tracking whether the live results hold up to what the backtest predicted — that’s really the only test that matters in the end.
This is the second post on AI Project Log. The first post covers the full build story of this trading system, including the bugs that almost broke it.