Pressione ESC para fechar

Order Book vs AMM: Microestrutura e Arbitragem HFT

Se você ainda acha que uma ordem na corretora é só clicar no botão "Buy" e esperar a mágica acontecer, tenho novidades pra você. No nível dos microssegundos e milissegundos, o mercado é uma zona de guerra brutal, onde a liquidez migra de um estado pra outro num piscar de olhos. A velocidade de execução e a anatomia da pool definem quem vai embolsar o lucro e quem vai pagar a conta do slippage e do fluxo tóxico.

No trading centralizado (TradFi e CEX), o Order Book é quem manda. No DeFi, o padrão da indústria virou o AMM. Mas quando a gente desce pro nível de alta frequência (HFT), a diferença entre eles vai muito além da tecnologia: ela muda radicalmente a dinâmica de formação de preço, arbitragem e execução de ordens.

Bora abrir o capô e entender como a mecânica de liquidez funciona de verdade em ambos os sistemas, onde estão os custos ocultos e como aplicar esse conhecimento na prática.

1. Anatomia do livro de ordens L2/L3: Como a liquidez realmente se parece

A maioria dos traders de varejo só enxerga o book L2: volumes agregados em cada nível de preço. Mas os algoritmos de HFT e os institucionais jogam no L3 (Order-by-Order) — um stream de dados brutos onde cada evento tem seu próprio ID único (order_id), carimbo de data/hora ultrapreciso e posição exata na fila.

Market Data
 

O Princípio de Price-Time Priority (FIFO)

Em um matching engine clássico, as ordens são executadas seguindo uma hierarquia rígida:

  • Preço (a melhor oferta sempre tem prioridade).
  • Tempo (em caso de empate no preço, quem entrou na fila primeiro executa primeiro).

Essa fila por ordem de chegada gera dois efeitos cruciais na microestrutura de mercado:

Adverse Selection (Seleção Adversa): Se a sua ordem limite de compra é executada rápido demais, há uma grande chance de que um grande vendedor entrou rasgando a mercado com um fluxo agressivo (toxic flow), e o preço vai continuar desabando.

Queue Position Value: Estar na frente da fila em um determinado nível de preço tem valor financeiro próprio. Os bots de HFT vivem cancelando e reencaminhando ordens (táticas de Spoofing/Layering ou gestão adaptativa de liquidez) só para manter o topo da fila sem assumir risco desnecessário de inventário.

2. AMM: Do clássico Constant Product à Liquidez Concentrada

O AMM é totalmente diferente de um livro de ordens: não existe fila. O preço é cravado por uma função matemática invariante.

Constant Product (v2): x · y = k

No Uniswap v2 tradicional, a liquidez fica espalhada do zero ao infinito.

Quando um trader manda a ordem pra comprar um volume de Δx, ele drena do pool uma quantia de Δy, calculada já descontando a taxa γ = (1 - fee):

Δy = (y · Δx · γ) / (x + Δx · γ)

O preço de execução não é fixo; ele "desliza" ao longo da curva no exato momento da execução.

Concentrated Liquidity (v3 / Baseada em Ticks)

O Uniswap v3 aproximou o AMM de um order book ao permitir que os provedores de liquidez (LPs) escolham intervalos customizados [Pa, Pb].

O preço é fatiado em ticks, onde cada variação de tick representa uma mudança de 0.01% (1 bps):

P(i) = 1.0001i

A liquidez L dentro da faixa opera como uma invariante "virtual", mas quando o preço cruza a fronteira do tick, a liquidez ativa muda de soco. Para o arbitrador de alta frequência, isso significa que o book do AMM v3 é discreto e sua profundidade varia em degraus conforme os ticks são rompidos.

3. Análise Comparativa: Matriz de Microestrutura

