Naciśnij ESC, aby zamknąć

Arbitraż CEX/DEX: Poradnik Spready i Boty MEV

Anatomia spreadu: Skąd się bierze dysbalans?

Rynek bywa nieefektywny – szczególnie podczas potężnego hype'u albo paniki. Na CEX-ach (Binance, Bybit, OKX) cenę ruszają market makerzy i orderbooki. Tam o wszystkim decyduje sekundowa przewaga w arkuszu zleceń. Z kolei na DEX-ach cena rządzi się prawami AMM (Automated Market Makers) i jest na sztywno powiązana z matematyczną formułą puli (np. stałego iloczynu $x \times y = k$).

Jeśli na giełdzie grubas zacznie nagle sypać tokenem prosto w rynek, cena na CEX-ie błyskawicznie leci w dół. A na DEX-ie? Na DEX-ie cisza, dopóki nie wjedzie tam pierwszy arbiter albo zwykły użytkownik. Ten lag czasowy między aktualizacją orderbooka na CEX-ie a zmianą proporcji tokenów w puli DEX — to jest właśnie nasz chleb powszedni.

Pamiętajcie jednak o szczególe, o którym rzadko pisze się na publicznych kanałach: spread często okazuje się iluzją. Widzicie różnicę 3%, jaracie się, wchodzicie, a tam pusta pula. Płynności jest dosłownie na waciki. Klikniecie Swap, cena poleci prosto w was, i zamiast profitu zaliczycie stratę. To tak zwany Price Impact (wpływ na cenę).

Mapa ryzyka: Co wyzeruje Twój depozyt

Zanim w ogóle dotkniecie kodu i skanerów, zakodujcie sobie checklistę zagrożeń. Arbitraż to gra na prędkość z ujemną wartością oczekiwaną, jeśli nie potraficie skalkulować ukrytych kosztów.

Rodzaj kosztu / RyzykaGdzie jest haczykJak to zminimalizować
CEX Withdrawal LagGiełda blokuje wypłatę na 5-10 minut. W tym czasie spread zdąży się zamknąć.Trzymać płynność i tu, i tu. Rozgrywać to „zleceniami przeciwstawnymi” bez realnego przerzucania tokenów między giełdami.
Price ImpactNiska płynność w puli DEX. Duże zlecenie mocno krzywi cenę.Liczyć głębokość puli. Wielkość Waszej pozycji nie powinna przekraczać 1-2% TVL danego poola.
Gas & MEVW sieciach EVM (Ethereum, BSC, Arbitrum) boty wyłapią transakcję w mempoolu i wyprzedzą ją przez Front-running.Używać Flashbots RPC (dla Mainnetu) lub zabezpieczonych węzłów RPC, żeby nie wystawiać transakcji w publicznym mempoolu.
CEX FeesProwizje maker/taker + stała opłata za wypłatę tokena.Kręcić wolumeny na CEX-ie, żeby wbijać wyższe poziomy VIP. Na takim EXMON na przykład Maker/Taker wynosi okrągłe zero, co jest idealne pod kręcenie kółek.

Algorytm szukania z ręki a automatyzacja

Szukanie trade'ów w 100% ręcznie w 2026 roku to czysty masochizm. Musicie jednak rozumieć mechanikę, jaka za tym stoi.

Strategia jest prosta. Wchodzimy na CoinMarketCap albo CoinGecko. Filtrujemy tokeny z niższą kapitalizacją (shitcoiny, ale żywe, z jakimś sensownym wolumenem). Otwieramy zakładkę „Markets” („Rynki”) i patrzymy na rozbieżności. Jeśli widzimy różnicę między umownym Gate.io a pulą na Uniswap/PancakeSwap w sieci Arbitrum lub Base (tam gaz kosztuje grosze) — zaczynamy kopać głębiej.

Ręczna checklista krok po kroku:

  • Sprawdzić status wpłat/wypłat tokena na CEX-ie. Jeśli portfel jest zablokowany — spread jest fejkowy. Odpuszczamy.
  • Sprawdzić sieć. Token na CEX-ie musi być dokładnie w tej samej sieci, w której kręci się pula DEX. Mosty (bridges) zjedzą Wasz czas i profit.
  • Oszacować poślizg (slippage). Wklepujemy w interfejsie DEX-a interesujący nas wolumen kupna/sprzedaży. Patrzymy na ostateczny Price Impact. Jeśli zżera spread — temat jest martwy.

Skrypt do monitoringu: Liczymy spread jak prosi

