Les défis de la construction d’un protocole FIX
Le premier jour où j’ai découvert FIX, c’était lorsque je travaillais dans une banque d’investissement à Londres en tant que développeur, on m’a dit d’écrire un gestionnaire de flux pour récupérer des données de marché. Gardez à l’esprit qu’à ce moment-là, je ne savais rien de FIX, à part le rechercher sur Google pendant environ 10 minutes sur Internet. Avec une touche d’excès de confiance et une légère arrogance, je me suis mis au travail de codage d’une connexion de socket directe au point de terminaison FIX distant, en pensant : « À quel point cela pourrait-il être difficile ?
Alors, qu’est-ce que FIX ?
Financial Information eXchange (FIX) est à la fois un format de données de marché et un protocole : il est utilisé par les banques d’investissement pour passer des ordres et recevoir des données de marché et est devenu un langage mondial dans le commerce financier. Le format d’un message FIX contrôle la façon dont il est encodé. Tous les messages FIX commencent par 8=FIX
, qui indique le début d’un message FIX. Ils passent ensuite à la liste des paires de clés et de valeurs. Les touches sont représentées par des nombres (appelés TagNumbers
) suivi d’un =
délimiteur pour délimiter les valeurs. Chaque key=value
combinaison est alors délimitée par la \u0001
personnage, qui est parfois représenté visuellement comme ^
ou |
. La valeur est souvent écrite dans un format semi-lisible par l’homme. Je dis lisible semi-humain parce que la plupart du temps, il est lisible par l’homme, mais trop souvent, FIX utilisera un seul caractère pour désigner un état ou un type de message. Ces personnages ne sont pas toujours évidents. Je suis d’accord que le personnage B
pour « Acheter » et S
pour « Vendre » a du sens, mais d’autres caractères sont utilisés qui n’ont aucun sens. Par exemple, D
désigne un message « New Order Single », qui est un message souvent utilisé lorsque vous souhaitez passer un ordre auprès de votre contrepartie.
Image 1 : Un exemple de message FIX au format FIX
En ce qui concerne le protocole FIX, vous devez être prudent, car il s’avère beaucoup plus compliqué que d’avoir simplement le bon format de message FIX et d’être capable de décoder le key=value
paires. Le protocole comprend également la garantie que la contrepartie s’est connectée avec succès et que tous les messages manqués sont retransmis. Il nécessite également la prise en charge des remplissages d’espace et des réinitialisations de séquence.
Revenons au codage : Le premier défi était de passer la phase de connexion. Il semblait que ce message de connexion était obligatoire ! Au fil du temps, j’ai réussi à rassembler suffisamment de messages de connexion pour que l’autre extrémité revienne avec une réponse de connexion, mais il n’a pas fallu longtemps avant que mes collègues commencent à me narguer en disant : « Pourquoi n’utilisez-vous pas simplement Quick/FIX4J ? ”
Sauvant la face et essayant de ne pas montrer que je ne connaissais rien à QuickFIX, j’ai tranquillement baissé mon IDE et j’ai sauté sur le navigateur Web. En faisant quelques recherches sur QuickFIX, je me disais : « Peut-être que l’utilisation de cette bibliothèque open source pourrait être plus simple que de tout mettre en œuvre moi-même » et « Peut-être qu’il me faudra plus de temps pour comprendre comment utiliser cette bibliothèque ».
La bibliothèque était vaste et ils y ont clairement consacré beaucoup de travail, mais j’ai été submergé par la complexité de tout cela. J’ai pensé: « Est-ce que ça doit vraiment être comme ça? »
À l’époque, je travaillais aux côtés d’une équipe de développeurs que j’admirais. Ces gars-là ont soutenu le mantra « aucun code n’est le code le plus rapide ». Tout ce qu’ils écrivaient était super optimal : ils travaillaient avec des tampons d’octets bruts plutôt que de créer des objets indésirables, et leur code Java ressemblait plus à du code « C » que n’importe quel Java que j’avais jamais vu auparavant.
Je suis donc retourné sur mon PC et j’ai procédé à l’implémentation de la route d’analyseur de tampon d’octet brut léger. Au cours des semaines suivantes, j’ai commencé à recevoir des données de bout en bout passant par l’adaptateur FIX, et quand j’ai eu fini, ça a filtré.
Maintenant, en repensant à ces premiers jours, je me demande : « Ai-je pris la bonne décision ? Aurais-je dû la mettre en œuvre moi-même ? La réponse est, je pense, oui. Il était préférable d’implémenter la solution personnalisée simple et légère avec laquelle je me suis retrouvé, mais je ne m’en suis sorti que parce que j’avais un cas d’utilisation FIX extrêmement simple. Je ne connectais qu’une seule session à une seule contrepartie avec une seule version de FIX et, à part les messages de connexion et de pulsation, un seul message.
Mon problème aurait été que si plus tard cela devait être mis à niveau vers une autre version FIX, nous devions prendre en charge les demandes de renvoi, les réinitialisations de séquence et les remplissages d’espace, ou offrir un support de production et un tableau de bord où administrer les sessions en cours d’exécution existantes sur le système en direct.
Image 2 : Exemple de tableau de bord pour les sessions FIX
À ce stade, cela devient une entreprise sérieuse, et il devient plus logique de se tourner vers une solution éprouvée, déjà avec toutes ces cloches et sifflets, pour utiliser des produits capables de rechercher des messages FIX historiques :
Image 3 : Recherche de tous les messages FIX avec un identifiant de commande client donné
Ou, pour déclencher des alertes lorsque les sessions se déconnectent :
Image 4 : Alertes déclenchées dans FIX UI
Peu de temps après, j’ai rejoint une entreprise fondée par Peter Lawrey. Peter est l’un de ces développeurs super optimaux que j’ai mentionnés plus tôt. Il a développé les logiciels open source largement utilisés Chronicle Queue et Chronicle Map. Ensemble, nous nous sommes mis au travail et avons construit un tel moteur FIX qui a toutes ces cloches et sifflets, et ce faisant, nous avons également construit une entreprise qui est devenue une équipe de plus de 20 personnes.
Avec le recul, les développeurs peuvent économiser du temps et des efforts en utilisant une solution logicielle d’achat et de construction. Comme mentionné, j’aurais été bloqué si nous avions voulu fournir un support de production avec ma solution simple. De plus, j’aurais certainement eu besoin de plus de temps pour construire une interface utilisateur. La leçon apprise était : «Parfois, le temps passé à réinventer la roue aboutit à un nouveau dispositif de roulement révolutionnaire. Mais parfois, cela ne représente que du temps passé à réinventer la roue.”