OK, so now I've got messages doing round trips between strings and my internal data model (in fact, string -> data -> string -> data -> string for verification). Yay!

The string in question is:
"8=FIX.4.0|9=65|35=A|49=SERVER|56=CLIENT|34=177|52=20090107-18:15:16|98=0|108=30|10=060|"
with the |s replaced by SOH (\u0001) characters.

I've implemented all 139 field types (1~140, with 101 undefined) in the FIX4.0 specification, using a type hierarchy derived from the 5.0SP1 spec, though only for basic static checking - almost no validation yet. Dynamic checking (e.g. "tag 64 required when tag 63=6 or 63=8, but optional otherwise") will add a fair chunk of work, so I'm leaving that for now. Repeated groups are supported but need a little tidying up in the parser.

Next big tasks on the horizon are the session model (logon, heartbeats, responding to requests, termination) and implementing an order book for the exchange.

But, for now, I'm having a beer. Black Sheep - Riggwelter (5.7% abv), in fact.