Crypto trading bot fees explained: maker, taker, funding & spread
Every order your bot sends pays a toll. Some tolls are printed on the receipt — the exchange's trading fee — and some are hidden in the price you actually get filled at. Added up across thousands of trades, these frictions are the difference between a strategy that compounds and one that bleeds. This guide unpacks each cost, shows the math of a round trip, and explains how to bake fees into a backtest so the numbers you trust are the numbers you'll live with.
Maker vs taker fees — the order type that costs you
The first fee every bot pays is the exchange's trading fee, and it usually comes in two flavours. A maker order adds liquidity to the order book: you post a limit order that sits there, waiting, until someone else trades against it. Because you've helped fill the book, exchanges reward you with the cheaper rate — sometimes even a small rebate. A taker order removes liquidity: you send a market order (or an aggressive limit) that immediately matches a resting order. You took liquidity off the book, so you typically pay the higher rate.
The gap between the two is small per trade but enormous in aggregate. This is why a high-frequency bot should be built to prefer maker orders wherever it can — posting passive limits and waiting for a fill rather than crossing the spread with a market order. The trade-off is that a maker order isn't guaranteed to fill; price can run away from your resting bid. A bot that needs certainty of execution pays the taker premium for it, and that premium compounds fast at scale.
Fee tiers, volume discounts and exchange tokens
Most exchanges run a tiered fee schedule. The more 30-day volume you trade, the lower your maker and taker rates fall. Many venues also discount your fees if you hold or pay with the exchange's native token. For a small retail bot none of this moves the needle much, but for an active strategy the effective rate you pay can differ meaningfully from the headline number a new account sees. Always check your actual tier and any token discount before assuming a fee figure — and treat published rates as the starting point, not a fixed constant, because exchanges change them.
The bid-ask spread — a cost on every round trip
Even with zero trading fees, you'd still pay to trade, because of the bid-ask spread. The best price to buy (the ask) is always a little above the best price to sell (the bid). If you buy at the ask and immediately sell at the bid, you lose the spread without the price moving at all. For a bot that opens and closes positions constantly, this gap is paid on every round trip and is often larger than the exchange fee itself — especially on thinly traded pairs. Liquid majors like BTC/USDT have tight spreads; small-cap altcoins can have spreads wide enough to swallow a whole strategy's edge.
Slippage — when the book is too thin for your order
Spread assumes you fill at the top of the book. Slippage is what happens when your order is bigger than the liquidity sitting at the best price, so it eats into worse and worse levels of the order book. You wanted to buy at 100; you fill part at 100, part at 100.2, part at 100.5, and your average price drifts against you. Slippage is worst on market orders, in thin books, during volatile moves, and when your size is large relative to available depth. It's invisible in a naive backtest because backtests assume you always fill at the last printed price — which is exactly why backtested results flatter reality.
Funding rates — the slow drain on leveraged perps
If your bot trades perpetual futures, there's a cost that has nothing to do with opening or closing a trade: the funding rate. Perpetuals have no expiry, so to keep their price tethered to the underlying spot price, the exchange has longs and shorts pay each other a small periodic payment — typically every few hours. When funding is positive, longs pay shorts; when negative, shorts pay longs. Hold a leveraged position on the paying side and these payments quietly drain it over time, completely independent of whether your trade is winning or losing on price. A position that looks flat on the chart can still be slowly bleeding through funding. For any strategy that holds perps overnight, funding is a real line item — we cover the mechanics further in our futures trading bot guide.
Withdrawal and network fees
Finally, the costs at the edges: moving crypto between wallets or off an exchange incurs withdrawal and network (gas) fees. These don't hit every trade, but a strategy that constantly shuffles funds between venues — for arbitrage, say — can see network fees become a meaningful drag, particularly on congested chains. Factor them into any approach that moves coins around rather than just trading within one account.
Why "profitable gross" can mean "losing net"
Here's the uncomfortable truth: fee drag scales with trade frequency. A long-term strategy that trades a few times a month barely notices fees. A scalper trading dozens of times a day pays the round-trip cost dozens of times a day, and that cost has to be cleared before a single cent of profit. The total cost of one round trip is roughly:
round-trip cost ≈ entry fee + exit fee + spread + slippage
Work a quick example in basis points (1 bp = 0.01%). Suppose a scalper pays a 0.1% (10 bp) taker fee on entry and another 10 bp on exit, plus a half-spread of 2 bp each way and a couple of bp of slippage per side. That's roughly 10 + 10 + 4 + 4 ≈ 28 bp — about 0.28% — burned on every single round trip before the strategy has earned anything. A bot doing many such trades a day needs an average gross edge comfortably above 0.28% per trade just to break even, and that's before a losing streak. Switch those takers to maker fills and the picture improves dramatically; that single change is often the line between a viable high-frequency bot and a guaranteed loser.
More backtested "winners" die from underestimated fees, spread and slippage than from a broken signal. The faster a strategy trades, the more its survival depends on minimising cost per round trip — not on chasing a bigger edge.
How to model fees in a backtest
The fix is simple in principle: subtract a realistic round-trip cost, in basis points, from every trade in your backtest. Don't model fees as an afterthought — bake them into the trade-level PnL so your equity curve reflects what you'd actually keep. Be conservative: it's far better for live trading to slightly outperform a pessimistic backtest than to underperform an optimistic one.
python · fees.py# Apply a round-trip fee (in basis points) to a single trade
def net_return(entry, exit_, side='long', fee_bps=28):
gross = (exit_ - entry) / entry # raw price move
if side == 'short':
gross = -gross
cost = fee_bps / 10_000 # 28 bps -> 0.0028
return gross - cost # what you actually keep
# A scalper's tiny edge can vanish once fees are charged
print(net_return(100, 100.3)) # +0.30% gross -> +0.02% net
print(net_return(100, 100.2)) # +0.20% gross -> -0.08% net (a loss!)
Use the same fee_bps value for every trade and your backtest finally measures the strategy you'll actually run. The honest follow-up is to confirm it survives live: see backtesting vs forward testing, where the gap between paper and live is almost always fees and slippage you under-counted. And size every trade so a costly streak can't sink you — our trading bot risk management guide and the position-size calculator handle that side.
Fee types at a glance
| Fee type | Who pays it | Typical scale | How to reduce it |
|---|---|---|---|
| Taker fee | Whoever removes liquidity (market orders) | Often around 0.05–0.10% per side | Use limit orders that rest as maker fills |
| Maker fee | Whoever adds liquidity (resting limits) | Usually lower than taker; sometimes a rebate | Post passive limits; climb the volume tier |
| Bid-ask spread | Every round trip, regardless of fee | Tiny on majors, wide on illiquid pairs | Trade liquid pairs; avoid thin books |
| Slippage | Large or urgent market orders | Grows with size vs. order-book depth | Smaller clips, limit orders, deep markets |
| Funding rate | Perp holders on the paying side | Small but periodic; compounds over time | Avoid holding perps through adverse funding |
| Withdrawal / network | Whoever moves coins off-venue | Varies by chain and congestion | Batch transfers; trade within one account |
Frequently asked questions
What is the difference between a maker and a taker fee?
A maker order adds liquidity to the order book — a limit order that rests until someone trades against it — and usually earns the cheaper rate, sometimes even a rebate. A taker order removes liquidity by matching a resting order, typically a market order, and usually pays the higher rate. A high-frequency bot saves a lot by preferring maker orders wherever execution certainty allows.
Why does a profitable-looking strategy lose money after fees?
Because fee drag scales with how often you trade. A strategy with a tiny gross edge per trade can be wiped out once you subtract the entry fee, exit fee, spread and slippage on every round trip. The more trades per day, the larger the gross edge you need just to break even — which is why fees quietly kill so many high-frequency bots.
What is a funding rate and why does it cost my bot money?
On perpetual futures, a funding rate is a small periodic payment exchanged between longs and shorts to keep the perpetual's price near spot. If you hold a leveraged position on the paying side of funding, those payments quietly drain the position over time — a cost that never appears in your entry and exit prices.
How do I include fees in a backtest?
Subtract a realistic round-trip cost from every trade, expressed in basis points: entry fee plus exit fee plus a half-spread on each side plus an estimate of slippage. Bake it into trade-level PnL rather than adding it later. A backtest that ignores fees and spread will always look far better than the strategy performs live.