Koniec teorii, czas na soft. Potrzebujemy skryptu, który pociągnie cenę z CEX-a (przez CCXT) i sparsuje cenę puli bezpośrednio ze smart kontraktu DEX-a (przez Web3.py), omijając zamulone frontendy.

Poniżej macie gotowy, działający skrypt pod konfigurację Bybit (CEX) i pulę Uniswap v2 na Arbitrum (DEX). Kod jest gotowy do boju.

Python

import time
from web3 import Web3
import ccxt
# Podpinamy się pod węzeł. Korzystajcie z szybkich, prywatnych RPC, publiczne wiecznie lagują
RPC_URL = "https://arb1.alpharc.io/v1/your-api-key" # wrzuć tutaj swoje działające RPC
w3 = Web3(Web3.HTTPProvider(RPC_URL))
if not w3.is_connected():
    raise Exception("Węzeł padł, naprawiaj")
# Inicjalizujemy giełdę przez CCXT
exchange = ccxt.bybit({
    'enableRateLimit': True,
})
# Kontrakt puli Uniswap V2 (lub Sushi) Arbitrum dla przykładu (WETH/USDC)
# Tutaj możecie podstawić dowolnego shitcoina, ważne by znać adres puli danej pary
POOL_ADDRESS = "0x905dfCD56492171426f30a7d11d68E1da87ab64B" 
# ABI puli V2. Potrzebujemy tylko funkcji getReserves, reszta to śmieci, nie ciągniemy ich
POOL_ABI = [
    {
        "constant": True,
        "inputs": [],
        "name": "getReserves",
        "outputs": [
            {"name": "_reserve0", "type": "uint112"},
            {"name": "_reserve1", "type": "uint112"},
            {"name": "_blockTimestampLast", "type": "uint32"}
        ],
        "payable": False,
        "stateMutability": "view",
        "type": "function"
    }
]
pool_contract = w3.eth.contract(address=w3.to_checksum_address(POOL_ADDRESS), abi=POOL_ABI)
def get_dex_price():
    # Wyciągamy rezerwy bezpośrednio z kontraktu
    reserves = pool_contract.functions.getReserves().call()
    
    # W puli mamy token0 i token1. Zakładamy: token0 = USDC (6 miejsc po przecinku), token1 = WETH (18 miejsc)
    # Uwaga: zawsze weryfikujcie, który token w kontrakcie jest zerowy, a który pierwszy!
    reserve_usdc = reserves[0] / 10**6
    reserve_weth = reserves[1] / 10**18
    
    # Cena WETH w USDC według wzoru puli
    price_dex = reserve_usdc / reserve_weth
    return price_dex
def get_cex_price():
    # Pobieramy arkusz zleceń spot z Bybit
    orderbook = exchange.fetch_order_book('ETH/USDC')
    bid = orderbook['bids'][0][0] if len(orderbook['bids']) > 0 else 0
    ask = orderbook['asks'][0][0] if len(orderbook['asks']) > 0 else 0
    return bid, ask
def monitor():
    print("Odpalamy monitoring nieefektywności...")
    while True:
        try:
            dex_p = get_dex_price()
            cex_bid, cex_ask = get_cex_price()
            
            if dex_p == 0 or cex_bid == 0:
                continue
                
            # Scenariusz 1: Na DEX-ie taniej, na CEX-ie drożej. Kupujemy na DEX, sypiemy na CEX.
            spread_to_cex = ((cex_bid - dex_p) / dex_p) * 100
            
            # Scenariusz 2: Na CEX-ie taniej, na DEX-ie drożej. Kupujemy na CEX, sypiemy na DEX.
            spread_to_dex = ((dex_p - cex_ask) / cex_ask) * 100
            
            if spread_to_cex > 0.5: # próg 0.5%, żeby pokryć prowizje
                print(f"[!] Sygnał! Na DEX jest TANIEJ. DEX: {dex_p:.2f} | CEX Bid: {cex_bid:.2f} | Spread: {spread_to_cex:.2f}%")
                
            if spread_to_dex > 0.5:
                print(f"[!] Sygnał! Na CEX jest TANIEJ. CEX Ask: {cex_ask:.2f} | DEX: {dex_p:.2f} | Spread: {spread_to_dex:.2f}%")
                
            time.sleep(2) # Nie uderzać w węzeł i giełdę zbyt często, bo złapiemy bana na IP
            
        except Exception as e:
            print(f"Błąd w pętli: {e}")
            time.sleep(5)
if __name__ == "__main__":
    monitor()

Zaawansowana taktyka: Zlecenia przeciwstawne (Hedging)

