quickfix Message Rejected: Invalid tag number: - quickfix

I am using QuickFix/J 1.14.3 with fix4.2 as both Initiator and Acceptor.
On Acceptor I tried to disable all Validation checks in the config file as seen below. The fromAdmin() is called with the violating message. I am not sure I want to mess with the data dictionary but I thought by disabling all checks I could actually get the message. The acceptor sets a field as follows.
newOrderSingle.setField(new IntField(6401, 79 ));
Any help would be appreciated.
UseDataDictionary=N
DefaultMarketPrice=12.30
ValidateUserDefinedFields=N
ValidateFieldsHaveValues=N
ValidateFieldsOutOfOrder=N
ValidateUserDefinedMessages=N
UseDataDictionary=N
# ACCEPTOR SIMULATOR
[session]
SenderCompID=baml
TargetCompID=mjt
BeginString=FIX.4.2
SocketAcceptPort=9879
CheckCompID=N

First of all add property
AllowUnknownMsgFields=Y
And use data dictionary it allows to process groups.
UseDataDictionary=Y

Related

QuickFIX/J is removing tags from FIX message

Is it possible for QuickFIX/J to remove some tags of the incoming FIX message? If yes, why would it be like that?
The problem is when receiving 35=X (MarketDataIncrementalRefresh) message. The message comes from the server, and has the corresponding tangs, including the tags 48 SecurityID and 22 SecurityIDSource and the checksum is the correct one, calculated including those 2 fields. When processing the message in the client, the message does no longer contain the 48 and 22 tags and the checksum is also different. Because of those 2 missing tags, that are required, the client cannot process the message. I couldn't trace the cause of this. (The data dictionary contains the tags 22 and 48 and are marked as required).
The session config:
[session]
BeginString=FIXT.1.1
SocketConnectPort=9122
UseDataDictionary=Y
AllowUnknownMsgFields=Y
ValidateFieldsOutOfOrder=N
ValidateUnorderedGroupFields=N
ValidateIncomingMessage=N
TransportDataDictionary=transport_dict_FIXT11.xml
AppDataDictionary=data_dict_FIX44.xml
SocketUseSSL=Y
EnabledProtocols=TLSv1.2
SocketKeyStore=file.jks
SocketKeyStorePassword=password
Example of message from log:
Failed to process 8=FIXT.1.1|9=145|35=X|34=226|49=SenderCompID|52=20201202-13:42:34.345|56=TargetCompID|262=EU000A1U99281083|268=1|279=0|264=1|269=0|278=EU000A1U9928_BID_1|110=1000|10=217:
quickfix.FieldNotFound: Field [48] was not found in message.

How do I modify outgoing SIP messages from Yate?

I need to strip the rport parameter from the Via field of SIP messages being generated by Yate (for compatibility with a broken peer). Can I use the scripting capabilities of Yate to do this? How do I intercept and modify outgoing SIP messages?
I discovered, by reading the code, that Yate already supports this feature. In accfile.conf, in the section defining the sip server to register to, place the following line:
xsip_flags=1
This prevents the rport parameter from being placed in SIP messages. This may break routing if you are behind a NAT, so beware.
An example config would therefore be:
[sip_service]
enabled=yes
protocol=sip
description=sip_service
username=user
domain=somewhere.com
authname=auth
password=secret
server=somewhere.com
xsip_flags=1

How to disable quickfix validation

I need to disable quickfix validation.
Setting UseDataDictionary=N does not work.
Removing paths to dictionary files in the config file does not work.
Renaming xml files in the directory to some other extension does not work.
Still rejecting messages based on failed validation.
The directory is correct. Please help! I'm sure I am missing something trivial.
Thank you!
PS - in reply to some questions:
The error I am getting is: 58=Tag specified out of required order 371=143 372=8
Indeed, the client is sending tag 143 in the message body, not the header. The client will not change the code. I tried adding tag 143 to the ExecutionReport body, but that did not help. I am weary of taking tag 143 out of the header just for these guys.
PS - config file:
[DEFAULT]
ConnectionType=initiator
ReconnectInterval=60
FileStorePath=store
FileLogPath=log
StartTime=00:00:00
EndTime=00:00:00
UseDataDictionary=N
DataDictionary=/xxxxxx
TransportDataDictionary=/xxxxx
ResetOnLogon=N
DefaultApplVerID=9
[SESSION]
BeginString=FIX.4.4
SenderCompID=xxxxxx
TargetCompID=xxxxxx
SocketConnectHost=xxxxxxxxx
SocketConnectPort=52400
HeartBtInt=30
You can disable this specific check by setting the ValidateFieldsOutOfOrder parameter to N in your configuration file. See Configuring QuickFIX.
You have to have UseDataDictionary=Y if you have repeating groups, it tells QuickFIX how to handle items in repeated groups. "Tag specified out of required order 371=143 372=8" usually means that a header tag is in the message body, a body tag is in the header, a repeating group tag is in the body, a body tag is in a repeated group etc.. Since the client is sending tag 143 in the message body rather than the header you will need to edit the DataDictionary so that that tag appears in the message body instead of the header. Since you can set the DataDictionary on a per connection basis I would strongly recommend that you create a copy of the original dictionary, give it a client specific name and edit that file and then connect it to that connection keeping the original clean.

QuickFIXJ FieldnotFound exception

In my application I am receiving a huge FIX messages. Should I check the tag is present for all the tags I retrieving. If I am not checking the presence of a tag, I get FieldNotFound exception in case the tag is not exist in the message. Is there way to bypass the isSetField(Field) method for checking for the tag is present in the message. Any help would be appreciated.
Thanks,
Bibin
You should switch on message validation within your quickfix/j settings
This will mean that you no longer need to do an explicit isSet check on any tag that is deemed mandatory, as any message missing such a tag would be rejected.
Once you've done this, you would still need to do an isSet for tags that are optional in your messages.
Check out the FIX data dictionary documentation : http://www.quickfixn.org/tutorial/custom-fields-groups-and-messages

QuickFixn Outgoing Connection

I was hoping someone can shed some light on how the Quickfixn engine handles outgoing FIX messages... I have an outgoing connection set up, and I'm getting heartbeats. When I generate an outgoing message however, it gets rejected because it says that tag 58 is invalid for this message type... (35=AE) ... Normally, if this was an inbound connection, I could just modify the Data Dictionary and everything would be fine... but seeing as how this is an outgoing connection, plus I have my
UseDataDictionary property set to 'N' ... what does the quickfix engine use to validate the outgoing message? Can something be changed to allow the engine to pass the message ? Or is the only resolution not to include this tag in my outgoing message?
Any help on this matter would be greatly appreciated.
Edit-
The message is getting rejected by the quickfix engine. The message that I'm constructing and the respective reject message are:
8=FIX.4.4 9=400 35=AE 34=38 49=XXX 52=20130528-23:11:04.040 56=YYY 31=1.3022 32=1000000.00 39=0 55=EUR/USD 58=ABCD 60=20130528-22:34:52.000 64=20130531 75=20130529 570=N 571=ABCD 5495=0 5971=1302200.00 552=1 54=2 37=ABCD 453=3 448=LP1-DBAB 447=D 452=17 448=XXX 447=D 452=1 448=XXX 447=D 452=19 15=EUR 120=USD 10=082
8=FIX.4.4 9=130 35=3 34=38 49=YYY 52=20130528-23:11:04.283 56=XXX 45=38 58=Tag not defined for this message type 371=58 372=AE 373=2 10=033
I've seen incoming messages get rejected by the quickfix engine because the data dictionary didn't have the correct specs for the message... I thought this might be the same thing but the outgoing connection doesn't seem to use the data dictionary.
Your FIX library does not reject a message. The message is sent to the counter-party instead, which then rejects your message as invalid upon receiving and validating it. And the reason for that is because tag 58, if present, must be a part of “NoSides repeating group (tag 552), which in your case it is not, making the message ill-formed. What you have to do is send a "logically" correct message. I recommend you refer to the appropriate FIX protocol specification for a reference on how to construct a correct message.
Vlad's answer is correct, but I want to alert you to one other danger in your question.
I have my UseDataDictionary property set to 'N'
I am 90% sure you don't want to do this. Whatever you think you're gaining by using =N is probably based on a misunderstanding of something.
Without a DD, you can't read messages with repeating groups, because the engine won't know what fields go in what group.
In practice, every venue uses repeating groups. Therefore, you'll need to set UseDataDictionary=Y and you need to specify an xml file with DataDictionary=<file>.
The only reason we allow =N in QF/n is to be consistent with QF/C++ and QF/j.