web-dev-qa-db-ja.com

QuickFIX / JでFIXメッセージを送信する方法

セッションを初期化して1つの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();
8
user3756506

上記のコードから、イニシエーターアプリケーション(クライアント)があり、acceptorアプリケーション(サーバー)も作成する必要があることがわかります。以下に、あなたがやりたいことをする2つのクラスを添付しました。

まず、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

構成ファイルは両方ともいくつかのオプションを見逃していますが、テスト目的には十分です。各クラスには、必要なケースをテストするためだけに追加されたmainメソッドがあります。

通常、開始または停止の方法は少し異なります。サーバーアプリケーションはメッセージ/接続をリッスンし、停止することはありませんが、クライアントアプリケーションは最初のメッセージを送信した直後に停止します。

13
Slimu

QuickFIX/Jのインストールに含まれる例、つまりExecutorBanzaiがあります。あなたはそれについて読むことができます ここ

QuickFIXには、いくつかのサンプルアプリケーションが付属しています。これらのアプリケーションは、quickfix/examplesディレクトリにあります。これらは、優れたアプリケーション設計を示すことや、実際の本番システムで使用することを目的としたものではありません。これらは、QuickFIXを使用してアプリケーションを構築する方法に関するチュートリアルとして提供されているにすぎません。

Executorは、非常に単純な注文実行シミュレーターです。指値注文のみをサポートし、常に完全に処理します。

Banzaiは単純な取引クライアントです。エグゼキュータとともに使用して、注文実行の買い側と売り側の両方でQuickFIX/Jを使用する簡単な例を確認できます。

4
TT.