我使用QuickFIX和Python启动与处理FIX5.0SP2的fixserver进程的连接。当我尝试启动连接时,收到以下消息后会收到断开连接:(Message 1 Rejected: Required tag missing:1137)
。
我的修复服务器进程并不强制使用此标记,而是尝试将其从登录过程中删除。我从FIXT11.xml中删除了它并为此创建了一个自定义xml但没有任何成功。我错过了什么吗?我以为你可以在这个文件中轻松地将它们从强制切换到非强制?
这是我的配置:
[DEFAULT]
ConnectionType=initiator
ReconnectInterval=60
DefaultApplVerID=FIX.5.0SP2
UseDataDictionary=N
ResetOnLogout=Y
ResetOnLogon=Y
AppDataDictionary=/home/foo/Documents/QuickFix/fix_specs/FIX50SP2CustomTags.xml
TransportDataDictionary=/home/foo/Documents/QuickFix/fix_specs/FIXT11CustomTags.xml
[SESSION]
BeginString=FIXT.1.1
ConnectionType=initiator
SenderCompID=FIXSRV
TargetCompID=RTD
ReconnectInterval=30
HeartBtInt=30
StartTime=00:30:00
EndTime=23:30:00
SocketConnectProtocol=TCP
SocketConnectPort=1284
SocketConnectHost=X.X.X.X
FileStorePath=/home/foo/Documents/QuickFix/data
FileLogPath=/home/foo/Documents/QuickFix/logs
ValidateFieldsOutOfOrder=N
ValidateFieldsHaveValues=N
#ValidateUserDefinedFields=N`
以下是带有修复消息的quickfix输出:
<20170213-12:52:41.812, FIXT.1.1:FIXSRV->RTD, event>
(Created session)
<20170213-12:52:41.813, FIXT.1.1:FIXSRV->RTD, event>
(Connecting to X.X.X.X on port 1284)
Sent the Admin following message: 8=FIXT.1.1|9=77|35=A|34=1|49=FIXSRV|52=20170213-12:52:41.816|56=RTD|98=0|108=30|141=Y|1137=9|10=140|
<20170213-12:52:41.817, FIXT.1.1:FIXSRV->RTD, outgoing>
(8=FIXT.1.1|9=106|35=A|34=1|49=FIXSRV|52=20170213-12:52:41.816|56=RTD|50=FIX50|98=0|108=30|141=Y|553=FIX50|554=fix50|1137=9|10=083|)
<20170213-12:52:41.817, FIXT.1.1:FIXSRV->RTD, event>
(Initiated logon request)
<20170213-12:52:41.820, FIXT.1.1:FIXSRV->RTD, incoming>
(8=FIXT.1.1|9=000106|35=A|1128=7|49=RTD|56=FIXSRV|34=1|50=FIX50|52=20170213-12:52:41.639|98=0|108=30|141=Y|553=FIX50|554=fix50|10=228|)
<20170213-12:52:41.820, FIXT.1.1:FIXSRV->RTD, event>
(Message 1 Rejected: Required tag missing:1137)
<20170213-12:52:41.820, FIXT.1.1:FIXSRV->RTD, event>
(Tried to send a reject while not logged on)
<20170213-12:52:41.820, FIXT.1.1:FIXSRV->RTD, event>
(Required field missing from logon)
<20170213-12:52:41.820, FIXT.1.1:FIXSRV->RTD, event>
(Disconnecting)
更新:
我尝试在字典中将该字段<field name='DefaultApplVerID' required='Y'/>
更改为required='N'
,但没有任何效果。其他字段可以将它们更改为非强制性,并且在未设置时会跳过它们。这个特定的强制性修订5.0SP2字段是否经过硬编码且不是强制性的?
答案 0 :(得分:0)
你有
UseDataDictionary=N
只要发起者/接受者数据字典同步,我就会猜到这个问题。
答案 1 :(得分:0)
必须配置DefaultApplVerID。检查文件: Configuring QuickFIX
DefaultApplVerID:
仅适用于FIXT 1.1(及更新版本)。忽略了早期的传输版本。指定会话的默认应用程序版本ID。这可以是ApplVerID枚举(请参阅ApplVerID字段)或默认版本的BeginString。
如果删除[DEFAULT]配置的 DefaultApplVerID = FIX.5.0SP2 行,quickfix将显示以下内容:
配置失败:FIXT传输需要ApplVerID
在任何情况下,请尝试将其放在[SESSION]中并将其设置为:
DefaultApplVerID=9
答案 2 :(得分:0)
您的理解是正确的。对字段DefaultApplVerID(1137)
的检查在QuickFix引擎中进行了硬编码,因为它是强制性的,如@Christian Quisbert的标题说明中所述。
我没有Python版本的QuickFix,只有Java版本。但是我认为实现应该相互对齐,没有太大差异。
如果在Java版本的Session.java
(我指的是 quickfix-2.1.0 )项目下查看quickfixj-core
,则有一个名为:< / p>
private void next(Message message, boolean isProcessingQueuedMessages) throws FieldNotFound, RejectLogon, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType, IOException, InvalidMessage { ... }
在 953行中,有一个代码段用于处理回复的 LOGON 消息,如下所示:
final String sessionBeginString = sessionID.getBeginString();
try {
final String beginString = header.getString(BeginString.FIELD);
if (!beginString.equals(sessionBeginString)) {
throw new UnsupportedVersion("Message version '" + beginString
+ "' does not match the session version '" + sessionBeginString + "'");
}
if (MsgType.LOGON.equals(msgType)) {
if (sessionID.isFIXT()) {
targetDefaultApplVerID.set(new ApplVerID(message
.getString(DefaultApplVerID.FIELD)));
}
...
这意味着,如果DefaultApplVerID(1137)
等于BeginString(8)
,并且您不能仅通过配置跳过此验证,则quickfixj引擎期望传入的LOGON响应中存在字段FIXT.1.1
。