ParâmetroOrder Book (CEX/TradFi)AMM (Uniswap v2)Concentrated AMM (v3)
Prioridade de ExecuçãoPrice-Time (FIFO) / Pro-RataGas Price / MEV (Priority Fee)Gas Price / MEV (Priority Fee)
LatênciaMicrossegundos / NanossegundosTempo de Bloco (ou latência de slots)Tempo de Bloco / Mempool P2P
Formação de PreçoLeilão Contínuo (Continuous Double Auction)Dramática conforme o volume (x · y = k)Dinâmica dentro do tick ativo
Custos de LiquidezSem Impermanent Loss (mas com Risco de Inventário)Impermanent Loss (IL)Loss-Versus-Rebalancing (LVR)
Transparência do FluxoL3 Data Feeds (Pitch, ITCH, FIX)Mempool (pré-bloco) / On-chain (pós-bloco)Mempool (pré-bloco) / On-chain (pós-bloco)

4. Mecânicas Ocultas: MEV, LVR e Toxic Flow

No livro de ordens de uma CEX, a galera do HFT briga por nanossegundos de latência física (colocation no data center da exchange, cabos de fibra dedicada, placas FPGA).

No DeFi, o conceito de tempo é distorcido: a regra do jogo é quem consegue estruturar o bloco.

MEV (Maximal Extractable Value)

Nos AMMs, a ordem das transações dentro de um bloco é orquestrada por Searchers e Builders. Isso dá origem a dinâmicas clássicas de HFT no ecossistema cripto:

  • Front-running / Back-running: Furar a fila de transações na mempool oferecendo uma taxa de prioridade maior (Priority Fee).
  • Sandwich Attacks: Comprar logo antes de uma ordem grande de um usuário para inflar o preço e despejar na cara dele imediatamente no mesmo bloco.

LVR (Loss-Versus-Rebalancing)

Todo mundo se acostumou a calcular o risco de LP usando Impermanent Loss (IL). Só que pro HFT, a métrica que importa de verdade é o LVR, conceito formulado por pesquisadores da Universidade de Columbia e da Paradigm.

LVR (Loss-Versus-Rebalancing) é o prejuízo sistemático que um provedor de liquidez no AMM amarga em comparação com um portfólio idêntico que é rebalanceado continuamente numa CEX usando preços externos.

A causa raiz do LVR é a arbitragem de volatilidade. Quando o preço na CEX anda, o pool de AMM fica para trás mostrando um preço desatualizado (stale price). O bot de arbitragem detecta esse spread, drena a liquidez barata do AMM e se desfaz dela na CEX. O LP do AMM sempre toma a pior ponta da operação contra um fluxo informado (toxic flow).

LVR ≈ (σ² / 8) · ∫0T St · Lt dt

Onde σ é a volatilidade do ativo, St é o preço e Lt é a liquidez ativa. Moral da história: Quanto maior a volatilidade do mercado, mais dinheiro os LPs entregam de bandeja pros arbitradores de HFT.

5. Mão na massa: Script Python para cotação em AMM v3 vs Profundidade L2

Hora do código. Vamos construir uma ferramenta funcional em Python para calcular o preço real de execução (contando com o slippage) para uma ordem hipotética, comparando a profundidade de um book L2 contra uma pool AMM Constant Product.

Tudo feito em Python puro, sem firula e sem dependências pesadas.

from __future__ import annotations
from dataclasses import dataclass
from enum import Enum
from typing import List
class FeeMode(Enum):
    QUOTE = "quote"  # taxa descontada do USDT que entra
    BASE = "base"    # taxa descontada do ETH recebido
@dataclass
class AskLevel:
    price: float
    volume: float
