# FIX-Protokoll

Das FIX-Protokoll (Financial Information eXchange) ist ein Kommunikationsprotokoll und offener Standard zum Austausch von Informationen, der von Banken, Brokern, Börsen und sonstigen Dienstleistern geschaffen wurde.
Durch die Verwendung eines gemeinsamen Standards soll der Austausch von Informationen zwischen den Anwendungen der verschiedenen Hersteller vereinfacht werden.
Die FIX-Schnittstelle entstand im Jahr 1990 durch die Zusammenarbeit von Banken, Brokern, Börsen und Dienstleistern und hat sich als offene Schnittstelle durchgesetzt.

## Standardisierung

Einige Unternehmen und Organisationen haben sich im Jahr 1998 in einer Non-Profit-Organisation, der FIX Protocol Limited, zusammengeschlossen, um gemeinsam die Entwicklung des FIX-Protokoll-Standards voranzutreiben. Heutzutage umfasst diese Organisation mehr als 170 Unternehmen.
Die neueste Spezifikation ist derzeit Version 5.0 SP2 (Service Pack 2), dennoch sind in der Praxis auch ältere Versionen noch in Gebrauch.

## Implementierung

Das FIX-Protokoll umfasst eine Schnittstelle, diese kann von Software-Herstellern ohne Lizenzierungskosten implementiert werden.
Das FIX-Dictionary enthält den verwendeten Sprachschatz. Alle FIX-Nachrichten sind nach gewissen Regeln und Strukturen aufgebaut, die dort festgelegt sind.
In der Regel wird nur ein Teil des Sprachschatzes implementiert, der Umfang der Implementierung wird zwischen den Kommunikationspartnern (Handelspartnern) abgestimmt und beim hauseigenen Software-Entwickler in Auftrag gegeben. Bei Bedarf kann der Sprachschatz (das FIX-Dictionary) auch ohne großen Aufwand erweitert werden, in der Regel wird man jedoch auf den standardisierten Sprachschatz zurückgreifen.
Durch die Standardisierung der Schnittstelle können später, nach Vereinbarung zwischen den Handelspartnern, mit geringem Aufwand Änderungen und Erweiterungen vorgenommen werden.
Auch ist der Einsatz von Standard-Software möglich, diese kann dann bei Bedarf an die Anforderungen des Handelspartners angepasst werden.

## FIX-Datenformat

FIX-Nachrichten sind auf der Basis eines ASCII-Bytestroms definiert. Jedes Telegramm besteht aus einer Reihe von Schlüsselnummer-Wert-Paaren, die einzelnen Wertpaare werden durch ein Byte mit Wert 1 (ASCII SOH) getrennt. Die Schlüsselnummern (Tags) sind in ASCII-Dezimaldarstellung kodiert, durch ein Gleichheitszeichen (ASCII 61) getrennt folgt der Wert. Numerische Werte werden ebenfalls in ASCII-Dezimaldarstellung kodiert, während ASCII-Zeichenketten direkt verwendet werden. Für jeden Basisdatentyp gibt es eine vorgeschriebene ASCII-Kodierung für die Wertdarstellung, die die üblichen Darstellungen für die Terminalformatierung (sprintf/sscanf) übernimmt.
Je nach Version des FIX-Protokolls sind eine Reihe von Wertpaaren vorgeschrieben: Jedes Telegramm beginnt mit einem Kopfblock, in dem das erste Wertpaar die Versionsnummer nennt („8=4.2“) und ein Wertpaar den Nachrichtentyp kodiert („35=8“). Aus dem Nachrichtentyp folgen entsprechend der FIX-Version nachfolgend zwingende oder optionale Wertpaare, die im mittleren Nachrichtblock dem Kopfblock folgen. Das Telegramm wird mit einem Schlussblock (Trailer) mit geforderten Wertpaaren beendet, das als letztes Wertpaar eine Prüfsumme enthält („10=64“).
Ein Gesamttelegramm für einen „Execution Report“ (Bestätigung der Transaktionen z. B. des Aktienkaufs) sieht so aus:
* 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=64 |
Behelfsweise wurde hier „|“ für das Trennzeichen SOH eingesetzt. In FIX4 erfordert der Kopfblock drei Wertpaare - BeginString(8), BodyLength(9) und MsgType(35). In FIX5 besteht der Kopfblock aus fünf zwingenden Wertpaaren plus einem optionalen Wertpaar - BeginString(8), BodyLength(9), MsgType(35), SenderCompID(49), TargetCompID(56) und optional ApplVerID(1128). Die BodyLength errechnet sich aus der Zahl der Bytes von einschließlich MsgType(35) bis ausschließlich Prüfsumme(10), wobei die SOH-Trenner mitzählen. Die Prüfsumme wird über die gesamte Nachricht (ausschließlich des Prüfsummenfeldes selbst) gebildet, indem die Bytes aufsummiert werden und der Byte-Rest (modulo 256) genommen wird.
Beim Versand von FIX-Telegrammen per UDP muss der Kopfblock am Paketanfang beginnen, Telegramme dürfen nicht über mehrere UDP-Pakete gesplittet werden.

## FAST-Datenformat

Die Datendarstellung per ASCII mit der Auszeichnung jedes Werts mit einer Schlüsselnummer ist für einen bandbreitenintensiven Datenstrom sehr aufwändig, etwa die Darstellung aller Marktdaten an einem liquiden Handelsplatz. Daher wurde eine alternative byte-orientierte binäre Kodierung definiert als „FIX Adapted for Streaming“, kurz FAST (Apronym zu englisch fast, also „schnell“).
Bei FAST ist zur Interpretation des Datenstroms auf der Empfängerseite neben dem FIX-Verzeichnis zusätzlich ein Template (Schablonenbeschreibung) notwendig, das von der Senderseite (dem Handelsplatz) veröffentlicht wird. Die wesentliche Optimierung besteht darin, dass im Template ein Großteil der Schlüsselnummern mit einem Grundwert (Default) belegt wird, sodass diese nicht mehr in jedem Telegramm mitgesendet werden müssen (z. B. die FIX-Version) und statt Namenswerten nur Indexwerte einer Liste (Enum) übersandt werden. Die Zahlenwerte (auch Indexwerte) werden binär kodiert. Das Template definiert dann eine zwingende Anordnung von Feldern, sodass die Schlüsselnummern (Tags) nicht mehr mitgesendet werden müssen, und schließlich kann für die Wertkodierung angegeben werden, dass nur noch die Differenz zum Wert des vorhergehenden Schlüsselpaars kodiert wird.
Durchgesetzt hat sich, das FAST-Template als XML-Text zu veröffentlichen, wobei das XML-Schema (FIXML) durch das FIX-Standardisierungsgremium definiert ist. FIXML geht auf eine Initiative der CME vom Juni 2002 zurück, die finale Version für FIX 4.4 wurde im Januar 2004 veröffentlicht.