Fizyczne przerzucanie tokenów to przeżytek. Zanim transakcja się potwierdzi i zanim giełda zaksięguje depozyt (wymagając 15-30 potwierdzeń sieci) — rynek zdąży uciec. Spread wyparuje. Prosi wyciskają nieefektywności zupełnie inaczej.

Trzymamy kapitał wcześniej przygotowany na obu platformach.

Przykład: Macie $1000 i 1 ETH na saldzie CEX. Dokładnie tyle samo leży na Waszym Metamasku w sieci Arbitrum.

Skrypt daje sygnał: cena ETH na DEX tąpnęła do $2900, a na CEX trzyma się na poziomie $2950.

Wasz ruch: w tym samym momencie klikacie Swap na DEX (kupujecie ETH za stable po $2900) i sprzedajecie ETH na CEX po $2950. Dokładnie w tej samej sekundzie. Łączna wartość Waszych aktywów wzrosła o deltę spreadu. Zero transferów międzygiełdowych. Salda się przemieszały, a zysk został zablokowany w stablach. Potem, kiedy rynek ochłonie, po prostu wyrównacie pozycje zwykłym transferem.

I najważniejsze: uważajcie na „toxic flow”. Jeśli cena na CEX-ie leci na łeb, na szyję, nawet nie myślcie o ręcznym odkupywaniu tego aktywa na DEX-ie. Spread będzie wydawał się ogromny, ale pula zwyczajnie nie zdążyła się jeszcze przeliczyć. Łapiecie wtedy spadający nóż — 5 sekund później boty arbitrażowe zrolują tę pulę jeszcze niżej, zostawiając Was z ręką w nocniku i stertą tracącego na wartości tokena.

Snajpienie puli v3: Jak nie stracić oszczędności życia na skoncentrowanej płynności

Jeśli myślisz, że Uniswap v2 to wciąż szczyt ewolucji DeFi, to utknąłeś w 2021 roku. Obecnie cały główny wolumen i tłuste spready siedzą na Uniswap v3 oraz jej forkach (PancakeSwap v3, QuickSwap v3). Tutaj mechanika AMM zmienia się diametralnie. W przeciwieństwie do v2, gdzie płynność jest rozmarowana od zera do nieskończoności, w v3 koncentruje się ona w konkretnych przedziałach cenowych, czyli tak zwanych tikach (ticks).

Co to oznacza dla nas? Drastyczny Price Impact w momencie, gdy cena wyskoczy poza granice płynnego przedziału.

Jeśli na CEX-ie trwa właśnie pump na tokenie, a w puli v3 płynność na obecnym tiku się wyczerpie, cena wewnątrz DEX-a zalicza potężny wystrzał – zaliczamy totalny squeeze. Widzisz spread rzędu 15%, robisz szybkiego ape-ina w pulę, a smart contract realizuje Twoją transakcję po najgorszym możliwym kursie, bo wewnątrz tego wąskiego przedziału po prostu nie było żadnych zleceń.

Formuła płynności Uniswap v2:  x * y = k (Gładka zmiana ceny)
Formuła Uniswap v3:            (x + L / √P_b) * (y + L * √P_a) = L^2 (Skokowa zmiana ceny)

Żeby ręcznie skalkulować realny spread w puli v3, sama znajomość rezerw Ci nie wystarczy. Musisz wyciągnąć slot0 bezpośrednio ze smart contractu danej puli.

Checklist do sprawdzenia puli v3 przed wejściem:

  • Wyciągamy sqrtPriceX96 z funkcji slot0. To aktualna cena zakodowana w specyficznym formacie.
  • Sprawdzamy obecny tick.
  • Analizujemy głębokość płynności (liquidity) na tym tiku. Jeśli szoruje po dnie i jest bliska zeru – spread jest sztuczny, a Ciebie ubierze w pozycję po najbardziej niekorzystnej cenie.

Procesowanie transakcji: Jak wyprzedzić MEV boty na zakręcie

Załóżmy, że znalazłeś soczysty spread na sieci Ethereum lub Base. Wysyłasz transakcję przez zwykłego MetaMasku. Co dzieje się dalej? Tx trafia do mempoolu (publicznej kolejki). Boty MEV (Maximum Extractable Value) skanują mempool 24/7. Widzą Twoją transakcję, czują łatwe $100 profitu i generują dokładnie taką samą tx, ale podbijają gas price o 1 gwei wyżej.

Walidator blockchaina wrzuca ich transakcję jako pierwszą. Bot sprząta Twój spread sprzed nosa. Twoja tx wykonuje się zaraz po niej, ale lądujesz na minusie albo transakcja kończy się jako revert (odrzucona), paląc Twój gas. Właśnie zostałeś sfrontrunowany (Front-running). Nic przyjemnego.

