본문 바로가기
카테고리 없음

QuickFIX로 Acceptor 구현하기

by 월백브리핑 2025. 3. 1.

FIX-Simulator와 유사한 기능을 Java로 구현할 수 있습니다. QuickFIX/J 라이브러리를 활용하면 FIX 프로토콜 기반의 시뮬레이터를 개발할 수 있습니다.

 

아래는 Java를 사용하여 FIX Acceptor(서버) 및 FIX Initiator(클라이언트)를 설정하는 방법입니다.

1. Java 기반 FIX-Simulator 구현 개요

FIX 프로토콜을 Java에서 구현하려면 QuickFIX/J를 사용해야 합니다.

구성 요소:

  • Acceptor (서버 역할): 클라이언트의 FIX 메시지를 수신
  • Initiator (클라이언트 역할): 서버에 FIX 메시지를 전송

2. QuickFIX/J 의존성 추가 (Maven 프로젝트 기준)

먼저, Maven 프로젝트에서 QuickFIX/J를 추가해야 합니다.

<dependency>
    <groupId>org.quickfixj</groupId>
    <artifactId>quickfixj-core</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.quickfixj</groupId>
    <artifactId>quickfixj-msg-fix44</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.quickfixj</groupId>
    <artifactId>quickfixj-server</artifactId>
    <version>2.3.0</version>
</dependency>

3. FIX Acceptor(서버) 구현

Acceptor는 FIX 메시지를 수신하는 서버 역할을 합니다.

✅ Acceptor 설정 파일 (acceptor.cfg)

[DEFAULT]
ConnectionType=acceptor
SocketAcceptPort=9877
StartTime=00:00:00
EndTime=23:59:59
FileStorePath=store
LogonTimeout=30
LogoutTimeout=5
UseDataDictionary=Y
DataDictionary=FIX44.xml
HeartBtInt=30

[SESSION]
BeginString=FIX.4.4
SenderCompID=SERVER
TargetCompID=CLIENT
 

✅ Java Acceptor 코드

import quickfix.*;

public class FixAcceptorServer {
    public static void main(String[] args) throws Exception {
        SessionSettings settings = new SessionSettings("acceptor.cfg");
        Application application = new FixApplication();
        MessageStoreFactory storeFactory = new FileStoreFactory(settings);
        LogFactory logFactory = new ScreenLogFactory(settings);
        Acceptor acceptor = new SocketAcceptor(application, storeFactory, settings, logFactory, new DefaultMessageFactory());
        
        acceptor.start();
        System.out.println("FIX Acceptor 서버가 시작되었습니다.");
        
        // 서버를 계속 실행하도록 유지
        Thread.sleep(Long.MAX_VALUE);
        acceptor.stop();
    }
}

4. FIX Initiator(클라이언트) 구현

Initiator는 Acceptor(서버)로 FIX 메시지를 전송하는 역할을 합니다.

✅ Initiator 설정 파일 (initiator.cfg)

[DEFAULT]
ConnectionType=initiator
SocketConnectHost=127.0.0.1
SocketConnectPort=9877
StartTime=00:00:00
EndTime=23:59:59
FileStorePath=store
HeartBtInt=30
LogonTimeout=30
LogoutTimeout=5
UseDataDictionary=Y
DataDictionary=FIX44.xml

[SESSION]
BeginString=FIX.4.4
SenderCompID=CLIENT
TargetCompID=SERVER

✅ Java Initiator 코드

import quickfix.*;

public class FixInitiatorClient {
    public static void main(String[] args) throws Exception {
        SessionSettings settings = new SessionSettings("initiator.cfg");
        Application application = new FixApplication();
        MessageStoreFactory storeFactory = new FileStoreFactory(settings);
        LogFactory logFactory = new ScreenLogFactory(settings);
        Initiator initiator = new SocketInitiator(application, storeFactory, settings, logFactory, new DefaultMessageFactory());

        initiator.start();
        System.out.println("FIX Initiator 클라이언트가 시작되었습니다.");
        
        // 클라이언트를 계속 실행하도록 유지
        Thread.sleep(Long.MAX_VALUE);
        initiator.stop();
    }
}

5. FIX 메시지 송수신 예제

서버와 클라이언트가 실행된 후, Initiator에서 서버로 **주문 메시지(NewOrderSingle)**를 전송할 수 있습니다.

✅ NewOrderSingle 메시지 전송

import quickfix.*;
import quickfix.field.*;
import quickfix.fix44.NewOrderSingle;

public class FixApplication extends MessageCracker implements Application {

    @Override
    public void fromAdmin(Message message, SessionID sessionId) {
        System.out.println("Admin 메시지 수신: " + message);
    }

    @Override
    public void fromApp(Message message, SessionID sessionId) throws FieldNotFound {
        System.out.println("App 메시지 수신: " + message);
    }

    @Override
    public void onCreate(SessionID sessionId) {}

    @Override
    public void onLogon(SessionID sessionId) {
        System.out.println("로그인 완료: " + sessionId);
        sendOrder(sessionId);
    }

    @Override
    public void onLogout(SessionID sessionId) {
        System.out.println("로그아웃: " + sessionId);
    }

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

    @Override
    public void toApp(Message message, SessionID sessionId) {}

    private void sendOrder(SessionID sessionId) {
        try {
            NewOrderSingle order = new NewOrderSingle(
                new ClOrdID("123456"),
                new HandlInst(HandlInst.AUTOMATED_EXECUTION_ORDER_PRIVATE),
                new Symbol("EUR/USD"),
                new Side(Side.BUY),
                new TransactTime(),
                new OrdType(OrdType.MARKET)
            );

            order.set(new OrderQty(100000));
            order.set(new Price(1.1050));

            Session.sendToTarget(order, sessionId);
            System.out.println("주문 전송 완료!");
        } catch (SessionNotFound e) {
            e.printStackTrace();
        }
    }
}

6. 실행 방법

1️⃣ Acceptor (서버) 실행

java FixAcceptorServer

2️⃣ Initiator (클라이언트) 실행

java FixInitiatorClient

3️⃣ 주문 메시지 확인

  • 서버 콘솔에 주문 메시지가 수신됨

7. 정리

  • Java 기반의 FIX-Simulator를 만들려면 QuickFIX/J 라이브러리를 활용
  • Acceptor(서버)와 Initiator(클라이언트) 구성
  • 설정 파일(ini)을 사용하여 연결 정보 및 데이터 딕셔너리 관리
  • NewOrderSingle과 같은 메시지를 주고받으며 테스트 가능

8. 함께 보면 좋은 글

 

 

FIX 프로토콜 테스트 방법

FIX 프로토콜을 테스트하려면 실제 통신이 가능한 서버가 필요합니다. 아래에서 오픈소스 도구, 상용 솔루션, 브로커의 테스트 환경, 자체 서버 구축 등의 다양한 방법을 소개합니다. 목차 FIX-Simu

weolbaek.com

 

 

 

FIX 프로토콜 메시지 구조

목차 1. FIX 메시지 구조 개요 2. FIX 메시지 형식 3. 주요 FIX 태그 4. FIX 메시지 예제 5. FIX 메시지 유효성 검사1. FIX 메시지 구조 개요FIX 프로토콜의 메시지는 태그=값 형식으로 구성됩니다. 각 메시

weolbaek.com