Как отправить сообщение FIX с помощью QuickFIX/J

Мне нужен простой пример того, как инициализировать сеанс и отправить одно сообщение FIX. У меня есть этот исходный код:

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();

person user3756506    schedule 14.03.2016    source источник


Ответы (2)


Из приведенного выше кода я вижу, что у вас есть приложение-инициатор (клиент), и вам также необходимо создать приложение acceptor (сервер). Ниже я прикрепил два класса, которые будут делать то, что вы хотите.

Сначала я перечислю приложение acceptor:

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();
    }
}

Это серверное приложение, которое будет продолжать работать и прослушивать сообщения от клиентов, которые к нему подключаются. Вот используемый им файл конфигурации (acceptor.properties):

[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

Далее идет код клиентского приложения. Он пытается подключиться к серверу и после этого отправляет ему сообщение:

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);
    }
}

Конфигурационный файл для него (initiator.config) почти такой же, как и для акцептора:

[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

В обоих файлах конфигурации отсутствуют некоторые параметры, но для целей тестирования их достаточно. В каждом из классов есть основной метод, добавленный только для тестирования нужного вам случая.

Обычно вы бы немного по-другому справились с тем, как они запускаются или останавливаются. Серверное приложение прослушивает сообщения/соединения и никогда не останавливается, в то время как клиентское приложение останавливается сразу после отправки первого сообщения.

person Slimu    schedule 14.03.2016

В установку QuickFIX/J включены примеры, а именно Executor и Banzai. Вы можете прочитать об этом здесь.

QuickFIX поставляется с несколькими примерами приложений. Эти приложения находятся в каталоге quickfix/examples. Они не предназначены для демонстрации хорошего дизайна приложения или для использования в реальной производственной системе. Они просто предоставлены в качестве руководства по созданию приложения с помощью QuickFIX.

Executor — очень простой симулятор исполнения ордеров. Он поддерживает только лимитные ордера и всегда исполняет их полностью.

Banzai — простой торговый клиент. Его можно использовать с Исполнителем, чтобы увидеть простой пример использования QuickFIX/J как на стороне покупки, так и на стороне продажи исполнения ордера.

person TT.    schedule 14.03.2016