class OrderBookL2:
    """
    Livro de ordens L2 (Lado dos Asks).
    Exemplo do par ETH/USDT:
        price  = USDT por 1 ETH
        volume = ETH
    """
    def __init__(
        self,
        asks: List[tuple[float, float]],
        taker_fee: float = 0.001,
    ) -> None:
        if not (0 <= taker_fee < 1):
            raise ValueError("taker_fee deve estar no intervalo [0, 1)")
        self.taker_fee = float(taker_fee)
        self.asks: List[AskLevel] = []
        for price, volume in asks:
            if price <= 0:
                raise ValueError("O preço deve ser > 0")
            if volume <= 0:
                raise ValueError("O volume deve ser > 0")
            self.asks.append(
                AskLevel(
                    price=float(price),
                    volume=float(volume),
                )
            )
        self.asks.sort(key=lambda x: x.price)
    def best_ask(self) -> float:
        if not self.asks:
            raise ValueError("O livro de ordens está vazio")
        return self.asks[0].price
    def spot_price(self) -> float:
        return self.best_ask()
    def total_liquidity_quote(self) -> float:
        return sum(
            level.price * level.volume
            for level in self.asks
        )
    def total_liquidity_base(self) -> float:
        return sum(
            level.volume
            for level in self.asks
        )
    def simulate_buy(
        self,
        amount_in_quote: float,
        mutate: bool = True,
        fee_mode: FeeMode = FeeMode.QUOTE,
    ) -> tuple[float, float]:
        """
        Simula a compra do ativo base usando amount_in_quote.
        Retorna:
            (
                ativo_base_recebido,
                preco_medio_efetivo
            )
        """
        if amount_in_quote <= 0:
            raise ValueError(
                "amount_in_quote deve ser > 0"
            )
        if fee_mode == FeeMode.QUOTE:
            quote_for_trade = (
                amount_in_quote *
                (1.0 - self.taker_fee)
            )
        else:
            quote_for_trade = amount_in_quote
        remaining_quote = quote_for_trade
        total_base_bought = 0.0
        new_levels: List[AskLevel] = []
        for level in self.asks:
            if remaining_quote <= 0:
                new_levels.append(level)
                continue
            level_cost = (
                level.price *
                level.volume
            )
            if remaining_quote >= level_cost:
                total_base_bought += level.volume
                remaining_quote -= level_cost
            else:
                base_from_level = (
                    remaining_quote /
                    level.price
                )
                total_base_bought += base_from_level
                remaining_volume = (
                    level.volume -
                    base_from_level
                )
                if remaining_volume > 1e-12:
                    new_levels.append(
                        AskLevel(
                            level.price,
                            remaining_volume,
                        )
                    )
                remaining_quote = 0.0
        if remaining_quote > 1e-9:
            raise ValueError(
                "Liquidez insuficiente no livro de ordens"
            )
        if fee_mode == FeeMode.BASE:
            total_base_bought *= (
                1.0 - self.taker_fee
            )
        if total_base_bought <= 0:
            raise ValueError(
                "Volume recebido foi zero"
            )
        avg_price = (
            amount_in_quote /
            total_base_bought
        )
        if mutate:
            self.asks = new_levels
        return total_base_bought, avg_price
class ConstantProductAMM:
    """
    AMM no estilo Uniswap V2
    x = ETH
    y = USDT
    spot = y / x
    """
    def __init__(
        self,
        reserve_x: float,
        reserve_y: float,
        fee: float = 0.003,
    ) -> None:
        if reserve_x <= 0:
            raise ValueError(
                "reserve_x deve ser > 0"
            )
        if reserve_y <= 0:
            raise ValueError(
                "reserve_y deve ser > 0"
            )
        if not (0 <= fee < 1):
            raise ValueError(
                "fee deve estar no intervalo [0, 1)"
            )
        self.x = float(reserve_x)
        self.y = float(reserve_y)
        self.fee = float(fee)
    def spot_price(self) -> float:
        return self.y / self.x
    def invariant(self) -> float:
        return self.x * self.y
    def simulate_buy(
        self,
        amount_y_in: float,
        mutate: bool = True,
    ) -> tuple[float, float]:
        """
        Simula a compra de ETH usando USDT.
        Retorna:
            (
                ETH_recebido,
                preco_medio
            )
        """
        if amount_y_in <= 0:
            raise ValueError(
                "amount_y_in deve ser > 0"
            )
        y_effective = (
            amount_y_in *
            (1.0 - self.fee)
        )
        x_out = (
            self.x *
            y_effective
        ) / (
            self.y +
            y_effective
        )
        if x_out <= 0:
            raise ValueError(
                "Volume recebido foi zero"
            )
        if x_out >= self.x:
            raise ValueError(
                "Liquidez insuficiente na pool"
            )
        avg_price = (
            amount_y_in /
            x_out
        )
        if mutate:
            self.x -= x_out
            self.y += amount_y_in
        return x_out, avg_price
