Quickfix 58=Conditionally Required Field Missing
Asked Answered
R

2

7

If I try to replace or cancel an order I get a message 58=Conditionally Required Field Missing and the next message contains 58=Invalid MsgType Here are the logs:

Replacing an order (tgFZctx200U61 is my side. FG is an exchange.):

20170203-15:44:04.225 : 8=FIX.4.49=15135=G34=349=tgFZctx200U6152=20170203-15:44:04.22556=FG1=U6111=270071221=138=240=241=2700744=11640054=155=RTS-3.1760=20170203-18:44:04.20510=028
20170203-15:44:04.225 : 8=FIX.4.49=23235=849=FG56=tgFZctx200U6134=352=20170203-15:43:56.98137=572984433198=F:572984433526=$01$11=270071241=2700717=exec-201702031001027616150=E39=E55=RTS-3.17461=FXXXXX54=138=140=2151=114=06=060=19700101-00:00:00.00010=213
20170203-15:44:04.275 : 8=FIX.4.49=11535=j34=449=tgFZctx200U6152=20170203-15:44:04.27556=FG45=358=Conditionally Required Field Missing372=8380=510=065
20170203-15:44:04.275 : 8=FIX.4.49=33335=849=FG56=tgFZctx200U6134=452=20170203-15:43:56.98237=572984753198=F:572984753526=$01$11=270071241=27007453=1448=tgFZctx200U61447=C452=317=3355471052150=539=01=FZ00U6155=RTS-3.1754=138=240=244=116400.00000336=9291151=214=06=060=20170203-15:43:56.98920008=-922337203685372211120018=[51000-3355471052-0]10=100
20170203-15:44:04.285 : 8=FIX.4.49=10335=349=FG56=tgFZctx200U6134=552=20170203-15:43:57.03345=4371=372373=1158=Invalid MsgType372=810=164

cancelling an order:

20170203-15:26:19.178 : 8=FIX.4.49=15435=F34=349=tgFZctx200U6152=20170203-15:26:19.17856=FG11=270061237=57286383038=141=2700644=116470.0000054=155=RTS-3.1760=20170203-18:26:19.17810=013
20170203-15:26:19.188 : 8=FIX.4.49=20735=849=FG56=tgFZctx200U6134=352=20170203-15:26:11.92437=572863830198=F:572863830526=$01$11=270061241=2700617=exec-201702031001027615150=639=655=RTS-3.17461=FXXXXX54=138=140=2151=114=06=010=239
20170203-15:26:19.418 : 8=FIX.4.49=11535=j34=449=tgFZctx200U6152=20170203-15:26:19.41856=FG45=358=Conditionally Required Field Missing372=8380=510=070
20170203-15:26:19.418 : 8=FIX.4.49=33335=849=FG56=tgFZctx200U6134=452=20170203-15:26:11.92437=572863830198=F:572863830526=$01$11=270061241=27006453=1448=tgFZctx200U61447=C452=317=3354681208150=439=41=FZ00U6155=RTS-3.1754=138=140=244=116470.00000336=9291151=014=06=060=20170203-15:26:11.93120008=-922337203685267353520018=[51000-3354681208-0]10=080
20170203-15:26:19.418 : 8=FIX.4.49=10335=349=FG56=tgFZctx200U6134=552=20170203-15:26:12.16445=4371=372373=1158=Invalid MsgType372=810=161

Best regards, Mikhail

Reserpine answered 4/2, 2017 at 13:41 Comment(0)
G
12

"Conditionally Required Field Missing" means you are trying to extract an optional field that isn't present. (It's not required by the DD, but the user's logic expects it to be there, hence "conditionally required".)

The first 35=j message says:

  • 45=3 - sequence number of message where these happened
  • 58=Conditionally Required Field Missing
  • 372=8 - type of message where this happened
  • 380=5 - same code as explained in 58

Unfortunately, the message doesn't say which field is the problem, but basically, you're doing this (forgive my pseudocode):

var x = msg.getSomeOptionalField()

but you need to do this:

var x = null;
if (msg.checkIfSomeOptionalFieldIsPresent())
    x = msg.getSomeOptionalField();
Grigsby answered 6/2, 2017 at 15:12 Comment(0)
G
1

In order to parse your own FIX messages use FIXimate.

58 is a text field. The text after 58 in this case is the error message. The tag value pair 372=83 means: The message referred to (i.e. the missing tag) is tag 83.

Tag 83 is the sequence number of message within report series. FIXimate says that 83 is "Used to carry reporting sequence number of the fill as represented on the Trade Report Side."

This is your FIX engine sending an error back to the exchange. You can tell by looking at the SenderCompID and TargetCompID for each message.

You send a message:

20170203 15:44:04.225:8=FIX.4.49=15135=G34=349=tgFZctx200U6152=20170203-15:44:04.22556=FG

You get an Execution Report (35=8, probably acknowledging order cancellation/replace):

20170203-15:44:04.225 : 8=FIX.4.49=23235=8 49=FG 56=tgFZctx200U61lo9

You send an Business Reject (35=j):

20170203-15:44:04.275 : 8=FIX.4.49=115 35=j 34=4 49=tgFZctx200U61 52=20170203-15:44:04.275 56=FG 45=358=Conditionally Required Field Missing372=8380=510=065

What this last message coming in from the exchange is, is hard to tell without further analysis, but it most likely the execution report for the replaced order. It seems to have been sent 1 ms after the original execution report.

Your FIX engine expects certain data to be present within the messages. The expectation is set in your data dictionary, an xml file which should be provided by your counterparty. Sometimes (like now) there are errors in this file and you have to open it up, find the message in question (in this case the original execution report), and tell your data dictionary not to expect tag 83.

That should clear things up. Let me know if it doesn't work.

Gloomy answered 5/2, 2017 at 4:9 Comment(4)
I am extremely gratefull to you for fast and comprehensive answerReserpine
In fact it didn't work, I've set all all fields in my fix44.xml to "N" - Not necessary. And still the same happens. In fact it was 372=8 , simply referring to the exchange message 35=8. And the string with ^ symbols instead of SOH is 20170206-15:02:45.114 : 8=FIX.4.4^9=115^35=j^34=4^49=tgFZctx200U61^52=20170206-15:02:45.114^56=FG^45=3^58=Conditionally Required Field Missing^372=8^380=5^10=059^Reserpine
In this case, Mikhail's message is not missing a required field, but a conditionally required one. He's trying to extract a field that is not present. See my answer.Grigsby
Mikhail, try Grant's solution. He has sorted me out dozens of times and knows what he's talking about.Gloomy

© 2022 - 2024 — McMap. All rights reserved.