Every "Exchange A vs Exchange B fees" comparison does the same thing: it puts two maker/taker pairs side by side and declares the smaller maker number the winner. That comparison is only valid for a trader who never sends a market order.
What you actually pay is one blended number:
effective rate = total fees paid / total notional traded
Tier, token discount, fee share — everything else is a lever on that one number. And the blend has a property the fee tables never print: two schedules cross.
Measure it, don't estimate it
If you have your fills, compute it directly instead of trusting the sticker:
def effective_rate(fills, maker, taker):
"""fills: [(notional, is_maker), ...]"""
fees = sum(n * (maker if m else taker) for n, m in fills)
volume = sum(n for n, _ in fills)
return fees / volume
fills = [(50_000, True), (30_000, False), (20_000, False)]
print(f"{effective_rate(fills, 0.0002, 0.0005):.4%}") # 0.0350%
Where the schedules cross
Two representative standard-tier schedules:
| venue | maker | taker |
|---|---|---|
| A | 0.0200% | 0.0500% |
| B | 0.0160% | 0.0600% |
B has the better maker sticker — 20% lower. Set the two blends equal and solve for taker share t:
A = (0.000200, 0.000500)
B = (0.000160, 0.000600)
blend = lambda s, t: s[0] * (1 - t) + s[1] * t
(mA, kA), (mB, kB) = A, B
t_star = (mA - mB) / ((mA - mB) + (kB - kA))
print(f"{t_star:.2%}") # 28.57%
| taker share | A effective | B effective | cheaper |
|---|---|---|---|
| 0% | 0.0200% | 0.0160% | B |
| 10% | 0.0230% | 0.0204% | B |
| 28.6% | 0.0286% | 0.0286% | tie |
| 55% | 0.0365% | 0.0402% | A |
| 80% | 0.0440% | 0.0512% | A |
Below 28.6% taker, B's better maker rate wins. Above it, A wins and the gap widens fast. At 55% taker on $3,000,000/month: A costs $1,095, B costs $1,206 — $1,332 per year handed over for picking the venue with the "cheaper" fee table.
Why this bites
Your taker share is not what you think it is. Count the is_maker flag in your own fill log rather than your recollection. Stop-markets that trigger, liquidations, and every get-me-filled click are taker fills, and traders who describe themselves as "mostly limit orders" routinely land in the 40–60% band once those are counted. That is on the far side of most crossovers.
Where this breaks
Three honest limits:
-
t*assumes fixed schedules. Cross a volume tier on either venue and it moves — recompute monthly, not once. - Funding and slippage are excluded, and both are usually larger than the 0.4bp being argued over. A venue that wins on
t*can still lose on a thinner book. - If your taker share swings month to month, the cheaper venue swings with it. At that point the fee table isn't the deciding variable at all, and you should optimise order routing instead of venue choice.
The full derivation of the blend, plus the three levers (tier, token discount, fee share) that stack on top of it, is written up at effective fee rate explained. The schedules used above come from a small public repo I keep: crypto-exchange-fee-data.
I run an independent site on this topic and am not affiliated with any exchange. Figures are representative standard-tier examples, not guarantees — check your own tier. Not financial advice.
Top comments (0)