def print_trade_result(
    title: str,
    received: float,
    avg_price: float,
    spot_price: float,
) -> None:
    slippage = (
        (avg_price - spot_price)
        / spot_price
    ) * 100
    print(
        f"{title:<12}"
        f" Recebido: {received:.6f}"
        f" | Preço Médio: {avg_price:,.4f}"
        f" | Slippage: {slippage:.4f}%"
    )
def main() -> None:
    asks = [
        (3000.0, 1.5),
        (3001.0, 2.0),
        (3002.5, 5.0),
        (3005.0, 10.0),
        (3010.0, 25.0),
    ]
    orderbook = OrderBookL2(
        asks=asks,
        taker_fee=0.001,
    )
    amm = ConstantProductAMM(
        reserve_x=1000.0,
        reserve_y=3_000_000.0,
        fee=0.003,
    )
    trade_size = 15_000.0
    ob_spot = orderbook.spot_price()
    amm_spot = amm.spot_price()
    ob_received, ob_avg = orderbook.simulate_buy(
        amount_in_quote=trade_size,
        mutate=True,
        fee_mode=FeeMode.QUOTE,
    )
    amm_received, amm_avg = amm.simulate_buy(
        amount_y_in=trade_size,
        mutate=True,
    )
    print(
        f"\n=== Comparação de Execução de Ordem "
        f"de {trade_size:,.2f} USDT ===\n"
    )
    print_trade_result(
        "ORDERBOOK",
        ob_received,
        ob_avg,
        ob_spot,
    )
    print_trade_result(
        "AMM V2",
        amm_received,
        amm_avg,
        amm_spot,
    )
    print("\n=== Estado Pós-Trade ===\n")
    if orderbook.asks:
        print(
            f"Best Ask: "
            f"{orderbook.best_ask():,.4f}"
        )
    else:
        print("Livro de ordens totalmente limpado")
    print(
        f"AMM Spot: "
        f"{amm.spot_price():,.4f}"
    )
    print(
        f"AMM Reserves: "
        f"{amm.x:.6f} ETH | "
        f"{amm.y:.2f} USDT"
    )
if __name__ == "__main__":
    main()

Como interpretar os resultados

Em pools profundas de AMM, ordens pequenas executam com slippage quase nulo, mas conforme o volume escala, o preço no AMM sobe em uma curva convexa bem acentuada. Já no livro de ordens, tudo depende das muralhas de liquidez (liquidity walls). Se o book estiver ralo, você vai rasgar vários níveis de preço de uma vez e tomar uma cacetada de slippage muito pior do que no AMM.

6. Modelos Híbridos: Como DEXs estão adotando Order Books e por que CEXs de olho no AMM

A linha que separa livros de ofertas e AMMs está cada vez mais tênue. Traders de alta frequência (HFT) e institucionais rapidamente bateram no teto do que o Uniswap v2 clássico podia entregar: baixa eficiência de capital e a impossibilidade de pendurar ordens limite complexas (Stop-loss, Take-profit, Iceberg) tornavam as DEXs inviáveis para um market making pesado.

Isso provocou um salto evolutivo, dando origem às arquiteturas híbridas.

1. Order Books On-Chain e em L2 (dYdX, Hyperliquid, Vertex)

Com a chegada de redes L1/L2 de altíssimo throughput (Aptos, Sui, Arbitrum) e AppChains dedicadas, rodar um order book completo direto na blockchain virou realidade.

Off-chain matching + On-chain settlement: A engine de casamento de ordens roda fora da rede em motores ultra-rápidos (buscando latências < 10 ms), enquanto a liquidação final e os requisitos de margem são travados via smart contracts.

Fully On-chain (Hyperliquid, Serum/Ellipsis): O livro de ofertas roda 100% no consenso da blockchain. O grande gargalo aqui é aguentar o volume insano de operações: o fluxo de alteração e cancelamento de ordens (Cancel/Replace) no HFT representa de 95% a 98% de todas as transações de entrada.

2. Arquitetura Baseada em Intenções (Intent-Based) e RFQ (Request for Quote)

O modelo de "Intents" (Uniswap X, 1inch Fusion, CoW Protocol) na prática resgata a abordagem institucional de execução de ordens.

