2016-03-14 15 views
6

Ich brauche ein einfaches Beispiel für das Initialisieren einer Sitzung und senden Sie eine FIX-Nachricht. Ich habe diesen Anfangscode:So senden Sie FIX-Nachricht mit QuickFIX/J

SessionSettings settings = new SessionSettings(new FileInputStream("fix.cfg")); 

Application application = new Application(settings); 
MessageStoreFactory messageStoreFactory = new FileStoreFactory(settings); 
LogFactory logFactory = new ScreenLogFactory(true, true, true); 
MessageFactory messageFactory = new DefaultMessageFactory(); 

Initiator initiator = new SocketInitiator(application, messageStoreFactory, settings, logFactory, messageFactory); 
initiator.start(); 

Antwort

8

Aus dem obigen Code sehe ich, dass Sie eine Initiator-Anwendung (der Client) haben und Sie müssen auch eine acceptor Anwendung (den Server) erstellen. Ich habe die zwei Klassen angehängt, die tun werden, was du willst.

Zunächst werde ich Liste die acceptor Anwendung:

public class ServerApplication implements Application { 

@Override 
public void onCreate(SessionID sessionID) { 
} 

@Override 
public void onLogon(SessionID sessionID) { 
} 

@Override 
public void onLogout(SessionID sessionID) { 
} 

@Override 
public void toAdmin(Message message, SessionID sessionID) { 
} 

@Override 
public void fromAdmin(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon { 
} 

@Override 
public void toApp(Message message, SessionID sessionID) throws DoNotSend { 
} 

@Override 
public void fromApp(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType { 
    System.out.println("FromApp: " + message); 
} 

public static void main(String[] args) throws ConfigError, FileNotFoundException, InterruptedException, SessionNotFound { 
    SessionSettings settings = new SessionSettings("res/acceptor.config"); 

    Application application = new ServerApplication(); 
    MessageStoreFactory messageStoreFactory = new FileStoreFactory(settings); 
    LogFactory logFactory = new ScreenLogFactory(true, true, true); 
    MessageFactory messageFactory = new DefaultMessageFactory(); 

    Acceptor initiator = new SocketAcceptor(application, messageStoreFactory, settings, logFactory, messageFactory); 
    initiator.start(); 

    CountDownLatch latch = new CountDownLatch(1); 
    latch.await(); 
} 

}

Dies ist eine Server-Anwendung, die gestartet werden bleiben und für Nachrichten von den Kunden hören, die sich mit ihm verbinden. Hier ist die Konfigurationsdatei (acceptor.properties) verwendet, indem es:

[default] 
ApplicationID=server 
FileStorePath=storage/messages/ 
ConnectionType=acceptor 
StartTime=00:01:00 Europe/Bucharest 
EndTime=23:59:00 Europe/Bucharest 
HeartBtInt=30 
UseDataDictionary=Y 
DataDictionary=FIX42.xml 
ValidateUserDefinedFields=N 
ValidateIncomingMessage=N 
RefreshOnLogon=Y 

[session] 
BeginString=FIX.4.2 
SocketAcceptPort=9877 
SenderCompID=server 
TargetCompID=client 
AcceptorTemplate=N 
lockquote 

Als nächstes, wenn der Client-Anwendungscode. Es wird versucht, auf einen Server zu verbinden und danach wird es eine Nachricht an sie senden:

public class ClientApplication implements Application { 

private static volatile SessionID sessionID; 

@Override 
public void onCreate(SessionID sessionID) { 
    System.out.println("OnCreate"); 
} 

@Override 
public void onLogon(SessionID sessionID) { 
    System.out.println("OnLogon"); 
    ClientApplication.sessionID = sessionID; 
} 

@Override 
public void onLogout(SessionID sessionID) { 
    System.out.println("OnLogout"); 
    ClientApplication.sessionID = null; 
} 

@Override 
public void toAdmin(Message message, SessionID sessionID) { 
    System.out.println("ToAdmin"); 
} 

@Override 
public void fromAdmin(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon { 
    System.out.println("FromAdmin"); 
} 

@Override 
public void toApp(Message message, SessionID sessionID) throws DoNotSend { 
    System.out.println("ToApp: " + message); 
} 

@Override 
public void fromApp(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType { 
    System.out.println("FromApp"); 
} 

public static void main(String[] args) throws ConfigError, FileNotFoundException, InterruptedException, SessionNotFound { 
    SessionSettings settings = new SessionSettings("res/initiator.config"); 

    Application application = new ClientApplication(); 
    MessageStoreFactory messageStoreFactory = new FileStoreFactory(settings); 
    LogFactory logFactory = new ScreenLogFactory(true, true, true); 
    MessageFactory messageFactory = new DefaultMessageFactory(); 

    Initiator initiator = new SocketInitiator(application, messageStoreFactory, settings, logFactory, messageFactory); 
    initiator.start(); 

    while (sessionID == null) { 
     Thread.sleep(1000); 
    } 

    final String orderId = "342"; 
    NewOrderSingle newOrder = new NewOrderSingle(new ClOrdID(orderId), new HandlInst('1'), new Symbol("6758.T"), 
      new Side(Side.BUY), new TransactTime(new Date()), new OrdType(OrdType.MARKET)); 
    Session.sendToTarget(newOrder, sessionID); 
    Thread.sleep(5000); 
} 

}

Die Konfigurationsdatei für sie (initiator.config) ist fast die gleiche wie die für die verwendete Akzeptor:

[default] 
ApplicationID=client 
FileStorePath=storage/messages/ 
ConnectionType=initiator 
StartTime=00:01:00 Europe/Bucharest 
EndTime=23:59:00 Europe/Bucharest 
HeartBtInt=30 
UseDataDictionary=Y 
DataDictionary=FIX42.xml 
ValidateUserDefinedFields=N 
ValidateIncomingMessage=N 
RefreshOnLogon=Y 

[session] 
BeginString=FIX.4.2 
SocketConnectHost=localhost 
SocketConnectPort=9877 
SenderCompID=client 
TargetCompID=server 

Die Konfigurationsdateien beide verpassen einige Optionen, aber zu Testzwecken sind genug. Jede der Klassen verfügt über eine Hauptmethode, die nur zum Testen des gewünschten Falls hinzugefügt wurde. Normalerweise würden Sie ein bisschen anders handhaben, wie sie gestartet oder gestoppt werden. Die Server-Anwendung wartet auf Nachrichten/Verbindungen und wird nie gestoppt, während die Client-Anwendung direkt nach dem Senden der ersten Nachricht anhält.

+0

Tnx Sie !!!!!!!!!! – user3756506

3

Es gibt Beispiele, bei der Installation von QuickFIX/J enthalten ist, nämlich Executor und Banzai. Sie können darüber lesen here.

QuickFIX wird mit einigen Beispielanwendungen geliefert. Diese Anwendung finden Sie im Verzeichnis quickfix/examples. Sie sind nicht dazu gedacht, ein gutes Anwendungsdesign zu demonstrieren oder in einem realen Produktionssystem verwendet zu werden. Sie werden lediglich als Tutorial zum Erstellen einer Anwendung mit QuickFIX bereitgestellt.

Executor ist eine sehr einfache Orderausführung Simulator. Es unterstützt nur Limitaufträge und füllt diese immer vollständig aus.

Banzai ist ein einfacher Handelsclient. Es kann mit dem Executor verwendet werden, um ein einfaches Beispiel für die Verwendung von QuickFIX/J auf der Kauf- und Verkaufsseite einer Orderausführung zu sehen.