Tutorial QuickFixJ (client et serveur)

Le protocole FIX, l’un des standards de communications utilisés dans la finance, est facile à comprendre et largement employé. Il existe donc plusieurs moteurs FIX payants sur le marchés  tels que Cameron FIX ou encore OnixS FIX Engine. On trouve aussi des moteurs gratuits tels que fix8 ou QuickFix. Nous allons ici nous intéresser à la façon d’implémenter simplement un serveur et un client FIX en utilisant la version version Java du framework QuickFix : QuickFixJ.
(Pour plus d’informations sur le protocole, vous pouvez jeter un oeil à notre introduction au protocole FIX).

 Installer QuickFIXJ

En premier lieu il faut télécharger les jars qui vont biens à partir de la section téléchargement du site de quickfixj

Vous devriez avoir un répertoire similaire à celui ci-dessous :

repertoire de jar quickfixj
jar utilisés par quickfixj

Vous pouvez maintenant utiliser vote IDE Java favori pour créer un projet et rajoutez les jar de QuickFixJ ainsi que ceux se trouvant dans le repertoire « lib » (sl4j-api et mina qui sont requis pour faire tourner QuickFixJ)

Ceci étant fait, le reste devrait être d’une simplicité déconcertante. Quickfix possède 2 composants de base: l’interface « Application » et le fichier de configuration.

L’interface Application

QuickFixj est construit autour d’une interface de base que tout client/serveur doit implémenter: l’interface Application.
Cette interface définie les méthodes qui seront appelées lors des différents évènement de la communication FIX (création de session, login, réception de messages…).
Il suffit donc de rajouter votre code dans la classe qui implémente Application et le tour est joué!

Les méthodes définies par Applications sont les suivantes:

onCreate: méthode appelée lors de la création de la session

onLogon: méthode appelée lors de la connexion (utile pour rajouter des informations de login telles qu’un mot de passe)

onLogout: méthode appelée lors de la déconnexion

toAdmin: méthodes appelées lorsque l’on envoie un message d’administration (heartbeat, rejection…)

toApp : méthode appelée lorsque l’on envoie un message applicatif  (nouvel ordres, demande de données marché…)

fromAdmin: méthode appelée lorsque l’on reçoit un message d’administration

fromApp: méthode appelée lorsque l’on reçoit un message applicatif

et… c’est tout, pas grand-chose de compliqué au final.

 

Le fichier de configuration

L’autre element important de QuickFixJ est le fichier de configuration, il permet de définir le type de programme que l’on développe: Les termes utilisés par quickfixj sont « Acceptor » pour un serveur FIX et « Initiator » pour le client FIX.

Le fichier de configuration contient donc cette information en plus d’autre paramètres de base (répertoire pour les logs, identifiant de connexion,version de FIX utilisée…)

Code & conf pour serveur

Le code java (implémentation de l’interface est une méthodes main qui loade la conf et crée l’Acceptor):

public class FIXServer extends MessageCracker implements Application {
    @Override
     public void fromAdmin(Message arg0, SessionID arg1) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue,
             RejectLogon {
     }
    @Override
     public void fromApp(Message arg0, SessionID arg1) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue,
             UnsupportedMessageType {
     }
    @Override
     public void onCreate(SessionID arg0) {
     }
    @Override
     public void onLogon(SessionID arg0) {
     }
    @Override
     public void onLogout(SessionID arg0) {
     }
    @Override
     public void toAdmin(Message arg0, SessionID arg1) {
     }
    @Override
     public void toApp(Message arg0, SessionID arg1) throws DoNotSend {
     }
    public static void main(String[] args) throws ConfigError {
         SessionSettings settings = new SessionSettings("./files/acceptor.cfg");        FIXServer acceptor = new FIXServer();
         ScreenLogFactory screenLogFactory = new ScreenLogFactory(settings);
         DefaultMessageFactory messageFactory = new DefaultMessageFactory();
         FileStoreFactory fileStoreFactory = new FileStoreFactory(settings);
         SocketAcceptor socketAcceptor = new SocketAcceptor(acceptor, fileStoreFactory, settings, screenLogFactory, messageFactory);
         socketAcceptor.start();
     }
 }

 

Et le fichier de configuration (avec les commentaires)

 [DEFAULT]
# indique un serveur FIX
ConnectionType=acceptor
# stockage des infos de connexion (séquence...)
FileStorePath=./files/  
# stockage des logs
FileLogPath=./files/
[SESSION] #exemple de session

# version de FIX
BeginString=FIX.4.2
# identifiant du client
SenderCompID=clientID
# identifiant du serveur
TargetCompID=serverID
# heure de début de session
StartTime=00:00:00
# heure de fin de session
EndTime=00:00:00
# port
SocketAcceptPort=4242           
# IP
SocketAcceptAddress=127.0.0.1   

Code & conf pour client

Le code pour le client est très similaire à celui du serveur, on va simplement déclarer un objet Initiator au lieu d’un Acceptor

public class FIXClient implements Application {
    @Override
    public void fromAdmin(Message arg0, SessionID arg1) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue,
            RejectLogon {
    }
@Override

    public void fromApp(Message arg0, SessionID arg1) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue,
            UnsupportedMessageType {
    }

    @Override
    public void onCreate(SessionID arg0) {
    }

   @Override
    public void onLogon(SessionID arg0) {
    }

    @Override
    public void onLogout(SessionID arg0) {
    }

    @Override
    public void toAdmin(Message arg0, SessionID arg1) {
    }

    @Override
    public void toApp(Message arg0, SessionID arg1) throws DoNotSend {
    }

    public static void main(String[] args) throws ConfigError {
        Application application = new FIXClient();
        SessionSettings settings = new SessionSettings("./files/initiator.cfg");
        MessageStoreFactory storeFactory = new FileStoreFactory(settings);
        LogFactory logFactory = new FileLogFactory(settings);
        MessageFactory messageFactory = new DefaultMessageFactory();
        Initiator initiator = new SocketInitiator(application, storeFactory, settings, logFactory, messageFactory);
        initiator.start();
        while (1 == 1) {
            ;
        }
        // acceptor.stop();

    }
}

 

Le fichier de conf et lui aussi très similaire a celui de l’acceptor, si ce n’est que les SenderCompID & TargetCompID sont maintenant inversés:

[DEFAULT]
# indique un client FIX
ConnectionType=initiator
FileStorePath=./files/  
FileLogPath=./files/
[SESSION]
BeginString=FIX.4.2

#attention c'est l'inverse du cote serveur!
TargetCompID=clientID
SenderCompID=serverID
StartTime=00:00:00
EndTime=00:00:00
SocketConnectPort=4242
SocketConnectHost=127.0.0.1
#intervalle en seconde entre 2 messages de heartbeat
HeartBtInt=20

et après?

Et voila vous devriez être capable d’avoir un serveur et un client FIX, il suffit maintenant d’appeler la méthode « sendToTarget(Message message) » de l’objet « Session » (dispo dans les objets Initiator & Acceptor) et le message sera envoyé!

A partir de la vous avez la base pour créer un algo de matching, et développer votre marché :-)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.


un × 3 =

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>