FIX 세션 구성을 위한 협의 및 세션 메시지

2019. 12. 9. 13:04FIX

대외기관과의 FIX 세션을 구성하기 위해서는 사전에 협의해야 할 사항이 몇가지 있다. 다음과 같이 세션을 위한 기본 정보확인이 되었으면, FIX 세션을 구성할 수 있다. 

 

1. Client/Server 역할 정의

주문을 받는 경우에는 Sell Side라고 부르고, 보통 Inbound 주문으로 Server 형태로 구성이 된다. 주문들 발주하는 곳은 Buy Side라고 부르며, 보통 Outbound 주문으로 Client 형태로 FIX가 구성이 된다.

 

2. Heartbeat 주기

보통 30초로 하고, Client에서 로그인시에 설정된 값으로 주기가 결정된다.

 

3. SenderCompID/TargetCompID

Sell side 즉 서버를 담당하는 곳에서 보통 정의를 하는 경우가 많으나, 합의하에 정의할 수 있다. FIX 세션을 구성하는 가장 중요한 정보 중의 하나로 세션별로 유일하게 결정이 된다.

 

4. Sequence reset

Sequence 초기화를 Daily로 할 것인지 Weekly로 할 것인지를 결정하고, 서로의 시간을 확인한다. 초기화는 서버/클라이언트 양쪽이 같은 시간대에 하는 것이 좋다.

 

5. 프로세스 구동시간

구동시간 외에 불필요한 로그인 시도로 인한 에러 로그 발생을 줄이기 위해서 구동시간도 서로 조율하는 것을 권고한다.

 

FIX 세션 메시지

FIX 세션 메시지는 로그인시에 발생하는 로그인 관련 메시지와 시퀀스를 맞추기 위한 메시지, Heartbeat 메시지 등이 있다. 최초 로그인에서부터 로그아웃까지 세션 메시지로 발생할 수 있는 것은 아래와 같다.

- 35=A(Logon) : 로그인

- 35=2(ResendRequest) : 재전송요청

- 35=4(SequenceReset) : 시퀀스재설정

- 35=0(Heartbeat) : 세션 Alive 체크

- 35=1(TestRequest) : 테스트 요청

- 35=3(Reject) : 거부

- 35=5(Logout) : 로그아웃

 

1. Logon(35=A)

로그인 메시지는 FIX가 맨 처음 연결을 시도할 때 발생하는 메시지이다.

 

2. ResendRequest(35=2)

최초 연결시도에는 발생할 일이 거의 없으나, 클라이언트/서버가 서로 초기화 시간이 틀리면 발생할 수도 있다. 보통은 네트웍 장애 등 세션이 단절된 후에 재접속될 때 중간에 유실되었던 메시지를 다시 받기 위해서 요청하는 메시지이다. 로그인이 된 후 서버/클라이언트 양쪽에서 거의 동시에 보낸다. 이 메시지를 받으면 해당 Sequence 부터 메시지를 전송하기 시작한다.

 

3. SequenceReset(35=4)

FIX.5.0 부터는 세션메시지와 비즈메시지가 서로 다른 시퀀스를 사용하는 것으로 변경이 되었으나 전세계적으로 사용되고 있는 FIX.4.*에서는 시퀀스가 하나로 관리된다. 그래서 중간에 있는 세션메시지를 건너 뛰게 하기 위해서 SequenceReset을 사용할 수 있다.

 

4. Heartbeat(35=0)

세션이 정상적인지를 주기적으로 확인하기 위해서 발생하는 메시지이다.

 

5. TestRequest(35=1)

일정 시간 동안 메시지 수신이 안된다거나 테스트를 위해서 발송할 수 있는 메시지이다. 전문은 Heartbeat(35=0)과 동일하지만 TestReqID(Tag.112) 태그가 포함된다. 이 전문을 수신하게 되면 Heartbeat(35=0)으로 응답하게 되며 수신받은 112 태스 및 해당 값을 돌려줘야 한다.

 

6. Reject(35=3)

세션 거부 메시지이다. 특정 시퀀스에 대한 거부이므로 RefSeqNum(Tag.45)에 거부 대상이 되는 시퀀스 번호를 함께 보내게 된다.

 

7. Logoutt(35=A)

로그인을 거부할 때 또는 세션이 종료되었을 때 발생하는 메시지이다. 로그아웃 발생시 동일하게 응답해준다.

 

FIX 세션 복구 시나리오

네트웍 등의 장애로 인해 Sender와 Target간 시퀀스가 틀려질 수 있다. 비정상 종료 후 로그온이 되면 Sender와 Target은 각각 SequenceRequest(35=2)를 보내게 된다. 그러면 해당 메시지를 수신받은 곳에서는 현재의 시퀀스가 아닌 수신받은 시퀀스부터 다시 송신하게 된다. 하지만 재전송되는 메시지에는 세션 메시지(35=0, 35=1, 35=2, 35=A 등)가 포함되어 있을 수 있다. 이때 SequenceReset(35=4) 메시지를 보냄으로서 해당 세션 메시지들을 스킵할 수 있다.

 

기존에 전송이 이미 되어 있는데, 재전송 요청이 들어와서 전송을 할 경우 기존 메시지에 PossDupFlag(43=Y)를 설정하여 보낸다. 이는 기존에 이미 보냈다고 판단되는 데이터를 다시 보내는 것이므로 중복 가능성이 있다는 것을 알려주기 위한 경고성 메시지이다. AP에서는 내부 로직을 통해 해당 메시지가 기 수신된지 판단하고, 처리하면 된다.

 

시퀀스 재전송 요청을 수신했을 때 크게 2가지 다른 케이스가 발생할 수 있다.

 

1. 현재 시퀀스보다 낮은 번호로 재전송 요청이 들어올 경우

  - 현재 시퀀스보다 낮으므로 낮은 시퀀스로 재설정해서 전송하게 된다.

  - 시퀀스 갭(Gap)에 해당하는 데이터 전송시에 PossDupFlag(Tag43)를 Y로 설정하여 보내게 된다.

 

2. 현재 시퀀스보다 높은 번호로 재전송 요청이 들어올 경우

  - 현재 시퀀스보다 높은 것에 대한 요청은 있을 수 없는 상황이므로 비정상 종료한다.