A month ago I deployed an algorithmic trading bot on Bybit. No fancy ML, no GPT nonsense — just classical technical analysis running on Freqtrade. Here's what happened.
The Setup
The stack is deliberately boring: Freqtrade running on a $5/month VPS in Amsterdam, connected to Bybit via API. The strategy trades 15 pairs on the 1-hour timeframe using a combination of six signals:
- EMA Crossover (12/26 with 200 EMA trend filter)
- MACD Reversal (histogram divergence + RSI confirmation)
- Bollinger Band Bounce (lower band touch with oversold RSI)
- ADX Trend Strength (only trade when ADX > 18)
- Volume Confirmation (relative volume > 0.7x average)
- Time-based Exit (close after 24h if profit < 1%)
The config looks something like this:
{
"trading_mode": "futures",
"margin_mode": "isolated",
"stake_amount": 50,
"max_open_trades": 8,
"timeframe": "1h",
"dry_run": true
}
Everything sends notifications to Telegram — trade opens, closes, daily summaries, health checks. If the bot goes down at 3 AM, I know about it.
What Worked
Filtering out bad trades was more valuable than finding good ones. This was the single biggest insight. My first version of the strategy had loose filters and generated tons of signals. The problem? Most of them were garbage — entries during ranging markets, trades against the macro trend, signals on low-volume candles that meant nothing.
Adding three simple filters cut my trade count by 60% and improved win rate from 32% to 62%:
- ADX threshold — if ADX is below 18, there's no trend. Don't trade.
- EMA 200 trend filter — only long above the 200 EMA, only short below it.
- Volume filter — ignore signals when volume is below 0.7x the 20-period average.
These aren't revolutionary ideas. But the discipline of a bot applying them every single time is what makes the difference. I would absolutely have FOMO'd into at least half of those filtered-out trades manually.
Time-based exits saved me from slow bleeders. If a trade hasn't moved more than 1% in 24 hours, the bot closes it. This sounds aggressive, but on the 1h timeframe with crypto volatility, if price hasn't moved in your direction within 24 candles, your thesis is probably wrong.
What Didn't Work
Win rate started at 32%. The first version of the strategy generated 37 trades over 23 days with a 32% win rate. Profitable trades were bigger than losing ones (positive expectancy), but psychologically watching 2 out of 3 trades lose is brutal — even in paper trading.
Pair selection matters more than you think. I had MATIC/USDT and FTM/USDT in my whitelist. One day, both got removed from Bybit's perpetual futures. The bot was trying to trade pairs that no longer existed, silently failing every cycle. Lesson: always monitor your exchange's pair listings. I swapped them for POL/USDT (Polygon's rebrand) and SUI/USDT.
Bollinger Band bounces were too aggressive. Without an RSI filter, the bot was catching falling knives — price touching the lower band in a strong downtrend isn't a buy signal, it's a warning. Adding RSI < 45 as a requirement for BB bounce entries cut false signals by half.
The Numbers
After tuning (v2 of the strategy):
| Metric | Value |
|---|---|
| Win Rate | 62% |
| Profit Factor | 2.1 |
| Max Drawdown | 1.47% |
| Sharpe Ratio | 1.86 |
| Avg Trade Duration | ~14 hours |
| Pairs | 15 (BTC, ETH, SOL, BNB, DOGE, XRP, ADA, AVAX, LINK, DOT, POL, NEAR, ATOM, SUI, OP) |
These are backtest numbers over March 2026. The dry-run on live data is still building — I'll publish those numbers once I have a statistically significant sample (target: 100+ trades).
Key Lessons
1. Backtesting is necessary but not sufficient
Walk-forward validation on historical data is great for parameter tuning. But the real test is dry-run mode on live data. The gap between backtest fills and real orderbook behavior is significant — especially on smaller altcoins where liquidity can evaporate in seconds.
I ran dry-run for 3 weeks before trusting any results. It caught several assumptions that were wrong in my backtest: slippage on market orders was higher than expected, and some pairs had wider spreads during Asian session hours.
2. Fewer signals > more signals
My v1 strategy had 6 entry signals with loose filters. V2 has the same 6 signals with tight filters. The difference? 60% fewer trades but nearly double the win rate. Every filter I added that reduced trade count improved overall performance.
3. Infrastructure is 50% of the game
The actual strategy code is maybe 200 lines of Python. The infrastructure around it is 10x that:
- Health monitoring with auto-restart
- Telegram notifications for every event
- Google Sheets export every 6 hours for tracking
- Cron jobs for daily/weekly reports
- Fail2ban and SSH hardening on the VPS
A strategy that works but goes down every other day isn't a strategy.
4. The bot doesn't care about your feelings
This is the real superpower. The bot doesn't revenge-trade after a loss. It doesn't double down because it "feels" like the market is about to reverse. It doesn't skip a signal because it's scared after three losses in a row.
Every entry and exit follows the exact same rules, every time. The emotional consistency alone is worth the effort of building it.
What's Next
I'm currently in dry-run mode building a track record. The plan:
- Go live with real capital on Bybit (starting small — $500)
- Apply for a prop firm evaluation — specifically HyroTrader, which offers $50K accounts through Bybit API. My drawdown is well within their limits.
- Master Trader program on Bybit — if the live results hold up, I'll apply for copy trading
The full performance dashboard and all trade history is public at trendrider.net. I also share all signals (delayed 4 hours) for free on Telegram: @TrendRiderFree.
If you're building a trading bot, my biggest advice: spend 80% of your time on filtering and risk management, 20% on entry signals. The entries are the easy part. Staying alive long enough for the edge to play out — that's the actual challenge.
What's your experience with algorithmic crypto trading? Drop a comment — especially if you've gone through the backtest-to-live transition. I'd love to compare notes.
Top comments (0)