FIX implementor's question: version differences?

Imported from previous forum

Hi,
I’m fairly new to FIX. I’ve used APIs which hide much of the protocol, but haven’t done much with the wire level protocol itself.

Mainly as a learning exercise, I’d like to implement a simple FIX engine (although I know QuickFix/J is available as a free and production level engine).

I’ve printed out the 4.2 spec, but am overwhelmed at the idea of going through all the version.

Are there any documents which simply list the differences between the versions?

Am I basically correct in assuming that the session level protocol is the same for all versions and that the changes are limited to application level messages?

I’m a little confused about the relationship between version 5 and the FAST protocol. Does 5 use FAST or is FAST simply a session level protocol and all versions (the application level parts) can be made to sit on top of FAST?

Thanks

Check the release notes / appendix of the specs to see differences between versions. In FIX repository, there is a “TOOLS AND SAMPLES” described as “Compare FIX Messages between versions (Sample Application.zip, 14KB) A simple XSLT that compares the Tags that make up each message in FIX to the Tags that make up the same message in another version. The results are displayed as a basic HTML document”. This XSLT tool is available at

http://fixprotocol.org/documents/874/Sample%20Application.zip

(You need to be logged in to access the above zip. )

There are substantial differences in Session between FIX.4.0 / 4.1 / 4.2 after which the next change in Session is at FIXT.1.1. FIX.5.0 onwards use FIXT.1.1

FAST is a multicast session protocol for market data. Work is underway to compress any XML / FIXML data over a FAST Session but FAST is not being used for Order / Execution workflows.

You are right that implementating a FIX engine from scratch will teach you a lot about the “wire level protocol”. Best of luck in your learning. What technology do you want to use for coding ?

Hi, I’m fairly new to FIX. I’ve used APIs which hide much of the
protocol, but haven’t done much with the wire level protocol itself.

Mainly as a learning exercise, I’d like to implement a simple FIX
engine (although I know QuickFix/J is available as a free and
production level engine).

I’ve printed out the 4.2 spec, but am overwhelmed at the idea of going
through all the version.

Are there any documents which simply list the differences between
the versions?

Am I basically correct in assuming that the session level protocol is
the same for all versions and that the changes are limited to
application level messages?

I’m a little confused about the relationship between version 5 and the
FAST protocol. Does 5 use FAST or is FAST simply a session level
protocol and all versions (the application level parts) can be made to
sit on top of FAST?

Thanks

Thanks Mahesh,

For the first iteration, I’ll use Java and a networking framework other than MINA (just to force my self to do something different from QFJ). Frankly this is as much an exercise in learning FIX as it is in software engineering.

Check the release notes / appendix of the specs to see differences
between versions. In FIX repository, there is a “TOOLS AND SAMPLES”
described as “Compare FIX Messages between versions (Sample
Application.zip, 14KB) A simple XSLT that compares the Tags that make up
each message in FIX to the Tags that make up the same message in another
version. The results are displayed as a basic HTML document”. This XSLT
tool is available at

http://fixprotocol.org/documents/874/Sample%20Application.zip

(You need to be logged in to access the above zip. )

There are substantial differences in Session between FIX.4.0 / 4.1 / 4.2
after which the next change in Session is at FIXT.1.1. FIX.5.0 onwards
use FIXT.1.1

FAST is a multicast session protocol for market data. Work is underway
to compress any XML / FIXML data over a FAST Session but FAST is not
being used for Order / Execution workflows.

You are right that implementating a FIX engine from scratch will teach
you a lot about the “wire level protocol”. Best of luck in your
learning. What technology do you want to use for coding ?

Hi, I’m fairly new to FIX. I’ve used APIs which hide much of the
protocol, but haven’t done much with the wire level protocol itself.

Mainly as a learning exercise, I’d like to implement a simple FIX
engine (although I know QuickFix/J is available as a free and
production level engine).

I’ve printed out the 4.2 spec, but am overwhelmed at the idea of going
through all the version.

Are there any documents which simply list the differences between the
versions?

Am I basically correct in assuming that the session level protocol is
the same for all versions and that the changes are limited to
application level messages?

I’m a little confused about the relationship between version 5 and the
FAST protocol. Does 5 use FAST or is FAST simply a session level
protocol and all versions (the application level parts) can be made to
sit on top of FAST?

Thanks

Are you planning to develop FIX Session initiator (client) or FIX Session acceptor (server)? If your goal of developing a FIX Engine is learning, then I would suggest you develop both - client and server, that way you would see both sides of the coin.

You can use TCP Sockets for FIX connectivity.

Thanks Mahesh,

For the first iteration, I’ll use Java and a networking framework other
than MINA (just to force my self to do something different from QFJ).
Frankly this is as much an exercise in learning FIX as it is in software
engineering.

Check the release notes / appendix of the specs to see differences
between versions. In FIX repository, there is a “TOOLS AND SAMPLES”
described as “Compare FIX Messages between versions (Sample
Application.zip, 14KB) A simple XSLT that compares the Tags that make
up each message in FIX to the Tags that make up the same message in
another version. The results are displayed as a basic HTML document”.
This XSLT tool is available at

http://fixprotocol.org/documents/874/Sample%20Application.zip

(You need to be logged in to access the above zip. )

There are substantial differences in Session between FIX.4.0 / 4.1 /
4.2 after which the next change in Session is at FIXT.1.1. FIX.5.0
onwards use FIXT.1.1

FAST is a multicast session protocol for market data. Work is underway
to compress any XML / FIXML data over a FAST Session but FAST is not
being used for Order / Execution workflows.

You are right that implementating a FIX engine from scratch will teach
you a lot about the “wire level protocol”. Best of luck in your
learning. What technology do you want to use for coding ?

Hi, I’m fairly new to FIX. I’ve used APIs which hide much of the
protocol, but haven’t done much with the wire level protocol itself.

Mainly as a learning exercise, I’d like to implement a simple FIX
engine (although I know QuickFix/J is available as a free and
production level engine).

I’ve printed out the 4.2 spec, but am overwhelmed at the idea of
going through all the version.

Are there any documents which simply list the differences between
the versions?

Am I basically correct in assuming that the session level protocol
is the same for all versions and that the changes are limited to
application level messages?

I’m a little confused about the relationship between version 5 and
the FAST protocol. Does 5 use FAST or is FAST simply a session level
protocol and all versions (the application level parts) can be made
to sit on top of FAST?

Thanks

My intention is to do both, initiator and acceptor. I have some networking code working as well.

I’d like to get back to difference in versions again. You mention that various versions are quite different, even at the session level. My assumption that the number and type of tags might change, but the underlying logic is the same. For example,(Acceptor) waits for logon message, check checksum, deal with testrequests or resend requests, etc.

Am I wrong in assuming that the underlying protocol (sequence numbers, message flow/semantics) remains the same, but different version add/remove messages and add/remove/modify fields?

I had a little trouble figuring out how to use the xmls in the zip file you provided.

Are you planning to develop FIX Session initiator (client) or FIX
Session acceptor (server)? If your goal of developing a FIX Engine is
learning, then I would suggest you develop both - client and server,
that way you would see both sides of the coin.

You can use TCP Sockets for FIX connectivity.

Thanks Mahesh,

For the first iteration, I’ll use Java and a networking framework
other than MINA (just to force my self to do something different from
QFJ). Frankly this is as much an exercise in learning FIX as it is in
software engineering.

Check the release notes / appendix of the specs to see differences
between versions. In FIX repository, there is a “TOOLS AND SAMPLES”
described as “Compare FIX Messages between versions (Sample
Application.zip, 14KB) A simple XSLT that compares the Tags that
make up each message in FIX to the Tags that make up the same
message in another version. The results are displayed as a basic
HTML document”. This XSLT tool is available at

http://fixprotocol.org/documents/874/Sample%20Application.zip

(You need to be logged in to access the above zip. )

There are substantial differences in Session between FIX.4.0 / 4.1 /
4.2 after which the next change in Session is at FIXT.1.1. FIX.5.0
onwards use FIXT.1.1

