当前位置: 代码迷 >> python >> QuickFIX 从登录过程中删除标签
  详细解决方案

QuickFIX 从登录过程中删除标签

热度:87   发布时间:2023-06-13 15:08:31.0

我正在使用 QuickFIX 和 Python 来启动与处理 FIX5.0SP2 的 fixserver 进程的连接。 当我尝试启动连接时,在收到以下消息后收到断开连接: (Message 1 Rejected: Required tag missing:1137) 我的 fixserver 进程不强制使用此标记,我正在尝试将其从登录过程中删除。 我从 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 字段是硬编码的吗?不能是非强制性的吗?

你有

UseDataDictionary=N

只要发起者/接受者数据字典同步,我猜这就是问题所在。

必须配置 DefaultApplVerID。 检查文档:

默认应用程序 ID:

仅 FIXT 1.1(及更新版本)需要。 对于较早的传输版本忽略。 指定会话的默认应用程序版本 ID。 这可以是 ApplVerID 枚举(请参阅 ApplVerID 字段)或默认版本的 BeginString。

如果删除 [DEFAULT] 配置的DefaultApplVerID=FIX.5.0SP2行,quickfix 将显示以下内容:

配置失败:FIXT 传输需要 ApplVerID

无论如何,尝试将其放置在 [SESSION] 中并像这样设置:

DefaultApplVerID=9

你的理解是正确的。 字段DefaultApplVerID(1137)的检查在 QuickFix 的引擎中是硬编码的,因为它是强制性的,如@Christian Quisbert 的标题规范中所述。

我没有 QuickFix 的 Python 版本,只有 Java 版本。 但我认为实现应该相互对齐,没有太大区别。

如果查看Java版本的quickfixj-core项目下的Session.java (我指的是quickfix-2.1.0 ),有一个方法名为:

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)));
        }

...

这意味着如果BeginString(8)等于FIXT.1.1并且您不能简单地通过配置跳过此验证,则表示 quickfixj 引擎期望传入的登录响应中存在字段DefaultApplVerID(1137)