Core Pages
Arbitrage (Cross-Exchange Spot)
10 min read
What it is
Scans the price spread of a single symbol between TWO connected exchanges. When the spread exceeds your configured threshold (after both taker fees), the bot fires two IOC orders in parallel: a BUY on the cheaper exchange and a SELL on the more-expensive one. If both fill, you pocket the spread. If only one fills, you're left with an OPEN LEG — an unbalanced position the bot flags for you to resolve manually. The most-fragile feature on the platform; treat it accordingly.
How to think about it
Cross-exchange arbitrage SOUNDS like free money. In practice, it's dominated by HFTs running co-located servers, sub-millisecond latency, and zero-fee tier agreements. The retail edge is narrow: small spreads on less-popular pairs that HFTs ignore. Even there, the OPEN LEG risk and execution latency erode most theoretical profits. Start tiny, expect partial success.
Step-by-step
-
Connect TWO exchanges first
Arbitrage requires both Exchange A and Exchange B to be connected with SPOT TRADING enabled. They must support the same trading pair. The form auto-loads markets from both and shows ONLY pairs tradable on BOTH — preventing the "symbol not found" execution failure.
-
Read the high-risk banner at the top
The amber banner is not boilerplate. Arbitrage fires REAL IOC orders on both exchanges in parallel. Network latency, API rate limits, and one-sided fills are all real failure modes. The bot marks unbalanced fills as OPEN LEG and notifies you — you then have to manually resolve (sell the bought side back, or cover the sold side).
-
Schedule name + Symbol + Exchange A/B
Name is for your own tracking (e.g. "BTC arb Binance vs Kraken"). Symbol must be tradable on BOTH exchanges — the searchable dropdown only shows shared pairs. Exchange A and B must be different.
-
Min net spread % (the critical threshold)
The minimum spread AFTER fees you require before firing. Default 0.5%. Math: if both exchanges charge 0.1% taker fee, you need a 0.2% gross spread JUST to break even. 0.5% net = 0.7% gross required. Most arbs are tiny — even 0.5% net is hard to find on liquid pairs.
-
Taker fee % (per leg)
Your per-trade fee on each exchange (0.1% is the typical retail tier; lower for VIP). The bot uses this to compute net spread. If you misconfigure (e.g. set 0.05% when actual is 0.4%), the bot fires unprofitable trades. Double-check your actual fee on each exchange.
-
Max position per attempt ($)
Capital committed to ONE arb attempt. Default $100. Start with $20-50 for your first deploys — if an OPEN LEG fires at $1,000, you have $1,000 of one-sided exposure to resolve manually. Small attempts limit blast radius.
-
Max trades / hour
Rate limiter. Default 6/hour = one every 10 minutes max. Prevents the bot from firing repeatedly during sustained spread anomalies (often caused by an exchange outage rather than real opportunity).
-
IOC slippage tolerance %
IOC = Immediate-Or-Cancel. The bot places limit orders priced INSIDE your tolerance from current best bid/ask. Tight (0.05%) = fewer fills but better prices. Wide (0.2%) = more fills but worse prices. 0.1% is a reasonable default for liquid pairs.
-
Frequency — manual / 5min / hourly
Manual = scans only when you click Execute (safest for learning). 5min = worker scans + fires every 5 minutes. Hourly = once per hour. Always start with Manual until you've seen 5+ successful manual fires.
-
Enabled checkbox — default OFF
Critical safety: schedules save as DISABLED by default. The worker WILL NOT fire even on a scheduled frequency unless this is checked. Flip on only after a successful manual scan + execute. This is the platform's "no surprise trades" guarantee for arbitrage.
-
Scan + Execute panel
After saving a schedule, click Scan. The panel shows: current Buy Price (cheaper exchange), Sell Price (expensive exchange), Gross Spread %, Net Spread % (after fees), and whether it meets your threshold. Click Execute Now to fire the orders. Real CCXT execution — not simulation.
-
History + the 9 leg statuses
CLEAN FILL = both legs filled at acceptable prices (the goal). PARTIAL = both legs filled but with slippage worse than expected. IMBALANCED = both legs filled but at different sizes (you'll have a small open position). OPEN LEG = only one side filled (CRITICAL — manual resolution required). UNFILLED = neither leg filled. NO TRADE = spread below threshold. RATE LIMITED = exchange API throttled. SKIPPED = max trades/hour hit. ERROR = exchange-side error.
Tips & pitfalls
- OPEN LEG is the worst-case outcome and IT WILL HAPPEN. Plan for it: when you see one in History, immediately go to CEX Trading and manually close the unbalanced position. Sitting on an OPEN LEG hoping for reversal is how arb traders lose money.
- Net Spread % math: if both exchanges have 0.1% taker fees and you require 0.5% net, the GROSS spread must exceed 0.7%. Less than that, no fire. This is why most "arb opportunities" the news mentions are illusory — they don't account for fees.
- Liquid pairs (BTC/USDT, ETH/USDT) RARELY have meaningful arb spreads. HFTs close them in milliseconds. Try less-popular pairs (ATOM/USDT, NEAR/USDT) where HFTs don't bother.
- Most retail arb profits come from "stale price" moments — one exchange laggy after a news event, or briefly disconnected. These windows last seconds. The 5-minute polling interval misses most of them; manual + alert-driven scanning is more realistic.
- Funding deposits between exchanges takes TIME. The bot assumes you have inventory on BOTH exchanges already. If Exchange A runs out of base asset, future SELL legs there will fail. Re-balance manually as needed.
- Set IOC slippage WIDER than you think. A theoretical 0.5% net spread can disappear during the milliseconds your order takes to reach the exchange. 0.1-0.15% tolerance is realistic; 0.05% will leave you with many UNFILLED scans.
- Stop the schedule before exchange-specific maintenance windows. If one exchange is in maintenance, the spread shows artificially wide (the laggy exchange has stale prices). Firing during this = guaranteed OPEN LEG.
- Track results in Trading Journal. After 30+ attempts, you'll know whether your config + pair selection are actually profitable. Most retail arb deployments end up unprofitable after fees + occasional OPEN LEG cleanup. Be honest with the data.