Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Quickfix message are different after serialization and deserialization

Tags:

java

quickfixj

I'm try to implement creating FIX message to create manually MarketDataIncrementalRefresh. When I convert created message to String then convert it to MarketDataIncrementalRefresh from this String - I'm getting another MarketDataIncrementalRefresh.

I cann't understand what is wrong with my code.

import static org.testng.Assert.assertEquals;

import org.testng.annotations.Test;

import quickfix.ConfigError;
import quickfix.DataDictionary;
import quickfix.InvalidMessage;
import quickfix.field.MDEntryPx;
import quickfix.field.MDEntrySize;
import quickfix.field.MDEntryType;
import quickfix.field.MDUpdateAction;
import quickfix.field.Symbol;
import quickfix.fix44.MarketDataIncrementalRefresh;
import quickfix.fix44.MarketDataSnapshotFullRefresh;

public class TradeEventToFixMessageConverterTest2 {

    private static final DataDictionary dataDictionary;

    static {
        try {
            dataDictionary = new DataDictionary(TradeEventToFixMessageConverterTest2.class.getResourceAsStream("/conf/FIX44-CUSTOM.xml"));
        } catch (ConfigError configError) {
            throw new ExceptionInInitializerError(configError);
        }
    }

    @Test
    public void rawTest() throws InvalidMessage {
        MarketDataIncrementalRefresh fixMessage = new MarketDataIncrementalRefresh();
        MarketDataSnapshotFullRefresh.NoMDEntries group = new MarketDataSnapshotFullRefresh.NoMDEntries();
        group.setField(new MDUpdateAction(MDUpdateAction.NEW));
        group.setField(new MDEntryType(MDEntryType.TRADE));
        group.setField(new Symbol("123456"));
        group.setField(new MDEntryPx(12345L));
        group.setField(new MDEntrySize(1234.0));
        fixMessage.addGroup(group);

        String fixString = fixMessage.toString();
        System.out.println(fixString);

        MarketDataIncrementalRefresh reversed = createMarketDataRequest(fixString);
        System.out.println(reversed.toString());

        assertEquals(reversed.toString(), fixString);
    }


    private MarketDataIncrementalRefresh createMarketDataRequest(String fixString) throws InvalidMessage {
        MarketDataIncrementalRefresh message = new MarketDataIncrementalRefresh();
        message.fromString(fixString, dataDictionary, true);
        return message;
    }

FIX Dictionary is based on standart FIX44 and looks like

<message name="MarketDataIncrementalRefresh" msgtype="X" msgcat="app">
    <field name="MDReqID" required="N"/>
    <group name="NoMDEntries" required="Y">
        <field name="MDUpdateAction" required="Y"/>
        <field name="MDEntryType" required="N"/>
        <field name="MDEntryID" required="N"/>
        <field name="Symbol" required="Y"/>
        <field name="MDEntryPx" required="N"/>
        <field name="MDEntrySize" required="N"/>
    </group>
</message>

When I try to run such convertation with real FIX server I got error

2018-04-23 14:59:54.508 +0000 ERROR [QFJ Message Processor] quickfixj.errorEvent - FIX.4.4:1/Quote->QUICKFIX: Reject sent for Message 2: Out of order repeating group members:269

What I've missed? Any help will be useful.

UPDATED

It was typo in my code - I construct MarketDataIncrementalRefresh but add MarketDataSnapshotFullRefresh.NoMDEntries to it.I changed it to MarketDataIncrementalRefresh.NoMDEntries and everything is OK.

like image 966
Yuriy Alevohin Avatar asked Dec 19 '25 15:12

Yuriy Alevohin


1 Answers

Check out your fixstring that results from toString(). I suspect that it may not actually match your custom DataDictionary, but instead is built using field orderings from the default vanilla FIX44.xml dictionary.

At no point in the construction of your message do you pass in your custom DD. That probably means it's not using it.

Unfortunately, my QF/j experience is rusty, and I can't figure out how or where to inject that DD into the message construction process. I looked at the API, and I just don't see a function for it.

(Of course, my general advice for all QF users is to regenerate and rebuild your code from your custom DD, and then you'll never have this problem.)

like image 168
Grant Birchmeier Avatar answered Dec 22 '25 05:12

Grant Birchmeier



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!