Protocole FIX: introduction & utilisation

Un des protocoles de communication les plus utilisé en finance est le protocole FIX (Financial Information eXchange). Il permet d’envoyer toutes sorte d’informations financières allant de la market data aux instructions de settlement.

Histoire du protocole FIX

Le protocole FIX a été crée en 1992 par Robert Lamoureux (qui travaillait chez Fidelity Investment, une multinationale spécialisée dans la gestion d’actifs) et Christopher Morstatt (lorsqu’il était employé chez Salomon Brothers, une banque d’investissement de Wall Street) pour le trading d’equity.
Le Financial Information Exchange protocol a ensuite évolué pour permettre de gerer les activites de post-trades ainsi que les autres classes d’actifs.

Voila un court historique des versions

4.1: Ajout de message pour le middle office et back office (settlement Instruction)
4.2: Nouveaux instruments et ajout de messages (Market Data, Security And Trading Session Definition Or Status)
4.3: Ajout de messages (Registration Instruction, Cross Orders, Multileg Orders, Trade Capture)
4.4: Ajout de messages (Multileg Orders, Trade Capture, Confirmation, Position Maintenance, Collateral Management)
5.0: ?
5.0sp1: Ajout de messages (Reference Data, Market Structure, Order Mass Handling)
5.0sp2: Ajout de messages (Securities ReferenceData, Market Structure Reference Data)

Fonctionnement du protocole FIX:

FIX est un protocole permettant d’échanger des données au niveau session (création/conclusion d’une connexion, authentification, heart-beat pour confirmer que la connexion est toujours valide…) ainsi qu’au niveau application (envoie d’ordre au marche, récupération de la définition des instruments financiers, confirmation d’exécution d’ordre…).

Un message FIX est une chaine de caractères constituée de plusieurs couples clé/valeur séparés par le caractère <SOH> (« Start of Header« , la valeur 1 en ASCII).

La clé  est un nombre (appelé « tag »), la valeur est une chaine de caractères pouvant représenter toute sorte de types (entier,  float, char, string,  timestamp… Même du XML ou encore des données binaires).

Exemple de message FIX(le caractère SOH est remplacé par ‘|’):

8=FIX.4.2 | 9=178 | 35=8 | 49=PHLX | 56=PERS | 52=20071123-05:30:00.000 | 11=ATOMNOCCC9990900 | 20=3 | 150=E | 39=E | 55=MSFT | 167=CS | 54=1 | 38=15 | 40=2 | 44=15 | 58=PHLX EQUITY TESTING | 59=0 | 47=C | 32=0 | 31=0 | 151=15 | 14=0 | 6=0 | 10=128 |

Chaque message contient 3 différents composants: Le Header, le Body et le Trailer.

Le Header contient les informations de base du message: Version de FIX, taille du message,  envoyeur, destinataire, numéro de séquence et surtout, le tag 35: Message Type.
Les tags attendus dans le Body changent en fonction du message type , par exemple:

35=D –> défini un message de type « NewOrderSingle » (nouvel ordre) et contiendra des informations liées au passage d’un ordre (prix, instrument, marché, date…)

35=d –> défini un message de type « SecurityDefinition » (définition d’instrument financier) et contiendra les informations liées a un instrument (symbole, date d’expiration, strike, cap price…)

Le Body contient l’ensemble des tags utiles, c’est la partie la plus intéressante du message. C’est la que se trouvent toute l’information sur les transactions, les instruments, les instructions de règlement…)

Le Trailer est un simple checksum pour vérifier la validité du message.

Format de message FIX
Format d’un message FIX

On retrouve ces 3 éléments dans le message FIX d’exemple (un TradeCaptureReport 35=8):

8=FIX.4.2 | 9=178 | 35=8 | 49=PHLX | 56=PERS | 52=20071123-05:30:00.000 | 11=ATOMNOCCC9990900 | 20=3 | 150=E | 39=E | 55=MSFT | 167=CS | 54=1 | 38=15 | 40=2 | 44=15 | 58=PHLX EQUITY TESTING | 59=0 | 47=C | 32=0 | 31=0 | 151=15 | 14=0 | 6=0 | 10=128 |

 

Utiliser le protocole FIX

Il existe différents moteurs FIX propriétaires qui peuvent être utilisés pour se connecter en FIX, on trouve par exemple APPIA développé par NYSE technology qui a été mis sur le marché en 1994 et offre de bonnes performance et de faibles latences. On trouve encore d’autre outils tels que Cameron FIX  engine, Fidessa FIX portal, ou le moteur de FIX de UL Link. Une recherche google devrait permettre de trouver les différents vendeurs qui proposent de telles solutions.

Il existe une très bonne alternative a ces solution: quickfix

Quickfix offre une implémentation gratuite de FIX pour différents langages de programmation (C/C++, Java, Python, .net et ruby). La version Java est basée sur Apache MINA et permet d’implémenter un serveur FIX ou un client FIX en quelques heures. C’est l’outil parfait pour commencer a programmer avec FIX (probablement le sujet d’un futur article).

Liens utiles

Fiximate (version 3.0):
Fiximate est l’outil de référence lorsque l’on travaille avec FIX, très bien organisé et d’utilisation intuitive, il permet de trouver le contenu de chaque message, mais aussi de savoir dans quel messages se trouve un tag précis. Un outil incontournable.

Trés bon outil pour le protocole FIX: fiximate version 3.0
Exemple d’utilisation de fiximate

 

FIX Protocol Message Parser/Analyzer:
Un autre outil particulièrement pratique, est cet analyseur/parseur de message FIX. Il suffit de copier le message ou d’uploader un fichier de logs pour obtenir pour chaque tag son numéro, sa signification et la valeur associée. En cliquant sur le nom du champ on obtient sa description.

Analyse de message qu protocole FIX en ligne
Analyseur de messages au format FIX en ligne

Wireshark:
Pas un site internet, mais un analyseur de paquet libre (le plus connu sans doute). Wireshark permet de visualiser très facilement ce qui transite sur un réseau et contient des filtres pour FIX. Il est extrêmement pratique lors du développement d’application qui utilisent FIX (ou pour tout autre développement lie au réseau d’ailleurs)

exemple d'utilisation de wiresharj
Screenshot de wireshark

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.


2 − = un

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>