QuickFix / n - Пользовательские поля внутри входа - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь создать инициатор на основе 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));

, но ни одна не работает.

Как, черт возьми, вы добавляете пользовательские поля в сообщение для входа?

1 Ответ

1 голос
/ 09 октября 2019

Я думаю, вы неправильно указали тип данных RawData. Это буквально предназначено для необработанных данных, а не для строк, которые следуют кодировке по умолчанию.

Из спецификации:

строковое поле, содержащее необработанные данные без ограничений по формату или содержанию. Полям данных всегда непосредственно предшествует поле длины. Поле длины должно указывать количество байтов значения поля данных (до, но не включая завершающий SOH).

Я не очень знаком с реализацией CF в QuickFIX, но вам следуетпросто можно добавить эти поля с определенным номером тега, например

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

Я надеюсь, что нет никаких синтаксических ошибок, но вы должны понять.

Редактировать: Я вижу, вывручную установите поле ResetSeqNum в сообщении входа в систему. Это не рекомендуется. quickFIX / n должен иметь дело с этим, когда вы устанавливаете ResetSeqNum = Y в настройках (у вас уже есть эта настройка).

...