如何通过自定义标签顺序发送FIX消息?

问题描述 投票:0回答:1

订单请求在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 = PSE | 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 |

所以,如果我希望输出按发送的相同顺序怎么办?

fix-protocol quickfixj
1个回答
0
投票

Grant和TT正确地指出,除了重复组内部,FIX实际上没有强制执行特定的标签(或字段)排序。但是,有些交易对手需要在消息正文中进行特定的字段排序。

[在消息上设置字段时,QuickFIX / J按照标签在数据字典中出现的顺序排列标签。这是因为特定消息类型的代码是在编译时从数据字典生成的。

如果您想更改此顺序,则有两种可能。

  1. 更改数据字典并重新编译QuickFIX / J。说明在这里:build instructions

  2. 扩展通用名称Message,指定标记顺序并将其传递给超级构造函数。参见下面的示例代码。

还有一个一般说明:请注意,您不必自己添加重复组计数(代码中的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|
© www.soinside.com 2019 - 2024. All rights reserved.