Spot-to-spot arbitrage captures price gaps for the same coin across exchanges. Learn how fees, order-book depth, and pre-funded balances shape the trade.
Part 1 of a four-part series on spot-to-spot arbitrage.
Excerpt: Spot-to-spot arbitrage captures price gaps for the same coin across exchanges. Learn how fees, order-book depth, and pre-funded balances shape the trade.
Tags: arbitrage, spot, spreads, liquidity, exchanges
Spot-to-spot arbitrage starts with a price gap. The same coin trades on two exchanges, but one order book is cheaper than the other. You buy on the cheaper venue and sell the same amount on the more expensive one.
That part is simple. Getting both orders filled at the expected prices is where the work begins.
Suppose ETH trades at $3,450 on Binance and $3,468 on Bybit.
The difference is $18 per ETH, or roughly 0.52%. If you buy 1 ETH on the cheaper exchange and sell 1 ETH on the other, the gross spread is $18.
Now account for fees. Using an assumed fee of 0.1% on each order:
The buy costs $3.45 in fees
The sell costs $3.468
Total fees are $6.918
The remaining profit is $11.082, or roughly 0.32% of the buy-side value
That is still before slippage. Actual exchange fees also vary by account tier, order type, and fee discounts, so the calculation has to use the rates that apply to your accounts.
The displayed spread is never the final return.
Sending ETH from one exchange to another after spotting the gap is usually too slow. The spread may close before the deposit arrives.
A practical setup keeps funds on both venues. You need quote currency, such as USDT, on the exchange where ETH is cheaper. You also need ETH on the exchange where it is more expensive.
Both orders can then be placed at nearly the same time. After the trade, the cheaper venue holds more ETH and less USDT. The expensive venue holds less ETH and more USDT. Repeat that often enough and the balances drift, which creates a separate rebalancing problem.
Each exchange runs its own order book. Buyers and sellers on Binance aren't placing orders in the same market as traders on OKX.
A large sell order may push the price down on one venue while other exchanges barely move. Thin books tend to move more. Regional demand can also pull prices apart, especially when access to fiat or stablecoin liquidity differs between markets.
Price feeds add another wrinkle. A scanner may receive one exchange's update before another, making a gap look larger or longer-lived than it really is.
Trading fees don't create the quoted spread. They decide whether the spread is worth taking.
The best bid and ask show prices for the first available orders. They don't tell you how much can actually trade there.
A 0.5% gap may exist for only $50 of liquidity. A larger order eats through several price levels, raising the average buy price or lowering the average sell price. The spread that looked profitable on screen can disappear during execution.
Before placing the trade, check:
Available depth on both sides
Fees for both orders
Expected slippage at your size
Whether the balances are free or locked
Whether both markets are accepting orders normally
Calculate the result from the expected average fill prices, not the top quotes.
Spot arbitrage is often described as market-neutral, but only after both legs fill.
If the buy completes and the sell fails, you are simply long ETH. If the sell completes first and the buy misses, you may be short or left with less inventory than planned. A fast market can move against that open leg before you fix it.
Start small. Confirm both fills, record the actual fees, and compare the result with the spread shown before execution. This is less exciting than chasing every gap. It is also how you find out whether the setup works.
Once capital is split across several venues, tracking it in separate exchange tabs gets messy. ArbLens consolidates available and locked balances across supported exchanges and wallets, along with positions, fills, PnL, and transfer history. It doesn't find or execute the trade. It shows whether the capital needed for each leg is already in the right place.