Em vez de assinar uma transação interagindo direto com uma pool específica, o trader assina uma intenção (ex.: «Quero trocar 100 ETH por no mínimo 300.000 USDC»). A partir daí, uma rede de executores terceirizados (Fillers / Solvers) briga para ver quem entrega a melhor execução, buscando liquidez onde for preciso — CEXs, inventário privado de market makers ou DEXs.

Architecture
 

Para quem está boletando no dia a dia, isso significa slippage zero e blindagem total contra sandwich attacks de MEV: todo o risco de derrapagem e execução fica nas costas do Solver, que se remunera via arbitragem cross-asset.

7. Na Prática: Script Avançado de Arbitragem entre CEX L2 Order Book e AMM v2

No jogo real, bots de HFT vivem caçando desalinhamento de preço entre CEX e AMM. Quando o preço de um ativo dispara na CEX por conta de uma boletada a mercado, a pool do AMM fica "defasada" (stale) por alguns instantes. O arbitrador então compra no AMM empurrando o preço até nivelar com a CEX, descarregando o volume comprado de volta na CEX.

Abaixo está um script em Python pronto para rodar, que calcula em tempo real o tamanho ideal da mão na arbitragem (dx), levando em conta a taxa do AMM, a profundidade do livro da CEX e as taxas de maker/taker.

from __future__ import annotations
from dataclasses import dataclass
from typing import List, Dict, Any
@dataclass
class BidLevel:
    price: float
    volume: float
class OrderBookSide:
    """
    Lado de Bid (compra) do livro de ofertas.
    price  = preço de compra
    volume = volume do ativo base
    """
    def __init__(self, bids: List[tuple[float, float]]):
        self.bids: List[BidLevel] = []
        for price, volume in bids:
            if price <= 0:
                raise ValueError("O preço deve ser > 0")
            if volume <= 0:
                raise ValueError("O volume deve ser > 0")
            self.bids.append(
                BidLevel(
                    float(price),
                    float(volume)
                )
            )
        self.bids.sort(
            key=lambda x: x.price,
            reverse=True
        )
    def is_empty(self) -> bool:
        return len(self.bids) == 0
    def best_bid(self) -> float:
        if self.is_empty():
            raise ValueError("O livro de ofertas está vazio")
        return self.bids[0].price
    def cumulative_levels(self) -> List[tuple[float, float]]:
        """
        Retorna os pontos de inflexão da liquidez.
        [
            (2 ETH, VWAP até 2 ETH),
            (7 ETH, VWAP até 7 ETH),
            ...
        ]
        """
        result = []
        cumulative_x = 0.0
        cumulative_y = 0.0
        for level in self.bids:
            cumulative_x += level.volume
            cumulative_y += level.volume * level.price
            result.append(
                (
                    cumulative_x,
                    cumulative_y
                )
            )
        return result
    def execute_sell(
        self,
        amount_x: float
    ) -> tuple[float, float]:
        """
        Venda de amount_x agredindo o livro.
        Retorna:
        (
            USDT_recebido,
            VWAP
        )
        """
        if amount_x <= 0:
            raise ValueError(
                "amount_x deve ser > 0"
            )
        remaining_x = amount_x
        received_y = 0.0
        for level in self.bids:
            if remaining_x <= 0:
                break
            executed = min(
                remaining_x,
                level.volume
            )
            received_y += (
                executed *
                level.price
            )
            remaining_x -= executed
        if remaining_x > 1e-9:
            raise ValueError(
                "Liquidez insuficiente no livro de ofertas"
            )
        vwap = received_y / amount_x
        return received_y, vwap
