> ## Documentation Index
> Fetch the complete documentation index at: https://docs.intention.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Matching

> O livro de ordens, como é representada a prioridade preço-tempo e como a validade da ordem e a prevenção de autonegociação se resolvem sobre ele.

O matching é uma fase dentro da [execução do kernel](/pt/protocol/architecture/kernel), não um serviço com que a cadeia fala. Recebe as ordens do bloco na sua sequência confirmada, percorre-as contra o livro e produz execuções. Não mexe no saldo de ninguém — isso é trabalho da [câmara de compensação](/pt/protocol/architecture/clearinghouse) e acontece depois de o matching terminar.

Manter os dois separados é o que torna o motor testável. O matching responde a *o que negociou contra o quê*. A câmara de compensação responde a *quanto isso custa e quem passa a dever a quem*.

<h2 id="the-book">
  O livro
</h2>

Cada instrumento tem o seu próprio livro, mantido em memória como três estruturas que cooperam entre si:

<div className="dg" data-dg="matching-book">
  <div className="dg-c" style={{aspectRatio:"720 / 302"}}>
    <svg className="dg-w" viewBox="0 0 720 302" aria-hidden="true">
      <path className="dg-wire dg-soft" d="M 348.60 82.00 L 352.60 82.00" />

      <path className="dg-wire dg-soft" d="M 438.20 82.00 L 442.20 82.00" />

      <path className="dg-wire dg-soft" d="M 527.80 82.00 L 531.80 82.00" />

      <path className="dg-wire dg-soft" d="M 617.40 82.00 L 621.40 82.00" />

      <path className="dg-wire dg--blue" d="M 205.00 68.00 L 238.60 68.00" />

      <path className="dg-head dg--blue" d="M 245.00 68.00 L 238.60 72.40 L 238.60 63.60 Z" />

      <path className="dg-wire dg--sky" d="M 205.00 162.00 L 238.60 162.00" />

      <path className="dg-head dg--sky" d="M 245.00 162.00 L 238.60 166.40 L 238.60 157.60 Z" />
    </svg>

    <div className="dg-band" style={{left:"34.7222%",top:"9.9338%",width:"65.2778%",height:"56.2914%"}}><span className="dg-cap">Slab arena — uma região pré-alocada de slots de ordens</span></div>
    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"9.9338%",width:"27.7778%",height:"25.1656%"}}><span className="dg-t">Níveis de preço</span><span className="dg-s">mapa ordenado, preço → nível</span><span className="dg-n">o topo do livro alcança-se indo ao extremo, sem varrer</span></div>
    <div className="dg-b dg--sky" style={{left:"0.0000%",top:"41.0596%",width:"27.7778%",height:"25.1656%"}}><span className="dg-t">Índice de ordens</span><span className="dg-s">id da ordem → slot</span><span className="dg-n">cancelar e alterar: tempo constante</span></div>
    <div className="dg-b dg--yellow" style={{left:"36.9444%",top:"19.5364%",width:"11.0556%",height:"15.2318%"}}><span className="dg-t">ordem</span></div>
    <div className="dg-b dg--yellow" style={{left:"49.3889%",top:"19.5364%",width:"11.0556%",height:"15.2318%"}}><span className="dg-t">ordem</span></div>
    <div className="dg-b dg--yellow" style={{left:"61.8333%",top:"19.5364%",width:"11.0556%",height:"15.2318%"}}><span className="dg-t">ordem</span></div>
    <div className="dg-b dg--yellow" style={{left:"74.2778%",top:"19.5364%",width:"11.0556%",height:"15.2318%"}}><span className="dg-t">ordem</span></div>
    <div className="dg-b dg--yellow" style={{left:"86.7222%",top:"19.5364%",width:"11.0556%",height:"15.2318%"}}><span className="dg-t">ordem</span></div>
    <div className="dg-b dg-plain dg-left" style={{left:"36.9444%",top:"41.3907%",width:"60.8333%",height:"15.2318%"}}><span className="dg-s">Cadeia duplamente ligada pela sequência de chegada: a prioridade dentro de um nível é posicional, não calculada.</span></div>
    <div className="dg-b dg-dashed dg-left" style={{left:"0.0000%",top:"74.8344%",width:"100.0000%",height:"20.5298%"}}><span className="dg-t">A ordem de reutilização é fixa</span><span className="dg-s">Os slots libertados são reutilizados por ordem fixa e o índice tem semente fixa. Não é escolha de desempenho: dois validadores a reutilizar slots por ordens diferentes divergiriam.</span></div>
    <div className="dg-lbl" style={{left:"31.2500%",top:"17.8808%",width:"15.2778%",whiteSpace:"normal"}}>topo de cada nível</div>
    <div className="dg-lbl" style={{left:"31.2500%",top:"62.9139%",width:"15.2778%",whiteSpace:"normal"}}>consulta direta</div>
  </div>