Jak się bronić:

  • Używaj private RPC. Zapomnij o domyślnych ustawieniach portfela. Na Ethereum Mainnet wklepuj Flashbots RPC (https://rpc.flashbots.net). Na sieciach typu BNB Chain czy Polygon szukaj dedykowanych prywatnych nodów (np. MEV-Share lub MevBlocker). Twoja transakcja pójdzie bezpośrednio do walidatorów, całkowicie omijając publiczny mempool. Boty jej po prostu nie zobaczą.
  • Ustawiaj ciasny Slippage Tolerance. W ustawieniach DEX-a ustawiaj poślizg cenowy na max 0.5% dla płynnych par i maksymalnie 1-1.5% dla shitcoinów. Jeśli bot spróbuje Cię przesunąć, transakcja po prostu się wyłoży (revert), dzięki czemu uratujesz swój kapitał (stracisz tylko grosze na gas fee).

Przykład praktyczny: Rozbicie realnego case'u

Rozłóżmy na czynniki pierwsze, jak wygląda idealne zamknięcie kółka. Bez ściemy. Token X (powiedzmy zdecentralizowany token gamingowy).

  • Monitoring: Na Bybicie cena tokena nagle leci na łeb z $1.00 do $0.90 przez gruby zrzut jednego z wczesnych inwestorów. Orderbook po stronie kupna (bid) jest gęsty.
  • Analiza DEX: Na PancakeSwapie (sieć BNB Chain) cena tokena wciąż laguje i trzyma się na poziomie $0.98. Pula płynności wynosi $200,000.
  • Kalkulacja wolumenu: Chcemy obrócić kwotą $2,000. Sprawdzamy Price Impact na PancakeSwapie. Przy sprzedaży tokenów za $2,000 w pulę, cena zmieni się zaledwie o 0.3%. To oznacza, że zamkniemy sprzedaż średnio po cenie $0.977.

Matematyka kółka:

  • Zakup na Bybicie: $2,000 / $0.90 = 2222.2 tokenów X.
  • Prowizja CEX (Taker 0.1%): minus 2.2 tokena. Zostaje 2220.
  • Wypłata na portfel: Stały fee sieciowy wynosi 10 tokenów X. Na portfel wpada 2210 tokenów.
  • Sprzedaż na DEX-ie: 2210 * $0.977 = $2159.17.
  • Minus gas za Swap na DEX-ie: ok. $0.15 (na sieci BNB).
  • Czysty zysk: $159.02 z jednego kółka zrobionego w 3 minuty.

Market makerzy na Bybicie wyrównali cenę z DEX-em jakieś 4 minuty po tym, jak zamknęliśmy nasze kółko. Okno możliwości się zatrzasnęło. Kto pierwszy, ten lepszy.

Narzędziownik profesjonalnego farmera spreadów

Jeśli nie chcesz pisać całego softu od zera, oto stack, z którego korzystam ja i większość średniej wielkości teamów:

  • DeXito / Dexscreener / GeckoTerminal – do wizualnego wyłapywania anomalii rynkowych. Monitoruj zakładkę "Arbitrage" na specjalistycznych platformach analitycznych.
  • DeBank / Arkham – do śledzenia portfeli topowych arbitrażystów. Znalazłeś portfel, który regularnie kosi kasę w mempoolu? Wrzuć go na watchlistę i przeanalizuj, z których pul doi kapitał.
  • Tenderly – symulator transakcji. Jeśli obracasz dużym wolumenem i boisz się, że smart contract wypluje błąd, przepuść transakcję przez symulator Tenderly. Pokaże Ci dokładnie, ile gaza zeżre i czy warunek przejdzie w realiach produkcyjnych.

Działanie ręczne na tym rynku ma sens, ale Twoim największym wrogiem jest brak skupienia. Pomylisz sieci, nie sprawdzisz prowizji za wypłatę z CEX-a, klikniesz swap na DEX-ie bez weryfikacji poślizgu – i Twój zysk leci prosto do kieszeni walidatorów sieci. Bądź pragmatyczny,licz koszty do mikrocenta i nie bądź chciwy.

Martyn Borkowski

I am a crypto trader specializing in digital assets and blockchain markets.

My focus is on identifying opportunities, managing risk, and optimizing strategies to achieve consistent growth in the fast-evolving world of cryptocurrency.

Verification & Professional Profiles: X Profile

...

Dodaj opinię

Twój adres e-mail nie zostanie opublikowany. Obowiązkowe pola są oznaczone*