简体   繁体   English

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

[英]QuickFix/n - Custom fields inside Logon

I'm trying to create an initiator based on QuickFix/n.我正在尝试创建一个基于 QuickFix/n 的启动器。 My counterpart (server) demand the logon message to carry two custom fields.I already added those to the Data Dictionary, in the Fields as well as in the Logon message.我的对方(服务器)要求登录消息携带两个自定义字段。我已经将它们添加到数据字典、字段和登录消息中。 In the code i can manipulate the message to add the username and password, but i can't find how to load custom fields.在代码中,我可以操纵消息以添加用户名和密码,但我找不到如何加载自定义字段。

Here are some excerpts from what i've done so far:以下是我迄今为止所做的一些摘录:

TradeClientApp.cs 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}")));

            }
        }

The initiator.cfg file:启动器.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

Inside the FIX44.XML 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>

When i try to connect i get this log:当我尝试连接时,我得到了这个日志:

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

Using the RawData as shown in my example, the message carries 20110=V as RawData, which is tag 96, which doesn't help me.使用我的示例中所示的RawData ,消息携带20110=V作为 RawData,即标记 96,这对我没有帮助。 I already tried inside ToAdmin :我已经在ToAdmin内部尝试过:

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

or或者

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

but neither work.但两者都不起作用。

How on earth do you add custom fields to the logon message?您到底如何将自定义字段添加到登录消息中?

I think you are getting the RawData data type wrong.我认为您将RawData数据类型弄错了。 That is literally meant for raw data, not for Strings that follow the default encoding.从字面上看,这意味着原始数据,而不是遵循默认编码的字符串。

From the spec:从规范:

string field containing raw data with no format or content restrictions.包含没有格式或内容限制的原始数据的字符串字段。 Data fields are always immediately preceded by a length field.数据字段总是紧跟在长度字段之前。 The length field should specify the number of bytes of the value of the data field (up to but not including the terminating SOH).长度字段应指定数据字段值的字节数(最多但不包括终止 SOH)。

I am not so familiar with the C# implementation of QuickFIX but you should simply be able to add these fields with the specific tag number, eg我对 QuickFIX 的 C# 实现不太熟悉,但您应该可以简单地使用特定的标签号添加这些字段,例如

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

I hope there are no syntax errors, but you should get the idea.我希望没有语法错误,但你应该明白。

Edit: I see you are manually setting the ResetSeqNum field on the Logon message.编辑:我看到您正在手动设置登录消息上的 ResetSeqNum 字段。 This is discouraged.这是不鼓励的。 quickFIX/n should deal with this when you set ResetSeqNum=Y in the settings (you already have that setting).当您在设置中设置 ResetSeqNum=Y 时,quickFIX/n 应该处理这个问题(您已经有了该设置)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM