QuickFix / n-登录内的自定义字段

问题描述 投票:0回答:1

我正在尝试基于QuickFix / n创建启动器。我的对方(服务器)要求登录消息包含两个自定义字段。我已经将这些字段添加到了数据字典中的“字段”和“登录”消息中。在代码中,我可以操纵消息以添加用户名和密码,但是找不到如何加载自定义字段。

这里是我到目前为止所做的一些摘录:

TradeClientApp.cs

...

public void ToAdmin(Message message, SessionID sessionID)
        {
            QuickFix.SessionSettings settings = new QuickFix.SessionSettings("./initiator.cfg");
            List<SessionID> sids = settings.GetSessions().ToList();
            Dictionary settingsDict = settings.Get(sids.First());
            var appName = settingsDict.GetString("ApplicationName");
            var userType = settingsDict.GetString("UserType");

            if (message.GetType() == typeof(QuickFix.FIX44.Logon))
            {
                message.SetField(new Username("USERNAME"));
                message.SetField(new Password("PASSWORD"));
                message.SetField(new QuickFix.Fields.ResetSeqNumFlag(true));

                //tag 9933
                message.SetField(new RawData(string.Format($"9933={appName}")));
                //tag 20110
                message.SetField(new RawData(string.Format($"20110={userType}")));

            }
        }

initiator.cfg文件:

[DEFAULT]
UseDataDictionary=Y
DataDictionary=./spec/FIX44.xml
FileStorePath=store
FileLogPath=log
ConnectionType=initiator
ReconnectInterval=60

[SESSION]
BeginString=FIX.4.4
SenderCompID=USERNAME
ResetSeqNumFlag=Y
Username=USERNAME
Password=PASSWORD
TargetCompID=TARGETCOMPID
StartTime=12:30:00
EndTime=23:30:00
HeartBtInt=10
ApplicationName=app-name
UserType=V
SocketConnectPort=446
SocketConnectHost=SERVERHOST

FIX44.XML内部

<message name="Logon" msgtype="A" msgcat="admin">
      <field name="EncryptMethod" required="Y" />
      <field name="HeartBtInt" required="Y" />
      <field name="RawDataLength" required="N" />
      <field name="RawData" required="N" />
      <field name="ResetSeqNumFlag" required="N" />
      <field name="NextExpectedMsgSeqNum" required="N" />
      <field name="MaxMessageSize" required="N" />
      <group name="NoMsgTypes" required="N">
        <field name="RefMsgType" required="N" />
        <field name="MsgDirection" required="N" />
      </group>
      <field name="TestMessageIndicator" required="N" />
      <field name="Username" required="N" />
      <field name="Password" required="N" />
      <field name="ApplicationName" required="N" />
      <field name="UserType" required="N" />
    </message>

 <fields>
   ...

   <field number="9933" name="ApplicationName" type="STRING"/>
   <field number="20110" name="UserType" type="STRING" />
 </fields>
</fix>

当我尝试连接时,我得到此日志:

<outgoing> 8=FIX.4.49=12035=A34=149=USERNAME52=20191008-21:19:41.49856=TARGETCOMPID96=20110=V98=0108=10141=Y553=USERNAME554=PASSWORD10=097

如我的示例中所示,使用RawData,该消息带有20110 = V作为RawData,它是标签96,但对我没有帮助。我已经在ToAdmin

中尝试过

message.Header.SetField(new StringField(QuickFix.Fields.Tags.UserType, ""));

message.SetField(new QuickFix.Fields.UserType(true));

但都不起作用。

您到底如何在登录消息中添加自定义字段?

c# quickfix quickfixn
1个回答
0
投票

我认为您将RawData数据类型弄错了。这实际上是针对原始数据的,而不是针对遵循默认编码的字符串的。

根据规格:

字符串字段,包含无格式或内容的原始数据限制。数据字段总是紧随其后的是长度领域。长度字段应指定字节数数据字段的值(最多但不包括终止SOH)。

我对QuickFIX的C#实现不太熟悉,但是您应该能够简单地添加具有特定标签号的这些字段,例如

message.SetField(new StringField(20110, "V"));

我希望没有语法错误,但是您应该明白这一点。

编辑:我看到您正在手动设置登录消息上的ResetSeqNum字段。不鼓励这样做。当您在设置中设置ResetSeqNum = Y时,quickFIX / n应该会处理此问题(您已经具有该设置)。

© www.soinside.com 2019 - 2024. All rights reserved.