Getting Started¶
Protocol Files¶
While FIX is a standard, the structure of the fields and messages is configurable.
This configuration is typically loaded from a file. The source repository
contains a number of such files in the /etc folder in YAML format. There is
also a QuickFix loader.
The YAML format makes use of defaults. All message fields default to type field,
so only group and component fields need to be explicitly specified. Also all
message fields are consider optional, non-optional fields must be marked as
required: true.
Usage¶
Decoding¶
To decode a FIX bytes buffer -
from jetblack_fixparser import load_yaml_protocol, FixMessage
buffer = b'8=FIX.4.4|9=94|35=3|49=A|56=AB|128=B1|34=214|50=U1|52=20100304-09:42:23.130|45=176|371=15|372=X|373=1|58=txt|10=058|',
protocol = load_yaml_protocol(
'FIX44.yaml',
is_millisecond_time=True,
is_float_decimal=True
)
fix_message = FixMessage.decode(
protocol,
buffer,
sep=b'|',
strict=True,
validate=True,
convert_sep_for_checksum=True
)
print(fix_message.message)
Note that strict validation is enabled. This ensures all required fields are
specified. Also the separator is changed from NULL to | to so they can be
displayed. However the checksum was calculated with the original field separator
so the convert_sep_for_checksum is set to true.
Encoding¶
To encode a dictionary describing a FIX message -
from datetime import datetime, timezone
from jetblack_fixparser import load_yaml_protocol, FixMessage
protocol = load_yaml_protocol(
'FIX44.yaml',
is_millisecond_time=True,
is_float_decimal=True,
is_type_enum=None
)
sending_time = datetime(2020, 1, 1, 12, 30, 0, tzinfo=timezone.utc)
fix_message = FixMessage(
protocol,
{
'MsgType': 'LOGON',
'MsgSeqNum': 42,
'SenderCompID': "SENDER",
'TargetCompID': "TARGET",
'SendingTime': sending_time,
'EncryptMethod': "NONE",
'HeartBtInt': 30
}
)
buffer = fix_message.encode(regenerate_integrity=True)
print(buffer)
Note that the BeginString, BodyLength and Checksum fields were automatically
generated.