FAST is a multicast session protocol for market data. Work is
underway to compress any XML / FIXML data over a FAST Session but
FAST is not being used for Order / Execution workflows.

You are right that implementating a FIX engine from scratch will
teach you a lot about the “wire level protocol”. Best of luck in
your learning. What technology do you want to use for coding ?

Hi, I’m fairly new to FIX. I’ve used APIs which hide much of the
protocol, but haven’t done much with the wire level protocol
itself.

Mainly as a learning exercise, I’d like to implement a simple FIX
engine (although I know QuickFix/J is available as a free and
production level engine).

I’ve printed out the 4.2 spec, but am overwhelmed at the idea of
going through all the version.

Are there any documents which simply list the differences between
the versions?

Am I basically correct in assuming that the session level protocol
is the same for all versions and that the changes are limited to
application level messages?

I’m a little confused about the relationship between version 5 and
the FAST protocol. Does 5 use FAST or is FAST simply a session
level protocol and all versions (the application level parts) can
be made to sit on top of FAST?

Thanks

You are right, the underlying logic of Logon request, Logon response, TestRequest, Heartbeat, is same. Some tags / values are different between FIX.4.0 / 4.1 / 4.2 and FIXT.1.1 introduces new structure because of transport indenpendence.

You will discover many interesting things writing both the initiator and acceptor. A lot of code is common between these.

Were you able to use the zip file to know differences between messages in different versions ?

My intention is to do both, initiator and acceptor. I have some
networking code working as well.

I’d like to get back to difference in versions again. You mention that
various versions are quite different, even at the session level. My
assumption that the number and type of tags might change, but the
underlying logic is the same. For example,(Acceptor) waits for logon
message, check checksum, deal with testrequests or resend requests, etc.

Am I wrong in assuming that the underlying protocol (sequence numbers,
message flow/semantics) remains the same, but different version
add/remove messages and add/remove/modify fields?

I had a little trouble figuring out how to use the xmls in the zip file
you provided.

Hi, I’m fairly new to FIX. I’ve used APIs which hide much of the
protocol, but haven’t done much with the wire level protocol itself.

Mainly as a learning exercise, I’d like to implement a simple FIX
engine (although I know QuickFix/J is available as a free and
production level engine).

I’ve printed out the 4.2 spec, but am overwhelmed at the idea of going
through all the version.

Are there any documents which simply list the differences between
the versions?

Am I basically correct in assuming that the session level protocol is
the same for all versions and that the changes are limited to
application level messages?

I’m a little confused about the relationship between version 5 and the
FAST protocol. Does 5 use FAST or is FAST simply a session level
protocol and all versions (the application level parts) can be made to
sit on top of FAST?

Thanks

Hi Shahbaz,

You’re doing the right thing - there’s nothing wrong with simply starting with one of the more popular versions of FIX, such as 4.2, and staying with that for a while as you learn more about message processing and so on. In fact, if you’re just in learning mode, I might suggest you jump right in to FIX 5.0; if you are writing programs and generating source code that you may want to use again later on, you’ll find that it’s a lot easier to retrofit 5.0 code for 4.x versions than it is the other way around…

Regards,

Russ

Great advice! I never thought of reading up on 5.0 first. Looks like there are a couple of service packs of 5.0. Should I go straight to 5.0 SP2?

Hi, I’m fairly new to FIX. I’ve used APIs which hide much of the
protocol, but haven’t done much with the wire level protocol itself.

Mainly as a learning exercise, I’d like to implement a simple FIX
engine (although I know QuickFix/J is available as a free and
production level engine).

I’ve printed out the 4.2 spec, but am overwhelmed at the idea of going
through all the version.

Are there any documents which simply list the differences between the
versions?

Am I basically correct in assuming that the session level protocol is
the same for all versions and that the changes are limited to
application level messages?

I’m a little confused about the relationship between version 5 and the
FAST protocol. Does 5 use FAST or is FAST simply a session level
protocol and all versions (the application level parts) can be made to
sit on top of FAST?

Thanks