class AMMPool:
    """
    Constant Product AMM (x * y = k)
    x = ETH
    y = USDT
    """
    def __init__(
        self,
        reserve_x: float,
        reserve_y: float,
        fee: float = 0.003
    ):
        if reserve_x <= 0:
            raise ValueError(
                "reserve_x deve ser > 0"
            )
        if reserve_y <= 0:
            raise ValueError(
                "reserve_y deve ser > 0"
            )
        if not (0 <= fee < 1):
            raise ValueError(
                "a taxa deve estar no intervalo [0,1)"
            )
        self.x = float(reserve_x)
        self.y = float(reserve_y)
        self.fee = float(fee)
    def spot_price(self) -> float:
        return self.y / self.x
    def calculate_out_x(
        self,
        amount_y_in: float
    ) -> float:
        if amount_y_in <= 0:
            raise ValueError(
                "amount_y_in deve ser > 0"
            )
        y_effective = (
            amount_y_in *
            (1.0 - self.fee)
        )
        x_out = (
            self.x *
            y_effective
        ) / (
            self.y +
            y_effective
        )
        return x_out
    def calculate_required_y_for_x(
        self,
        target_x_out: float
    ) -> float:
        """
        Inversa da fórmula do AMM.
        Quanto USDT precisa entrar
        para drenar target_x_out.
        """
        if target_x_out <= 0:
            raise ValueError(
                "target_x_out deve ser > 0"
            )
        if target_x_out >= self.x:
            raise ValueError(
                "Impossível drenar 100% da reserva"
            )
        y_effective = (
            target_x_out *
            self.y
        ) / (
            self.x -
            target_x_out
        )
        amount_y_in = (
            y_effective /
            (1.0 - self.fee)
        )
        return amount_y_in
def find_optimal_arbitrage(
    amm: AMMPool,
    cex_bids: OrderBookSide,
    cex_fee: float = 0.001
) -> Dict[str, Any]:
    if not (0 <= cex_fee < 1):
        raise ValueError(
            "cex_fee deve estar no intervalo [0,1)"
        )
    if cex_bids.is_empty():
        return {
            "opportunity": False,
            "reason": "Livro da CEX vazio"
        }
    best_bid = cex_bids.best_bid()
    if (
        best_bid *
        (1.0 - cex_fee)
        <=
        amm.spot_price()
    ):
        return {
            "opportunity": False,
            "reason": "Sem spread operacional"
        }
    best_result = None
    best_profit = float("-inf")
    cumulative = cex_bids.cumulative_levels()
    for cumulative_x, cumulative_y in cumulative:
        try:
            required_usdt = (
                amm.calculate_required_y_for_x(
                    cumulative_x
                )
            )
            gross_usdt = cumulative_y
            net_usdt = (
                gross_usdt *
                (1.0 - cex_fee)
            )
            profit = (
                net_usdt -
                required_usdt
            )
            if profit > best_profit:
                avg_buy_price = (
                    required_usdt /
                    cumulative_x
                )
                avg_sell_price = (
                    gross_usdt /
                    cumulative_x
                )
                amm_spot = (
                    amm.spot_price()
                )
                impact_pct = (
                    (
                        avg_buy_price -
                        amm_spot
                    )
                    /
                    amm_spot
                ) * 100
                roi_pct = (
                    profit /
                    required_usdt
                ) * 100
                best_profit = profit
                best_result = {
                    "opportunity": True,
                    "input_usdt_amm": required_usdt,
                    "bought_x": cumulative_x,
                    "gross_usdt_cex": gross_usdt,
                    "net_usdt_cex": net_usdt,
                    "net_profit_usdt": profit,
                    "roi_pct": roi_pct,
                    "amm_spot_price": amm_spot,
                    "amm_avg_buy_price": avg_buy_price,
                    "amm_price_impact_pct": impact_pct,
                    "cex_vwap": avg_sell_price,
                }
        except ValueError:
            continue
    if best_result is None:
        return {
            "opportunity": False,
            "reason": "Liquidez insuficiente"
        }
    if best_result["net_profit_usdt"] <= 0:
        return {
            "opportunity": False,
            "reason": "Slippage corroeu o lucro"
        }
    return best_result
