/fixio

FIX Protocol Support for Netty

Primary LanguageJavaApache License 2.0Apache-2.0

fixio - FIX Protocol Support for Netty Build Status Codacy Badge

Overview

Why One More FIX Protocol API

This API is intended to replace well known QuickFIX/J in high-frequency trading scenarios.

Design goals

  1. Implement FIX Protocol Java API with as low memory footprint as possible in order to eliminate unnecessary GC overhead, thus improving overall application performance under high load.
  2. Provide FIX Protocol Codecs for Netty, to make it possible to get rid of Apache Mina which is used by QuickFIX/J as a transport layer.
  3. Avoid using expensive operations:
    • Avoid synchronization.
    • Replace BigDecimals with custom Fixed Point Number implementation for financial data.
    • Reuse java.util.Calendar and java.util.TimeZone instances.

The API has a number of limitations, so it may be not suitable for any FIX application.

Limitations

  1. Logon message encryption is not supported. EncryptMethod(98)=0
  2. XmlData is not supported
  3. Message encodings other than US-ASCII are not supported.
  4. Message resending and resend requests are not supported.
  5. ...

Performance

Currently fixio can beat QuickFix performance in simple scenario. See performance comparison.

Getting Started

  1. Download ZIP archive or clone/fork the repository.
  2. Build and install project artifacts to your local maven repository: mvn clean install
  3. Add the dependency to your project
<dependency>
    <groupId>kpavlov.fixio</groupId>
    <artifactId>core</artifactId>
    <version>1.2</version>
</dependency>

You'll also need a slf4j API implementation at runtime, so please add appropriate dependency, e.g.:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.25</version>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

Examples

You may find working example of client and server applications in module "examples".

I recommend running server with Concurrent Mark Sweep Collector enabled: -XX:+UseConcMarkSweepGC and increased Survivor spaces (-XX:SurvivorRatio=4).

Writing Simple FIX Client

To create a simple FIX client you need to:

  1. Implement FixApplication. You may extend FixApplicationAdapter as a quick start.

  2. Create an instance of FixClient and initialize if with FixApplication you've just created and classpath reference to FIX session settings property file.

  3. Invoke FixClient.connect(host, port) to initiate connection. Method connect(...) returns a ChannelFeature which which will be notified when a channel is closed, so you may invoke the method sync() on it if you wish to wait for connection to be closed.

FixApplication app = new FixApplicationAdapter();
client = new FixClient(app);

// set settings file location related to classpath
client.setSettingsResource("/client.properties");

// connect to specified host and port
ChannelFeature closeFeature = client.connect("localhost", 10201);

// wait until FIX Session is closed
closeFeature.sync();

// Shutdown FIX client
client.disconnect();

SSL Support for Client

You may set a property ssl=true in client.properties file.

Or configure FixSessionSettingsProvider by hand. See FixSessionSettingsProvider.Params.SSL.

You may find more information in User Guide and Wiki pages.