FIX 프로토콜이란 무엇을까

2019. 12. 9. 10:18FIX

FIX(Financial Information eXchange) 프로토콜은 트레이딩 관련 메시지의 전자 통신을 위해 정의한 일련의 메시지 스펙(Specification)으로 국제표준이다. 세계 각국의 은행, 브로커, 거래소, 산업시설/협회, 기관 투자자 및 IT업체의 협력을 통해 개발되었다.

 

FIX가 표준 프로토콜로써 사용된 데에는 다양한 이유가 있을 것이다. 구조체 스타일의 정형화된 데이터 보다 유연성이 생겼다. 유연성을 위해서 태그/값(Tag/Value)와 같은 메시지 데이터를 사용한다. JSON 처럼 태그 이름 지정에 완전한 자유도를 부여하는 대신 숫자로 한정되고, 기 정의된 태그들도 다수 존재한다. 물론 사용자 정의 태그영역도 있다. 태그의 추가로 인해 데이터내에서는 부가정보가 들어간다고 볼 수 있다. 하지만 구조체에서도 공백이 들어가기 때문에 데이터 압축의 효율성 면에서 불리하다고 할 수도 없다. 오히려 구조체에 비해서 길이가 훨씬 짧아질 수 있다. 가변길이 방식이기 때문이다.

 

FIX는 표준화되었기 때문에 프로토콜에 대한 이해가 쉽고, 개발시 전문에 대한 오해의 소지가 적다. 한번 전문을 정의해 놓고, 다양한 곳에 사용하기를 원하는 글로벌 사업자들에게는 최적의 대안이 될 수 있다. 주로 주문 목적을 위해 많이 사용하지만 시세 송신에도 사용될 수 있다. 시세의 경우 Fast FIX를 통해 전문을 압축하여 데이터 용량을 줄이고, UDP 형태로 사용하기도 한다.

 

가변길이 형태이므로 전문을 파싱하는데 시간이 걸릴 수 있다. JSON 처럼 자유로운 형태의 태그도 아니므로 사용범위의 한계도 있을 수 있다. 하지만 글로벌 거래소 및 브로커, 기관에서 대부분 FIX 형태의 전문을 사용하고 있으며, 한국거래소도 FIX전문 형태로 변경 계획을 세웠지만 국내 사정을 고려해 기존과 같은 구조체 방식으로 차세대(eXture+)를 진행한 적이 있다.

 

표준 프로토콜이라 실제 브로커와의 주문 송수신시 미사용하는 필드들이 존재할 수 있다. 브로커에서 제공한 매뉴얼에 사용/미사용 태그(Tag), 정의/미정의 된 값(Value)이 잘 명시되어 있으면 않으면, 실제 트랜젝션에서 발생할 수 있는 값인지 아닌지 확인하기가 쉽지 않은 경우가 있다. 글로벌 브로커 또는 FCM들이 전문을 정의할 때 사용 가능 태그, 가능한 값에 대한 정의를 보다 명확히 해 주길 기대해도 된다. 그렇지 않은 경우에는 표준 프로토콜에 기반하여 좀 더 다양한 가능성을 고려하여 코딩을 하는 것이 좋다.

 

메시지 기본 규칙

메시지는 태그(tag)와 값(value)으로 구성된 필드(field)들의 집합체라고 볼 수 있다. 태그와 값 사이는 '='로 구분하여, 필드들 사이는 SOH(Start of heading, ^A, 0x01)로 구분한다. SOH는 ASCII 테이블에서 특수문자 영역에 포함되므로, c 코딩을 하는 경우에는 "\001"을 사용하거나, Ctrl+V+A형태로 특수문자를 직접 vi 편집기에 입력해서 개발할 수도 있다.

 

시작태그는 반드시 8(BeginString)로 시작되어야 하고, 두번째 태그는 항상 9(BodyLength)로 하며, 길이 계산시에는 시작필드(9), 체크섬(10), 길이(9) 필드를 제외한 전체 바이트수이다.

 

세번째 태그는 항상 35(MsgType)으로 전문의 특성을 나타내는 중요할 필드인다. 이 태그는 FIX에서 가장 중요한 태그 중에 하나이므로 나중에 자세하게 다루기로 한다.

마지막 태그는 반드시 10(CheckSum)으로 끝나야 한다. 체크섬은 일정한 규칙에 의해 계산된 값으로, 보통 FIX 엔진에서 계산하므로 AP 유저들은 고민할 필요는 없다. 체크섬 계산함수 확인을 위해서는 다음 링크를 참고하면 좋을 것 같다.

 

Fix checksum

 

메시지 구성

메시지는 Header + Body + Trailer

 

StandardHeader

 - 시작 태그 : 8(BeginString)
 - 두번째 태그 : 9(BodyLength), 시작필드(TAG8,9) 및 체크섬(10) 필드를 제외한 바이트 수
 - 세번째 태그 : 35(MsgType)
 - 필수 태그 : 49(SenderCompID), 56(TargetCompID), 34(MsgSeqNo), 52(SendingTime)

 

StandardTrailer

 - 마지막 태그는 반드시 10(CheckSum)으로 끝나야 한다.

 - 10번 태그 다음은 SOH로 끝나야 한다.

 - CheckSum은 FIX 메시지 각 문자의 아스키코드 값을 더한 후 256으로 나눈 나머지 값을 사용한다.
  (10번 필드를 제외한 모든 필드 아스키코드값의 합, 8번 태그부터 10번 태그 이전 SOH까지)

 - CheckSum은 항상 3자리수를 사용해야 함(예 : 82 -> 082)

 - CheckSum은 암호화하면 안됨(always unencrypted)


메시지 예제 (Heartbeat)

8=FIX.4.2^A9=58^A35=0^A49=ACOMPID^A56=BCOMPID^A34=39^A52=20101008-02:30:42.144^A10=218^A

 

MsgID Ranges

 - 1~999 for FIX messages, formally specified in the spec.
 - 1000~1999 for FIX components, formally specified in the spec.
 - 2000~2999 for implicit components, specified in the FIXML Schema creation process.