Skip to main content
L’appariement est une étape à l’intérieur de l’exécution du noyau, non un service auquel la chaîne s’adresse. Il prend les ordres du bloc dans leur séquence entérinée, les confronte au carnet et produit des exécutions. Il ne déplace le solde de personne — c’est le travail de la chambre de compensation, et cela se produit une fois l’appariement terminé. C’est en tenant ces deux choses séparées que le moteur devient testable. L’appariement répond à quoi s’est échangé contre quoi. La chambre de compensation répond à ce que cela coûte et qui doit désormais quoi à qui.

Le carnet

Chaque instrument a son propre carnet, tenu en mémoire sous la forme de trois structures coopérantes :
Slab arena — une région préallouée d’emplacements
Niveaux de prixtable ordonnée, prix → niveaula meilleure limite se trouve à l’extrémité, sans balayage
Index des ordresid ordre → emplacementannuler et modifier en temps constant
ordre
ordre
ordre
ordre
ordre
Chaîne doublement liée dans la séquence d’arrivée : la priorité dans un niveau est positionnelle, non calculée.
Pourquoi la séquence est fixeLes emplacements libérés sont réutilisés dans une séquence fixe, avec une graine d’index fixe. Pas un choix de performance : deux validateurs qui feraient autrement forkeraient.
tête de chaque niveau
accès direct
Les ordres vivent dans un slab arena — une région préallouée dont l’allocation et la libération se font en temps constant. Les opérations sur le carnet n’allouent donc pas sur le chemin critique, et les emplacements libérés sont réutilisés selon une séquence fixe, et non là où l’allocateur se trouve les placer. Ce dernier détail n’est pas un choix de performance : si deux validateurs réutilisaient les emplacements dans des séquences différentes, tout ce qui observe la disposition des emplacements divergerait. La même discipline s’applique à l’index des ordres, dont la graine est fixe et non aléatoire. Une table de hachage avec une graine par processus est une défense classique contre les attaques par collision ; sur un chemin d’exécution soumis au consensus, c’est un fork. Les prix sont des entiers de bout en bout — des unités de subtick, pas des décimaux. Voir Précision pour la correspondance avec ce que vous soumettez.

La priorité

La priorité, c’est le prix d’abord, puis la position dans la chaîne à ce prix. Le « temps » est la position canonique de l’ordre dans la séquence entérinée du bloc, non le moment où il est arrivé sur un nœud. C’est ce qui supprime la course à la latence intra-bloc. Deux ordres d’un même bloc ont une préséance définie que chaque validateur calcule à l’identique, et aucune proximité avec un nœud donné n’y change quoi que ce soit. D’un bloc à l’autre, l’arrivée compte encore — mais l’unité de compétition est le bloc, pas la microseconde. L’enchaînement des étapes du noyau renforce cela : les annulations s’exécutent avant les placements agressifs à l’intérieur d’un bloc, de sorte qu’une cotation en carnet ne peut pas être prise par un ordre arrivé dans le même bloc que son annulation.

Apparier un ordre

Ordre entrant
Croise le carnet ?
Consommer meilleur niveau opposé
Émettre exécution
Terminé
Reposer ou rejeter, selon la durée de validitéGTC repose · IOC annule · FOK n’exécute rien sauf en totalité · post-only est rejeté plutôt que de croiser
reliquat — niveau suivant
plus rien
Le moteur consomme à répétition la tête du côté opposé, en émettant une exécution pour chaque maker qu’il prend, jusqu’à épuisement de l’ordre entrant ou jusqu’à ce que le carnet ne croise plus. Le sort d’un éventuel reliquat est décidé par la durée de validité :
  • GTC — le reliquat reste en carnet.
  • IOC — le reliquat est annulé.
  • FOK — si l’ordre ne peut pas être exécuté intégralement, rien ne s’exécute du tout.
  • ALO — post-only (exclusivement maker) : si l’ordre devait prendre de la liquidité, il est rejeté plutôt que de croiser.
Les exécutions portent leur attribution dès leur production. Chaque exécution enregistre sa place dans la suite des exécutions de son instrument, et ces places par instrument sont résolues en un séquencement unique à l’échelle du bloc au moment de l’assemblage de la sortie. C’est ce qui permet, plus tard, de remonter d’un événement à la transaction exacte et au point exact du bloc qui l’a causé.

Prévention de l’auto-exécution

Quand un ordre entrant s’apparierait avec de la liquidité en carnet appartenant au même propriétaire, l’appariement est supprimé au lieu d’être exécuté. Le côté qui cède est configurable : Les makers annulés de cette façon sont collectés pendant l’appariement et retirés dans le même bloc, de sorte que le carnet ne porte pas un ordre déjà supprimé. Pour ce contrôle, la propriété se résout au niveau de compte que suit le carnet. Voir Prévention de l’auto-exécution pour la vue côté trading.

Ce que l’appariement ne fait pas

Il ne calcule pas les frais, ne réalise pas de P&L, n’ajuste pas les positions et ne contrôle pas la marge. Tout cela se produit après l’appariement, dans la chambre de compensation, à partir des exécutions que l’appariement a produites. Il ne décide pas non plus si un ordre avait le droit d’exister. La suffisance de marge, les limites d’ordres ouverts, les contraintes reduce-only et la conversion des ordres au marché en ordres limités sont réglées avant qu’un ordre n’atteigne le carnet. Quand le moteur voit un ordre, la seule question est de savoir où il se place dans le carnet.

Pour aller plus loin

Chambre de compensation

Ce qui arrive aux soldes et aux positions une fois les exécutions produites.

Types d’ordres

La vue côté trading : ce que vous pouvez soumettre et comment chaque type se comporte.

Carnet d’ordres

La profondeur, les niveaux, et la lecture du carnet en tant que trader.

IntentionKernel

Où se place l’appariement dans l’exécution du bloc.