Hi Shahbaz,

You’re doing the right thing - there’s nothing wrong with simply
starting with one of the more popular versions of FIX, such as 4.2, and
staying with that for a while as you learn more about message processing
and so on. In fact, if you’re just in learning mode, I might suggest you
jump right in to FIX 5.0; if you are writing programs and generating
source code that you may want to use again later on, you’ll find that
it’s a lot easier to retrofit 5.0 code for 4.x versions than it is the
other way around…

Regards,

Russ

Great advice! I never thought of reading up on 5.0 first. Looks
like there are a couple of service packs of 5.0. Should I go
straight to 5.0 SP2?

Hi Shahbaz,

Sure, there’s nothing wrong with doing that. Also, you might want to start out by building a simple application that uses something like QuickFix just to send an order or something like that. Then you can use that little application as the testing app for your own code as you start down the road of writing your own lightweight engine.

I am not sure if starting with FIX.5.0 is the right idea because FIX.5.0 runs on top of FIXT.1.1 which would require you to implement “Transport Independence” i.e. multiple FIX application versions in a single session whereas FIX.4.0 upto 4.4 do not have this advanced concept. So a FIX.4.0 engine would be much simpler than a FIXT.1.1 engine. FIX.4.0 specs is a single document of 87 pages whereas FIX.5.0 specs is 7 volumes + one document of FIXT.1.1

Personally, I would say implement a FIX.4.0 engine, enhance it for 4.1 (able to handle FIX.4.0 or FIX.4.1 session based on config) and keep going upwards towards FIXT.1.1. You are more interested to “learn” rather than produce the latest commercial FIX engine to put in the market. If you go “up” from FIX.4.0 you will get the oppurtunity to learn the development of FIXProtocol in incremental stages. Even now much of trading happens on FIX.4.2, older versions are not “dead”

Great advice! I never thought of reading up on 5.0 first. Looks like
there are a couple of service packs of 5.0. Should I go straight to
5.0 SP2?

Hi Shahbaz,

Sure, there’s nothing wrong with doing that. Also, you might want to
start out by building a simple application that uses something like
QuickFix just to send an order or something like that. Then you can use
that little application as the testing app for your own code as you
start down the road of writing your own lightweight engine.

[ original email was from Ryan Pierce (FPL Technical Director) - ryan.pierce@fixprotocol.org ]
> I am not sure if starting with FIX.5.0 is the right idea because FIX.5.0

runs on top of FIXT.1.1 which would require you to implement “Transport
Independence” i.e. multiple FIX application versions in a single session
whereas FIX.4.0 upto 4.4 do not have this advanced concept. So a FIX.4.0
engine would be much simpler than a FIXT.1.1 engine. FIX.4.0 specs is a
single document of 87 pages whereas FIX.5.0 specs is 7 volumes + one
document of FIXT.1.1

Mahesh is correct in that all of the FIX 5.0 versions run on top of FIXT.1.1. And he is correct that Transport Independence is included in FIXT.1.1.

However, I strongly disagree with Mahesh’s assertion that one must support Transport Independence to support FIXT.1.1.

First, I need to draw a distinction in terms. I think he is referring to Application Version Independence, which often gets bundled under Transport Independence, and it is helpful to consider them separately.

Transport Independence is the de-coupling of the FIX session and application layer. It allows a person to send a FIX message over a non-FIX transport, like Tibco, MQSeries, Web Services, etc. But the issue at hand here is building a FIX engine, so this isn’t relevant.

FIXT.1.1 also supports Application Version Independence, which means allowing a FIX session to run multiple versions of FIX application messages over the same FIX session.

Just because FIXT.1.1 supports Application Version Independence doesn’t mean your FIX engine must support it! The vast majority of people use a FIX session for one version only. Provided you don’t want to support Application Version Independence, the differences between the FIX 4.4 session and FIXT.1.1 are trivial. FIXT.1.1 uses a different BeginString. The Logon message adds a required tag called DefaultApplVerID. That is where you specify the FIX version of application messages. I believe FIXT.1.1 also specifies the order of certain header fields. But that’s about it. A good programmer with a FIX engine supporting the 4.4 session who is familiar with its source code can probably modify it to support FIXT.1.1 (without Transport Independence) in a couple hours of coding.

