[英]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.