Skip to main content
Il matching è una fase dentro l’esecuzione del kernel, non un servizio con cui la catena dialoga. Prende gli ordini del blocco nella loro sequenza confermata, li fa scorrere contro il book e produce esecuzioni. Non muove il saldo di nessuno: quello è compito della stanza di compensazione, e avviene dopo che il matching è finito. Tenere separate le due cose è ciò che rende il motore testabile. Il matching risponde a che cosa si è incrociato con che cosa. La stanza di compensazione risponde a quanto costa e chi ora deve che cosa a chi.

Il book

Ogni strumento ha il proprio book, tenuto in memoria come tre strutture che cooperano:
Slab arena — una regione preallocata di slot per ordini
Livelli di prezzomappa ordinata, prezzo → livelloil top del book si trova andando in fondo, non scandendo
Indice ordiniid ordine → slotannulla e modifica a tempo costante
ordine
ordine
ordine
ordine
ordine
Catena doppiamente concatenata in sequenza di arrivo: la priorità dentro un livello è posizionale, non calcolata.
Perché l’ordine di riuso è fissoGli slot liberati sono riusati in ordine fisso e l’indice ha seed fisso. Non è una scelta di prestazioni: due validatori che li riusano in ordini diversi divergerebbero.
testa di ogni livello
lookup diretto
Gli ordini risiedono in una slab arena: una regione preallocata con allocazione e rilascio a tempo costante. Le operazioni sul book quindi non allocano sul percorso critico, e gli slot liberati vengono riusati in un ordine fisso invece che dove capita all’allocatore. Quest’ultimo dettaglio non è una scelta di prestazioni: se due validatori riusassero gli slot in ordini diversi, tutto ciò che osserva la disposizione degli slot divergerebbe. La stessa disciplina vale per l’indice degli ordini, il cui seed è fisso e non casuale. Una hash map con seed per processo è una difesa standard contro gli attacchi per collisione; su un percorso di esecuzione di consenso è un fork. I prezzi sono interi ovunque: unità di subtick, non decimali. Vedi Precisione per come questo si traduce in ciò che invii.

La priorità

La priorità è prima il prezzo, poi la posizione nella catena a quel prezzo. Il «tempo» è la posizione canonica dell’ordine nella sequenza confermata del blocco, non il momento in cui è arrivato a un nodo. È questo a eliminare la corsa alla latenza dentro il blocco. Due ordini nello stesso blocco hanno una precedenza definita che ogni validatore calcola in modo identico, e nessuna vicinanza a un nodo particolare la cambia. Tra un blocco e l’altro l’arrivo conta ancora, ma l’unità di competizione è il blocco, non il microsecondo. L’ordine delle fasi del kernel rafforza tutto questo: dentro un blocco gli annullamenti vengono eseguiti prima delle immissioni aggressive, così un prezzo esposto in book non può essere colpito da un ordine arrivato nello stesso blocco del suo annullamento.

Incrociare un ordine

Ordine in arrivo
Incrocia il book?
Consuma il miglior livello opposto
Emette l’esecuzione
Fine
Resta in book o è rifiutato, secondo la validitàGTC resta in book · IOC lo annulla · FOK non esegue nulla se non per intero · post-only è rifiutato invece di incrociare
residuo — prende il livello dopo
nessun residuo
Il motore consuma ripetutamente la testa del lato opposto, emettendo un’esecuzione per ogni maker che prende, finché l’ordine in arrivo non è esaurito o il book non incrocia più. Che cosa succede al residuo lo decide la validità dell’ordine:
  • GTC — il residuo resta in book.
  • IOC — il residuo viene annullato.
  • FOK — se l’ordine non può essere eseguito per intero, non viene eseguito niente.
  • ALO — post-only (solo maker): se l’ordine prendesse liquidità, viene rifiutato invece di incrociare.
Le esecuzioni portano con sé l’attribuzione fin da quando vengono prodotte. Ogni esecuzione registra dove si colloca nella sequenza di esecuzioni del proprio strumento, e quelle posizioni per strumento vengono risolte in un unico ordinamento su tutto il blocco quando l’output viene assemblato. È questo che permette, più tardi, di risalire da un evento all’esatta transazione e all’esatto punto del blocco che l’ha causato.

Prevenzione dell’auto-negoziazione

Quando un ordine in arrivo si incrocerebbe con liquidità in book dello stesso titolare, l’incrocio viene soppresso invece che eseguito. Quale lato cede è configurabile: I maker annullati in questo modo vengono raccolti durante il matching e rimossi come parte dello stesso blocco, così nel book non resta un ordine già soppresso. Per questo controllo la titolarità si risolve al livello di conto che il book traccia. Vedi Prevenzione dell’auto-negoziazione per la prospettiva lato trading.

Che cosa il matching non fa

Non calcola le commissioni, non realizza il P&L, non aggiusta le posizioni e non controlla il margine. Quelle cose avvengono dopo il matching, nella stanza di compensazione, guidate dalle esecuzioni che il matching ha prodotto. Non decide nemmeno se un ordine avesse il diritto di esistere. L’adeguatezza del margine, i limiti sugli ordini aperti, i vincoli reduce-only e la conversione da mercato a limite sono risolti prima che un ordine arrivi al book. Quando il motore di matching vede un ordine, la domanda è solo dove collocarlo nel book.

Dove proseguire

Stanza di compensazione

Che cosa succede a saldi e posizioni una volta che le esecuzioni esistono.

Tipi di ordine

La prospettiva lato trading: che cosa puoi inviare e come si comporta ciascun tipo.

Book degli ordini

Profondità, livelli e come leggere il book da trader.

IntentionKernel

Dove sta il matching nell’esecuzione del blocco.