def main():
    amm = AMMPool(
        reserve_x=1000.0,
        reserve_y=3_000_000.0,
        fee=0.003
    )
    cex = OrderBookSide([
        (3050.0, 2.0),
        (3048.0, 5.0),
        (3045.0, 10.0),
        (3040.0, 20.0),
        (3030.0, 50.0),
    ])
    result = find_optimal_arbitrage(
        amm,
        cex,
        cex_fee=0.0005
    )
    print(
        "\n=== Resultado da Análise de Arbitragem ===\n"
    )
    if not result["opportunity"]:
        print(
            f"Status: CANCELADO\n"
            f"Motivo: {result['reason']}"
        )
        return
    print("Status: OPORTUNIDADE ENCONTRADA")
    print()
    print(
        f"Entrada no AMM: "
        f"${result['input_usdt_amm']:,.2f}"
    )
    print(
        f"ETH Comprado: "
        f"{result['bought_x']:.6f}"
    )
    print(
        f"Receita Bruta CEX: "
        f"${result['gross_usdt_cex']:,.2f}"
    )
    print(
        f"Receita Líquida CEX: "
        f"${result['net_usdt_cex']:,.2f}"
    )
    print(
        f"Lucro Líquido: "
        f"${result['net_profit_usdt']:,.2f}"
    )
    print(
        f"ROI: "
        f"{result['roi_pct']:.4f}%"
    )
    print(
        f"AMM Spot: "
        f"{result['amm_spot_price']:.4f}"
    )
    print(
        f"Preço Médio Compra AMM: "
        f"{result['amm_avg_buy_price']:.4f}"
    )
    print(
        f"Impacto de Preço AMM: "
        f"{result['amm_price_impact_pct']:.4f}%"
    )
    print(
        f"CEX VWAP: "
        f"{result['cex_vwap']:.4f}"
    )
if __name__ == "__main__":
    main()

8. Takeaways para o Trader: Como Não Pagar a "Taxa da Ignorância"

Entender microestrutura de mercado não é só teoria acadêmica. É a ferramenta que vai impedir seu capital de escorrer pelo ralo no dia a dia.

  • Ajuste o tipo de ordem para o momento do mercado: Em CEXs, mandar uma ordem a mercado (Market Order) pesada vai varrer vários níveis do livro com certeza, te entregando uma derrapagem dolorosa. Se precisar de execução imediata, use ordens IOC (Immediate-or-Cancel) ou FOK (Fill-or-Kill) cravando o pior preço aceitável.
  • Olhe a profundidade real, não só o spread: Um spread espremido no L2 ($0.01) muitas vezes é ilusão de ótica. Se no top do book (Bid/Ask) só tem $100 de liquidez, uma ordem sua de $50.000 vai rasgar o livro até camadas com preços bizarros.
  • Cuidado com o fluxo tóxico nos AMMs: Se você provê liquidez no Uniswap v3 em um range estreito durante o payroll ou um pico de volatilidade, vira presa fácil para bots de HFT. O tal do LVR (Loss-Versus-Rebalancing) vai engolir todas as suas taxas cobradas em questão de minutos.
  • Proteja-se de MEV em DEXs: Em swaps via AMM, nunca deixe o parâmetro de Slippage Tolerance aberto (mantenha entre 0.1% e 0.3% no máximo) ou use RPCs privadas (como Flashbots Protect / MEV-Blocker) para evitar que sua transação fique dando bobeira na mempool pública esperando um sandwich attack.

Manda nos comentários: qual é a maior derrapagem que você já tomou executando boleta grande? E no dia a dia, qual é o seu porto seguro: Order Book na CEX ou AMM na DEX?


FAQ

O Order Book emparelha ordens de limite e mercado usando um leilão contínuo baseado na prioridade de preço e tempo (FIFO), enquanto os Automated Market Makers (AMMs) executam negociações programaticamente contra pools de liquidez por meio de invariantes matemáticas como X x Y = k.

A Impermanent Loss mede a desvalorização do portfólio em relação ao HODL com base na variação absoluta de preço, enquanto o Loss-Versus-Rebalancing (LVR) quantifica o custo sistêmico de seleção adversa pago a arbitradores HFT que exploram preços defasados de pools AMM em comparação com exchanges centralizadas.

Os bots MEV monitoram transações pendentes no mempool público, inserindo uma ordem de front-running com alta taxa de prioridade para inflar artificialmente o preço do token antes da ordem alvo e executando um back-running no mesmo bloco para extrair lucro livre de risco.
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

...

Deixe seu parecer

O seu endereço de e-mail não será publicado. Campos obrigatórios estão marcados *