Again, I must strongly reiterate: FIX 5.0 is not difficult to implement! FIXT.1.1 (provided you don’t need Application Version Independence) is not difficult to implement!

FIX 5.0, 5.0SP1 and 5.0SP2 all use the same session: FIXT.1.1. The only thing that really changes at the session layer is that we have to add a new enumeration to DefaultApplVerID with each new service pack release. An engine that supports 5.0 can trivially support 5.0SP1 and 5.0SP2. The differences lie at the application level, not the session.

If the engine validates application-level fields (and not all do, nor need to), that can be accomplished via the Repository, which is an XML machine-readable representation of the protocol, provided by FPL. So supporting validation for a new Service Pack means importing a new Repository.

Mahesh’s assertion of complexity by comparing 87 pages to 8 volumes is like comparing apples to oranges. Almost all of the enhancements made to FIX since 4.0, which account for the vast increase in page count, are at the application level, not the session level. The session level has largely remained unchanged over the past 12 years. Other than the changes to FIXT.1.1, I need to point out that FIX 4.0 and 4.1 used EndSeqNo=999999 in Resend Requests to denote infinity (effectively preventing a FIX session from handling more than a million messages a day), while FIX 4.2 onward use EndSeqNo=0 and eliminate the restriction.

Writing a FIX engine is a good challenge. It becomes much more difficult if one needs to make it ready for production use, which usually requires fault tolerance as well as a lot of performance tuning. But differences between FIX versions themselves are, to an engine, negligible by comparison. I suspect the decision to support one FIX version vs. all of them is going to be negligible in terms of engine development time.

Thanks Ryan for clarifying, I meant only Application Version Independence and I was refering only to a TCP FIX engine.

I agree that if there is a fully running FIX.4.4 engine, its easy to modify it to support FIXT.1.1 without support for Application version independence. While running a FIXT.1.1 session how can I choose to not implement Application version independence ? Have bilateral agreement with counterparties by saying my FIXT.1.1 session would not support ApplVerID(1128), CstmApplVerID(1129), RefApplVerID(1130), RefCstmApplVerID(1131) and DefaultCstmApplVerID(1408), also accept DefaultApplVerID(1137) in the Logon message with the only Application version that shall be supported?

