question

Upvotes
Accepted
5 0 0 1

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

elektronrefinitiv-realtimeelektron-sdkrrtema-apielektron-message-api
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 5.0 MiB each and 10.0 MiB total.

Upvotes
Accepted
4.4k 10 6 9

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
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 5.0 MiB each and 10.0 MiB total.

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!

Upvotes
4.4k 10 6 9

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'

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 5.0 MiB each and 10.0 MiB total.

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 ?

Click below to post an Idea Post Idea