</div>

| Estrutura            | Papel                                                                                                                                                      |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Níveis de preço**  | Um mapa ordenado de preço para nível, para que o melhor preço de compra e o melhor preço de venda sejam encontrados indo ao extremo em vez de varrer tudo  |
| **Cadeia de ordens** | Uma lista duplamente ligada que encadeia as ordens pela sequência de chegada, para que a prioridade dentro de um nível seja posicional em vez de calculada |
| **Índice de ordens** | Um mapa direto do ID da ordem para o seu slot, para que cancelar e alterar sejam operações de tempo constante em vez de uma pesquisa                       |

As ordens vivem numa **slab arena** — uma região pré-alocada com alocação e libertação em tempo constante. As operações sobre o livro de ordens não alocam, portanto, no caminho crítico, e os slots libertados são reutilizados segundo uma ordem fixa e não onde calhar ao alocador. Este último detalhe não é uma escolha de desempenho: se dois validadores reutilizassem slots segundo ordens diferentes, tudo o que observasse a disposição dos slots divergiria.

A mesma disciplina aplica-se ao índice de ordens, cuja semente é fixa e não aleatória. Um hash map com semente por processo é uma defesa habitual contra ataques de colisão; num caminho de execução por consenso é um fork.

Os preços são inteiros em todo o lado — unidades subtick, não decimais. Ver [Precisão](/pt/trading/precision) para saber como isso se relaciona com o que submete.

<h2 id="priority">
  Prioridade
</h2>

A prioridade é primeiro o preço, depois a posição na cadeia a esse preço. O «tempo» é a posição canónica da ordem na sequência confirmada do bloco, não o momento em que chegou a um nó.

É isto que elimina a corrida à latência dentro de um bloco. Duas ordens no mesmo bloco têm uma precedência definida que todos os validadores calculam de forma idêntica, e nenhuma proximidade a um nó em particular a altera. Entre blocos, a chegada continua a contar — mas a unidade de competição é o bloco, não o microssegundo.

A ordem das fases do kernel reforça isto: os cancelamentos executam antes das colocações agressivas dentro de um bloco, pelo que uma cotação colocada no livro não pode ser levada por uma ordem que chegou no mesmo bloco que o seu cancelamento.

<h2 id="matching-an-order">
  Cruzar uma ordem
</h2>

<div className="dg" data-dg="matching-walk">
  <div className="dg-c" style={{aspectRatio:"720 / 334"}}>
    <svg className="dg-w" viewBox="0 0 720 334" aria-hidden="true">
      <path className="dg-wire dg--blue" d="M 134.00 144.00 L 155.60 144.00" />

      <path className="dg-head dg--blue" d="M 162.00 144.00 L 155.60 148.40 L 155.60 139.60 Z" />

      <path className="dg-wire dg--sky" d="M 320.00 144.00 L 345.60 144.00" />

      <path className="dg-head dg--sky" d="M 352.00 144.00 L 345.60 148.40 L 345.60 139.60 Z" />

      <path className="dg-wire dg--green" d="M 510.00 144.00 L 535.60 144.00" />

      <path className="dg-head dg--green" d="M 542.00 144.00 L 535.60 148.40 L 535.60 139.60 Z" />

      <path className="dg-wire dg--sky" d="M 633.00 114.00 L 633.00 80.00 L 241.00 80.00 L 241.00 103.60" />

      <path className="dg-head dg--sky" d="M 241.00 110.00 L 236.60 103.60 L 245.40 103.60 Z" />

      <path className="dg-wire dg--green" d="M 633.00 174.00 L 633.00 213.60" />

      <path className="dg-head dg--green" d="M 633.00 220.00 L 628.60 213.60 L 637.40 213.60 Z" />

      <path className="dg-wire dg--sky" d="M 241.00 178.00 L 241.00 213.60" />

      <path className="dg-head dg--sky" d="M 241.00 220.00 L 236.60 213.60 L 245.40 213.60 Z" />
    </svg>

    <div className="dg-b dg--blue" style={{left:"0.0000%",top:"35.3293%",width:"18.0556%",height:"15.5689%"}}><span className="dg-t">Ordem que entra</span></div>
    <div className="dg-b dg--yellow dg-round" style={{left:"23.0556%",top:"34.1317%",width:"20.8333%",height:"17.9641%"}}><span className="dg-t">Cruza o livro?</span></div>
    <div className="dg-b dg--sky" style={{left:"49.4444%",top:"35.3293%",width:"20.8333%",height:"15.5689%"}}><span className="dg-t">Consumir o melhor nível oposto</span></div>
    <div className="dg-b dg--green" style={{left:"75.8333%",top:"35.3293%",width:"24.1667%",height:"15.5689%"}}><span className="dg-t">Emitir execução</span></div>
    <div className="dg-b dg--green" style={{left:"75.8333%",top:"67.0659%",width:"24.1667%",height:"25.7485%"}}><span className="dg-t">Fim</span></div>
    <div className="dg-b dg--sky dg-left" style={{left:"10.5556%",top:"67.0659%",width:"45.8333%",height:"25.7485%"}}><span className="dg-t">A sobra fica no livro ou é rejeitada pela validade</span><span className="dg-s">GTC fica no livro · IOC cancela · FOK não executa nada se não executar tudo · post-only é rejeitada em vez de cruzar</span></div>
    <div className="dg-lbl" style={{left:"60.6944%",top:"23.9521%",width:"27.7778%",whiteSpace:"normal"}}>sobra — consumir o nível seguinte</div>
    <div className="dg-lbl" style={{left:"87.9167%",top:"58.9820%"}}>sem sobra</div>
  </div>
