fix-protocol
fix-protocol copied to clipboard
FIX 4.4 session layer implementation for a single pair of initiator (client) and acceptor (server) over TCP
FIX Protocol
FIX 4.4 session layer implementation for a single pair of initiator (client) and acceptor (server) over TCP (might be helpful for educational purposes)
What is FIX?
The Financial Information eXchange (FIX) protocol is an electronic communications protocol initiated in 1992 for international real-time exchange of information related to securities transactions and markets. With trillions of dollars traded annually on the NASDAQ alone, financial service entities are employing direct market access (DMA) to increase their speed to financial markets. Managing the delivery of trading applications and keeping latency low increasingly requires an understanding of the FIX protocol.
Source: English Wikipedia
Basic FIX Timeline
Source: AQUAQ Analytics
Run
-
Clone this repository.
-
Install Boost library. For example, on Ubuntu you can run this command:
sudo apt-get install libboost-all-dev -
Compile the source code with
g++with the following commands:g++ -O2 -std=c++2a -o bin/server.out mainserver.cpp src/* -I include -L lib -lboost_system -lboost_thread -pthread -fconceptsg++ -O2 -std=c++2a -o bin/client.out maintestclient.cpp src/* -I include -L lib -lboost_system -lboost_thread -pthread -fconcepts
-
Run the executable files with the following commands:
bin/server.outbin/client.out
Configuration
- If you are running server and client from two different machines, set the host and port in
include/constants.h. - You can change
MAX_MESSAGE_LENGTHandMAX_TAGS_COUNTconstants ininclude/constants.hif you want to transmit larger messages. - If you want to use Boost Asio for the socket programming part (instead of C++ classic sockets), set
USE_BOOSTconstant totrueininclude/constants.h.
Notes
- Instead of using STL vector, I implemented
FixedVectorclass. It uses C++ classic arrays to handle operations exactly in O(1) (while STL vector handles them in amortized O(1)). Also it prevents large amount of memory fragmentations. It is useful when we know that our messages' size is limited. - Instead of using STL string, I implemented
FixedStringclass. It uses C++ classic character arrays to handle operations exactly in O(1) (while STL string handles them in amortized O(1)). Also it prevents large amount of memory fragmentations. It is useful when we know that our messages' size is limited. - Instead of using STL unordered_map, I implemented
LookupTableclass. It uses C++ classic arrays to handle operations exactly in O(1). It doesn't need hashing algorithms and linked-lists, so it's faster. - According to my research the median/average size of FIX protocol message's length is not greater than 200. So I set
MAX_MESSAGE_LENGTHconstant to 256. - Both classic sockets and Boost Asio sockets have been implemented in this project. You can switch between them easily.
- I used
-O2flag for optimization. - I used
unsigned shortdata type to reduce the memory usage for integer numbers. - I used references and pointers in functions' arguments to reduce the memory and time usage.
- The
Sessionclass is commented based on FIX Protocol 4.4 testcases. - C++ OOP concepts like abstract classes have been used in this project.
Benchmarking
-
Run command
bin/server.out > server_output.txt. -
Run command
time bin/client.out > client_output.txt.This will send 5000 messages to the server (session acceptor), and receives some messages. It waits for 50 milliseconds before sending each message. In this case, we added 50 * 5000 milliseconds (250 seconds) to the run-time.
I tested this on a Lenovo Thinkpad P14s Gen 3 laptop, and it took 253.35 seconds. I had added 250 seconds manually, therefore our algorithm took 3.35 seconds to run (for sending 5000 messages and receiving their responses).
To-do
- Handle the 14th scenario of FIX Protocol 4.4 testcases.
- Separate configuration constants from FIX protocol constants. Don't store everything in a single
include/constants.hfile. - Use move semantics to improve efficiency.