Как отправить сообщение FIX с упорядочением пользовательских тегов? - PullRequest
0 голосов
/ 03 февраля 2020

Запрос заказа отправляется на сервер FIX, и порядок тегов изменяется.

Что делать, если я хотел выводить последовательность, как она организована мной (а не изменялась сервером).

public void send50(Order order) {

    quickfix.fix50sp1.NewOrderSingle newOrderSingle = new quickfix.fix50sp1.NewOrderSingle(new ClOrdID(order.getID()),
            sideToFIXSide(order.getSide()), new TransactTime(), typeToFIXType(order.getType()));
    newOrderSingle.set(new OrderQty(order.getQuantity()));
    newOrderSingle.set(new Symbol(order.getSymbol()));
    newOrderSingle.set(new Price(order.getSharePrice()));
    newOrderSingle.set(new Account("13501100"));
    newOrderSingle.setField(new NoPartyIDs(1));
    newOrderSingle.setField(new PartyIDSource('C'));
    newOrderSingle.setField(new PartyRole(12));
    newOrderSingle.setField(new PartyID("13501100"));**

Это последовательность, заданная пользователем серверу, и она упорядочена сервером как:

8 = FIXT.1.1 | 9 = 173 | 35 = D | 34 = 5 | 49 = 135 | 52 = 20200131-05: 35: 12,956 | 56 = ПСЭ | 1 = 13501100 | 11 = 1580448912441 | 38 = 1000 | 40 = 1 | 44 = 10,78 | 54 = 1 | 55 = AGI | 59 = 0 | 60 = 20200131-13: 35: 12,956 | 447 = C | 448 = 13501100 | 452 = 12 | 453 = 1 | 10 = 213 |

Так что же можно сделать, если Я хотел вывод в той же последовательности, которая отправляется?

1 Ответ

2 голосов
/ 04 февраля 2020

Grant и TT верны, заявив, что на самом деле FIX не требует определенного порядка тегов (или полей) c, кроме как внутри повторяющихся групп.
Однако есть некоторые контрагенты, которым требуется определенное c упорядочение полей в теле сообщения.

При настройке полей в сообщении QuickFIX / J упорядочивает теги в порядке их появления в словаре данных. Это связано с тем, что код для определенного типа сообщения c генерируется из словаря данных во время компиляции.

Если вы хотите изменить этот порядок, есть две возможности.

  1. Изменить словарь данных и перекомпилировать QuickFIX / J. Инструкции здесь: инструкции по сборке

  2. Расширьте общее Message, укажите порядок тегов и передайте его супер-конструктору. Ниже приведен пример кода.
    ПРИМЕЧАНИЕ: Думая об этом дальше, я понял, что у этого подхода есть и обратная сторона. В случае, если вашей стороне необходимо повторно отправить сообщения, сообщения из хранилища анализируются с использованием настроенного словаря данных и фабрики сообщений для этого сеанса. Т.е. вы, вероятно, в конечном итоге снова будете использовать порядок полей из словаря данных / сгенерированного кода.
    Итак, чтобы подвести итог: вариант 1 является чистым подходом, но требует перестройки QuickFIX / J.

И общее примечание: обратите внимание, что вам не нужно добавлять количество повторяющихся групп (NoPartyIDs в вашем коде) самостоятельно. Это делается QuickFIX / J при добавлении группы к сообщению.

Пример кода:

@Test
    public void testCustomFieldOrder() {

        final int[] FIELD_ORDER = {38, 55, 44, 1};
        final int[] PARTY_GROUP_ORDER = {447, 452, 448, 0};

        class MyNewOrderSingle extends quickfix.fix50sp1.Message {

            public static final String MSGTYPE = "D";

            public MyNewOrderSingle() {
                super(FIELD_ORDER);
                getHeader().setField(new quickfix.field.MsgType(MSGTYPE));
            }

        }

        class MyPartyGroup extends Group {

            public MyPartyGroup() {
                super(453, 447, PARTY_GROUP_ORDER);
            }

        }

        quickfix.fix50sp1.NewOrderSingle nos1 = new quickfix.fix50sp1.NewOrderSingle();
        nos1.setString(38, "1000");
        nos1.setString(55, "SYM");
        nos1.setString(44, "1");
        nos1.setString(1, "ACCOUNT");
        nos1.setString(100, "XETR");
        quickfix.fix50sp1.NewOrderSingle.NoPartyIDs group1 = new quickfix.fix50sp1.NewOrderSingle.NoPartyIDs();
        group1.setString(447, "C");
        group1.setString(452, "12");
        group1.setString(448, "PARTYID");
        nos1.addGroup(group1);

        System.out.println("orig   " + nos1.toString().replace('\001', '|'));

        MyNewOrderSingle nos2 = new MyNewOrderSingle();
        nos2.setString(38, "1000");
        nos2.setString(55, "SYM");
        nos2.setString(44, "1");
        nos2.setString(1, "ACCOUNT");
        nos2.setString(100, "XETR");

        MyPartyGroup group2 = new MyPartyGroup();
        group2.setString(447, "C");
        group2.setString(452, "12");
        group2.setString(448, "PARTYID");
        nos2.addGroup(group2);

        System.out.println("custom " + nos2.toString().replace('\001', '|'));

    }

Вывод:

orig   8=FIXT.1.1|9=75|35=D|1=ACCOUNT|38=1000|44=1|55=SYM|100=XETR|453=1|448=PARTYID|447=C|452=12|10=014|
custom 8=FIXT.1.1|9=75|35=D|38=1000|55=SYM|44=1|1=ACCOUNT|100=XETR|453=1|447=C|452=12|448=PARTYID|10=014|
...