Query FieldList obj using field ids

Hi all,

I have issues with FieldList forth method. The below doesn't work as expected :

const int type = updateMsg.getUpdateTypeNum();

if (type == INSTRUMENT_UPDATE_QUOTE )

decode_quote( updateMsg.getPayload().getFieldList());

void AppClient::decode_quote( const FieldList& fl ) {

enum { TIMESTAMP_FID=5, BID_FID=22, ASK_FID=25, BIDSIZE_FID=30, ASKSIZE_FID=31 };

cout << fl.toString()<<endl;

fl.forth(TIMESTAMP_FID);

const FieldEntry& ft = fl.getEntry();

const OmmTime& time = ft.getTime();

fl.reset();

if ( fl.forth(BID_FID) ) {

const FieldEntry& fb = fl.getEntry();

cout << " bid: " << fb.getReal().getAsDouble();

fl.forth(BIDSIZE_FID);

const FieldEntry& fbs = fl.getEntry();

cout << " size: " << fbs.getReal().getAsDouble(); fl.reset();

}

else if(fl.forth(ASK_FID)) {

const FieldEntry& fa = fl.getEntry();

cout << " ask: " << fa.getReal().getAsDouble();

fl.forth(ASKSIZE_FID);

const FieldEntry& fas = fl.getEntry();

cout << " size: " << fas.getReal().getAsDouble(); fl.reset();

}

cout << " tm: "<< (UInt64)time.getHour() << ":" << (UInt64)time.getMinute() << ":" << (UInt64)time.getSecond() << endl; }

the above never prints ASK price & size, only the bid side but fl.toString() prints both.

Am I doing something wrong ?

Thanks

Best Answer

  • Hi @gparl

    Thank you for the explanation.

    forth() method will Iterates through the list of Data and end the iterator at the end of the container if it cannot find the matching FID.

    You will have to reset the iterator before starting a new forth.

    In fact, it would be more efficient if you use forth(<search by list>) with while loop.

    Here is an example

    ElementList searchList;

    // specify the set of fids to search for
    searchList.addArray("", OmmArray().addInt(5).addInt(22).addInt(25).addInt(30).addInt(31).complete()).complete();

    while ( fl.forth( searchList ) ) // search for a set of matching fids
    {
    const FieldEntry& fe = fl.getEntry();

    cout << "Name: " << fe.getName() << " Value: ";

    if ( fe.getCode() == Data::BlankEnum )
    cout << " blank" << endl;
    else
    switch ( fe.getFieldId() )
    {
    case 5:
    //Do stuff
    break

Answers

  • Hi @gparl

    From what I understand, you want to print both Bid-Bid size and Ask-Ask size, right?

    You have your Bid-Ask in if-else statement, so it will print either one not both.

    If you want to print both Bid and Ask, you should remove 'else'

  • Hi @Warat B,

    The updateMsg has either the Bid or Ask side, not both.

    cout << fl.toString()<<endl;

    the above prints the msg, either bid or ask, works as expected...

    if ( fl.forth(BID_FID) ) { works whenever there are bid data }

    else if(fl.forth(ASK_FID)) { never comes here, despite fl.toString() dumping ASK side data}

    Has anyone used forth() method with field ids? how it suppose to work ?

  • Hi Warat,

    An extra fl.reset() before querying the Ask side did the trick :-)

    the while loop is ok only if you want to dump the data to stdout, if you try to populate internal structures/objects it will get very ugly / messy...

    thanks for helping!