I have come across many FIX learners and most of them found the ascend from FIX.4.0 upwards easier than starting with FIX.5.0 since FIX.4.0 is Equities centric (http://www.fixprotocol.org/functionality) with practically no support for other asset classes. A FIX engine can do stateless validation using the Repository. Am I right in stating the action that needs to be taken on receipt of a particular message has to be coded in the application and cannot be derived from repository? For example if a valid New Order single is received, whether to reject it or ack it followed by multiple partial fills to fully fill it or send a full fill or ack it and no fills till TimeInForce expiry etc has to be in the application code and depends on state of market?

For developers starting their journey into the FIX world, its easier to deal with the relatively smaller number of application messages and tags. If a number of pages comparision between FIX versions is incorrect, would a comparision of number of messages and/or tags be more appropriate?

Since Shahbaz stated he is fairly new to FIX wire level protocol and wanted to implement a “simple” FIX engine as a learning excercise, I suggested that he start with FIX.4.0. A beginner in Java would start with a HelloWorld.java (print a String to console), then keep going up in complexity, a beginner would not start as his first program a Sun Certified Java Developer level client-server application ( Hardware | Oracle ). When I started writing my first TCP FIX engine (like Shahbaz I wrote both the FIX Client and FIX Server) taking the TCP Sockets client server example given in the Sun Java tutorial at Lesson: All About Sockets (The Java™ Tutorials > Custom Networking), the Server would start listening on a predefined port and the client would open a TCP socket connection to this port and send the String 8=FIX.4.0^, the Server would accept the inbound socket and if the String it receives is 8=FIX..^ the server will start a new Thread and this Thread will write back the same String to client else the Server would close the socket. Then this program kept going up in incremental steps towards full production grade FIX test Broker ( Yahoo | Mail, Weather, Search, Politics, News, Finance, Sports & Videos ) which is used for QA testing real FIX trading applications (LatentZero Minerva+Cameron, CRD+Cameron, XIP+MET).

Shahbaz, I am not trying to sell you some old rotten stuff which stinks, btw “Money stinks”. I am just showing you the path which I followed.

I am not sure if starting with FIX.5.0 is the right idea because
FIX.5.0 runs on top of FIXT.1.1 which would require you to implement
“Transport Independence” i.e. multiple FIX application versions in a
single session whereas FIX.4.0 upto 4.4 do not have this advanced
concept. So a FIX.4.0 engine would be much simpler than a FIXT.1.1
engine. FIX.4.0 specs is a single document of 87 pages whereas FIX.5.0
specs is 7 volumes + one document of FIXT.1.1

Mahesh is correct in that all of the FIX 5.0 versions run on top of
FIXT.1.1. And he is correct that Transport Independence is included
in FIXT.1.1.

However, I strongly disagree with Mahesh’s assertion that one must
support Transport Independence to support FIXT.1.1.

First, I need to draw a distinction in terms. I think he is referring to
Application Version Independence, which often gets bundled under
Transport Independence, and it is helpful to consider them separately.

Transport Independence is the de-coupling of the FIX session and
application layer. It allows a person to send a FIX message over a non-
FIX transport, like Tibco, MQSeries, Web Services, etc. But the issue at
hand here is building a FIX engine, so this isn’t relevant.

FIXT.1.1 also supports Application Version Independence, which means
allowing a FIX session to run multiple versions of FIX application
messages over the same FIX session.

Just because FIXT.1.1 supports Application Version Independence doesn’t
mean your FIX engine must support it! The vast majority of people use a
FIX session for one version only. Provided you don’t want to support
Application Version Independence, the differences between the FIX 4.4
session and FIXT.1.1 are trivial. FIXT.1.1 uses a different BeginString.
The Logon message adds a required tag called DefaultApplVerID. That is
where you specify the FIX version of application messages. I believe
FIXT.1.1 also specifies the order of certain header fields. But that’s
about it. A good programmer with a FIX engine supporting the 4.4 session
who is familiar with its source code can probably modify it to support
FIXT.1.1 (without Transport Independence) in a couple hours of coding.

Again, I must strongly reiterate: FIX 5.0 is not difficult to implement!
FIXT.1.1 (provided you don’t need Application Version Independence) is
not difficult to implement!

FIX 5.0, 5.0SP1 and 5.0SP2 all use the same session: FIXT.1.1. The only
thing that really changes at the session layer is that we have to add a
new enumeration to DefaultApplVerID with each new service pack release.
An engine that supports 5.0 can trivially support 5.0SP1 and 5.0SP2. The
differences lie at the application level, not the session.

If the engine validates application-level fields (and not all do, nor
need to), that can be accomplished via the Repository, which is an XML
machine-readable representation of the protocol, provided by FPL. So
supporting validation for a new Service Pack means importing a new
Repository.

Mahesh’s assertion of complexity by comparing 87 pages to 8 volumes is
like comparing apples to oranges. Almost all of the enhancements made to
FIX since 4.0, which account for the vast increase in page count, are at
the application level, not the session level. The session level has
largely remained unchanged over the past 12 years. Other than the
changes to FIXT.1.1, I need to point out that FIX 4.0 and 4.1 used
EndSeqNo=999999 in Resend Requests to denote infinity (effectively
preventing a FIX session from handling more than a million messages a
day), while FIX 4.2 onward use EndSeqNo=0 and eliminate the restriction.

Writing a FIX engine is a good challenge. It becomes much more difficult
if one needs to make it ready for production use, which usually requires
fault tolerance as well as a lot of performance tuning. But differences
between FIX versions themselves are, to an engine, negligible by
comparison. I suspect the decision to support one FIX version vs. all of
them is going to be negligible in terms of engine development time.