FIX Protocol Errors and How to Fix Them
The errors FIX engines log and the rejects counterparties send, each with what it means, the usual causes, what to change on each side of the session and an example you can open in the parser.
Have a log? Paste it into the FIX parser: it checks BodyLength, CheckSum and sequence gaps for every message.
Sequence numbers and recovery
MsgSeqNum (34) problems, resends, gap fills and duplicate handling.
- MsgSeqNum too low, expecting X but received Y
Why a FIX session logs out with "MsgSeqNum too low, expecting X but received Y", what causes it and how to fix sequence numbers on both sides.
- MsgSeqNum too high, expecting X but received Y
What "MsgSeqNum too high, expecting X but received Y" means in FIX, how ResendRequest and GapFill recover the gap, and what to check on both sides.
- PossDupFlag (43) and PossResend (97): handling duplicate messages
How FIX PossDupFlag (43=Y) and PossResend (97=Y) differ, what a receiver must check for each, and the rejects you get when OrigSendingTime is wrong.
- SequenceReset: GapFill (123=Y) vs Reset mode
The two modes of the FIX SequenceReset message, GapFill (123=Y) and Reset, when to use each, and the errors a wrong NewSeqNo (36) causes.
Garbled messages
Framing errors that make a receiver drop the message without a Reject.
- Incorrect BodyLength (tag 9)
Why a FIX counterparty drops your message for an incorrect BodyLength (tag 9), how to count it in bytes, and how to check a message in the parser.
- CheckSum mismatch: invalid checksum (tag 10)
What an invalid FIX CheckSum (tag 10) means, how the three-digit value is calculated, the usual causes and how to check a message in the parser.
Session-level rejects (35=3)
Validation failures reported with a Reject message and SessionRejectReason (373).
- Required tag missing (SessionRejectReason 373=1)
Why a FIX counterparty rejects a message with "Required tag missing" (373=1), how to read RefTagID (371) and how to fix the message.
- Tag not defined for this message type (373=2)
Why a FIX engine rejects a valid tag with "Tag not defined for this message type" (373=2), with an example and fixes for sender and receiver.
- Invalid tag number / Undefined tag (373=0 and 373=3)
What the FIX rejects "Invalid tag number" (373=0) and "Undefined tag" (373=3) mean, the usual causes such as custom tags, and how to fix them.
- Tag specified without a value (373=4)
Why FIX rejects a field sent as "tag=" with no value (373=4), the serialisation bugs that cause it, and how to fix it on each side of the session.
- Value is incorrect (out of range) for this tag (373=5)
Why FIX rejects a value as "incorrect (out of range) for this tag" (373=5): enum codes that differ by version, such as 150=2 or 39=5 in FIX 4.4.
- Incorrect data format for value (373=6)
Why FIX rejects a field for "Incorrect data format for value" (373=6): timestamps, decimals, booleans and integers in the wrong format, with examples.
- SendingTime accuracy problem (373=10)
Why a FIX session rejects messages for "SendingTime accuracy problem" (373=10) and logs out, and how to fix clocks, time zones and replays.
- CompID problem (373=9)
Why a FIX session rejects a message with "CompID problem" (373=9) and logs out, and how to check SenderCompID (49), TargetCompID (56) and SubIDs.
- Invalid MsgType (373=11)
Why a FIX engine rejects a message with "Invalid MsgType" (373=11), how it differs from Unsupported Message Type (380=3), and how to fix it.
- Tag appears more than once (373=13)
Why FIX rejects a message with "Tag appears more than once" (373=13): duplicate fields, missing NumInGroup counters and unknown repeating groups.
- Tag specified out of required order (373=14)
Why FIX rejects a message with "Tag specified out of required order" (373=14): header field order, trailer position and engine settings explained.
- Repeating group fields out of order (373=15)
Why FIX rejects a message with "Repeating group fields out of order" (373=15): the delimiter field rule for group entries, with an example.
- Incorrect NumInGroup count for repeating group (373=16)
Why FIX rejects a message with "Incorrect NumInGroup count for repeating group" (373=16), with an example and fixes for nested groups.
Logon, heartbeats and logout
Sessions that will not log on or drop after a while.
- FIX Logon rejected: Logout with text, or disconnect after Logon
Why a FIX Logon (35=A) is answered with a Logout or a silent disconnect: CompIDs, password, sequence numbers, BeginString and session hours.
- Heartbeat timeout: TestRequest unanswered, session disconnected
Why a FIX session disconnects with a heartbeat timeout, how Heartbeat (35=0) and TestRequest (35=1) work, and what to check on both sides.
Order and cancel rejects
Business rejects of orders, cancels and replaces.
- Unknown order: Order Cancel Reject with CxlRejReason 102=1
Why a FIX cancel or replace is rejected with CxlRejReason 102=1 Unknown order, how OrigClOrdID chaining works and what to check on each side.
- Too late to cancel: Order Cancel Reject with CxlRejReason 102=0
What FIX CxlRejReason 102=0 Too late to cancel means, why it happens when an order fills during a cancel, and how to handle it correctly.
- Order rejected: Execution Report 39=8 with OrdRejReason (103)
How to read a FIX order reject: Execution Report with 150=8 and 39=8, every common OrdRejReason (103) code and what to do about it.
- Business Message Reject (35=j): BusinessRejectReason (380) codes
When a FIX counterparty sends a Business Message Reject (35=j), what each BusinessRejectReason (380) code means and how it differs from a session Reject.
FIX version mismatches
Values and fields that changed between FIX 4.2, 4.4 and 5.0.
- OrdStatus 39=5 (Replaced) is not valid in FIX 4.4
Why OrdStatus 39=5 (Replaced) is rejected on FIX 4.4 sessions, what to send instead, and the other ExecType changes between FIX 4.2 and 4.4.
- FIXT.1.1 and ApplVerID errors (DefaultApplVerID 1137, 373=18)
Fix FIX 5.0 session errors: BeginString FIXT.1.1, DefaultApplVerID (1137) on Logon, ApplVerID (1128) codes and 373=18 unsupported version rejects.