</div>

O motor de matching consome repetidamente o topo do lado oposto, emitindo uma execução por cada maker que consome, até a ordem que entra se esgotar ou o livro deixar de cruzar. O que acontece a qualquer sobra é decidido pela validade da ordem:

* **GTC** — a sobra fica no livro.
* **IOC** — a sobra é cancelada.
* **FOK** — se a ordem não puder ser executada na totalidade, nada executa.
* **ALO** — post-only (apenas maker): se a ordem fosse retirar liquidez, é rejeitada em vez de cruzar.

As execuções trazem atribuição à medida que são produzidas. Cada execução regista onde se situa na sequência de execuções do seu instrumento, e essas posições por instrumento são resolvidas numa única ordenação ao longo do bloco quando a saída é montada. É isto que permite, mais tarde, rastrear um evento até à transação exata e ao ponto exato do bloco que o causou.

<h2 id="self-trade-prevention">
  Prevenção de autonegociação
</h2>

Quando uma ordem que entra cruzaria com liquidez do mesmo titular que está no livro, o cruzamento é suprimido em vez de executado. Qual dos lados cede é configurável:

| Modo             | Comportamento                                                      |
| ---------------- | ------------------------------------------------------------------ |
| **Expire taker** | A ordem que entra é cancelada                                      |
| **Expire maker** | A ordem que está no livro é cancelada e a ordem que entra continua |
| **Expire both**  | Ambas são canceladas                                               |

Os makers cancelados desta forma são recolhidos durante o matching e removidos como parte do mesmo bloco, para que o livro não transporte uma ordem que já foi suprimida.

A titularidade para esta verificação é resolvida ao nível de conta que o livro acompanha. Ver [Prevenção de autonegociação](/pt/trading/self-trade-prevention) para a perspetiva do lado da negociação.

<h2 id="what-matching-does-not-do">
  O que o matching não faz
</h2>

Não calcula comissões, não realiza lucros e perdas, não ajusta posições nem verifica margem. Isso acontece depois do matching, na [câmara de compensação](/pt/protocol/architecture/clearinghouse), conduzido pelas execuções que o matching produziu.

Também não decide se uma ordem podia sequer existir. A adequação da margem, os limites de ordens abertas, as restrições reduce-only (apenas redução) e a conversão de mercado para limitada são resolvidos antes de a ordem chegar ao livro. Quando o motor de matching vê uma ordem, a única questão é onde ela pertence no livro.

<h2 id="where-to-go-next">
  Para onde ir a seguir
</h2>

<CardGroup cols={2}>
  <Card title="Câmara de compensação" href="/pt/protocol/architecture/clearinghouse">
    O que acontece aos saldos e às posições depois de existirem execuções.
  </Card>

  <Card title="Tipos de ordem" href="/pt/trading/order-types">
    A perspetiva do lado da negociação: o que pode submeter e como cada tipo se comporta.
  </Card>

  <Card title="Livro de ordens" href="/pt/trading/order-book">
    Profundidade, níveis e como ler o livro enquanto trader.
  </Card>

  <Card title="IntentionKernel" href="/pt/protocol/architecture/kernel">
    Onde o matching se situa na execução do bloco.
  </Card>
</CardGroup>
