Как создать сообщение о порядке списка в QuickFix/J

Я пытаюсь создать «список ордеров» (ордеров форекс), которые будут выполняться моим TargetCompID с помощью QuickFix/J lib.

Если я правильно понимаю стандарт сообщения FIX, мое сообщение должно иметь следующие поля (я указал свои значения в скобках):

Заголовок

  • 8 Начальная строка (FIX.4.4)
  • 9 BodyLength (будет вычисляться и предоставляться quickfixj при отправке)
  • 35 MsgType (E = NewOrderList)
  • 34 MsgSeqNum (будет вычислено и предоставлено quickfixj при отправке)
  • 49 SenderCompId (это я)
  • 52 SendingTime (будет вычислено и предоставлено quickfixj при отправке)
  • 56 TargetCompId (это мой контрагент, который будет выполнять мои ордера FX)

Затем часть тела

  • 66 ListId (вычислен уникальный идентификатор)
  • 68 ToNoOrders (количество моих заказов в списке)
  • 73 NoOrders (такое же значение счетчика, так как я сразу сгенерирую полный список заказов)

Затем повторите список следующих полей (одно поле списка для каждого заказа в моем списке):

  • 11 ClOrdId (идентификатор моего заказа)
  • 67 ListSeqNo (индекс заказа в моем списке: от 1 до N; N = ToNoOrders = NoOrders)
  • ... несколько других полей как 15 (валюта), 120 (SettlCurrency)

Для этого я сделал (в java/quickfixj):

Message message = new Message();
Header header = message.getHeader();
header.setField(new BeginString("FIX.4.4"));
header.setField(new MsgType("E"));
header.setField(new SenderCompID("it's me"));
header.setField(new TargetCompID("my counterparty"));
message.setField(new ListID(_fixListId));
message.setField(new TotNoOrders(_list.size()));
message.setField(new NoOrders(_list.size()));
int idx = 0;
for (Order order : _list) {
    message.setField(new ClOrdID(order.getId()));
    message.setField(new ListSeqNo(++idx));
    //message.setField(.... other fields to add to describe my order)
}

Но при этом в функции обратного вызова toApp моего приложения quickfixj ("Это обратный вызов для сообщений приложения, которые вы отправляете контрагенту"), отображая сообщение в параметре (syso(message) ) показывает, что внутри моего сообщения только один заказ, и это последний заказ, который я поставил.

Кажется, это какая-то «группа», которую мы можем создать в QuickFixJ, и мы можем добавить несколько групп в одно и то же сообщение. Но существует множество групп, и я не понимаю, какая группа подходит для моего «порядка списка», если таковая имеется? Я вижу, что есть подкласс Message, который называется NewOrderList (это мой MsgType = E), но это не «группа»; и должна быть возможность создать сообщение и предоставить MsgType напрямую...

Или, может быть, я неправильно понимаю стандарт сообщения FIX и поля, которые я должен предоставить?

С уважением,

Алекс


person Alexxx    schedule 03.03.2016    source источник
comment
Хорошо, из btobits.com/fixopaedia/fixdic44/message_New_Order_List_E_.html; в нем говорилось, что ClOrdID должно быть первым полем в повторяющейся группе; Поэтому я должен использовать повторяющуюся группу... просто чтобы узнать, как это сделать в quickfixj (и какой именно).   -  person Alexxx    schedule 03.03.2016


Ответы (2)


Вместо того, чтобы создавать сообщение с нуля, вы должны использовать предопределенные сообщения в QuickFIX/J.

В вашем случае я бы начал с quickfix.fix44.NewOrderList .

При использовании этого класса для вас будет заполнено множество полей в верхней и нижней частях сообщения (BeginString, BodyLength, MsgType, CheckSum, ...). Тогда вам нужно будет в основном заниматься только основной частью (т.е. телом) сообщения.

Для повторяющейся группы доступны вспомогательные классы для установки этой информации в сообщении. Например. для NewOrderList.NoOrders:

quickfix.fix44.NewOrderList fixMessage = new quickfix.fix44.NewOrderList (
    .... // check constructor for what parameters to pass
);
// ...
quickfix.fix44.NewOrderList.NoOrders noOrders = new quickfix.fix44.NewOrderList.NoOrders();
// ...
fixMessage.addGroup( noOrders );
person TT.    schedule 03.03.2016
comment
Да, я знаю, что могу использовать предопределенное сообщение. Но мне нравится контролировать то, что происходит, а затем использовать основное сообщение. И поскольку мой контрагент прислал мне спецификацию о том, что он посещает, чтобы получить, поэтому, используя предопределенное сообщение, я не уверен, что все обязательные (контрагентом) поля будут установлены. Но в идеале ты прав. Я разместил свое решение выше. - person Alexxx; 03.03.2016
comment
@Alexxx Я видел это =) всегда хорошо, что ты можешь решать свои проблемы. Минимальные/условно обязательные поля регулируются словарем (устанавливаются параметрами конфигурации). Они отражают требования стандарта FIX. Контрагент всегда может запросить дополнительные обязательные поля, но в этом отношении нет никакой разницы между использованием ручных сообщений и предопределенных сообщений. - person TT.; 03.03.2016
comment
Это не сработает, так как NoOrders() не наследуется от Group. Вместо этого вы должны использовать new quickfix.fix44.NewOrderList.NoOrdersGroup(), а затем добавить его в сообщение, используя addGroup(). По крайней мере, это верно для версии quickfix для С#. - person Matthias Güntert; 24.07.2019
comment
@Matze Это работает в QuickFIX/J. Вопрос про Яву. В Java quickfix.fix44.NewOrderList.NoOrders расширяет quickfix.Group. - person TT.; 24.07.2019

Хорошо, я понял.

Я использовал общую группу и установил поле вручную.

Итак, обновленное кодовое решение:

Message message = new Message();
Header header = message.getHeader();
header.setField(new BeginString("FIX.4.4"));
header.setField(new MsgType("E"));
header.setField(new SenderCompID("it's me"));
header.setField(new TargetCompID("my counterparty"));
message.setField(new ListID(_fixListId));
message.setField(new TotNoOrders(_list.size()));
message.setField(new NoOrders(_list.size()));
int idx = 0;
for (Order order : _list) {
    Group group = new Group(18, new ClOrdID().getTag()); //18 is the number of field I will add below inot the group, second paramaeter is the first field of the group
    group.setField(new ClOrdID(order.getId()));
    group.setField(new ListSeqNo(++idx));
    //message.setField(.... other fields to add to describe my order)
    message.addGroup(group);
}
person Alexxx    schedule 03.03.2016
comment
Ручное построение сообщений работает, правда. Тем не менее, использование предопределенных сообщений избавляет вас от набора текста/управления. - person TT.; 03.03.2016