Level 2 Market Depth Data

In all the examples thus far we have requested the default MarketPrice domain which represents Quote & Trade data and is also referred to as Level 1 data.

In addition to MarketPrice data, it is also possible to request Level 2 data from Refinitiv Real-time, which represents a more comprehensive and deeper representation of current Market activity. Some examples of Level 2 data are:

Domain Model

Also known as

Description

MarketByPrice

Market Depth Aggregated

Order Book

Collection of orders for an instrument grouped by Price point i.e. multiple orders per ‘row’ of data

MarketByOrder

Detailed Order Book

Unique orders i.e. each ‘row’ represents a single order

MarketMaker

Market Participants

Market maker content where quotes from a single market maker reside within a single ‘row’

To request Level 2 data, we need to override the default Domain attribute with the required Domain type, so for example to request the Detailed Order Book for an instrument:

    	
            

{

  "ID":2,

  "Key":{

    "Name":"VOD.L"

  },

  "Domain":"MarketByOrder"

}

Note the Domain type of MarketByOrder

Assuming that MarketByOrder data is available for the requested RIC, we should receive something like the following:

MarketByOrder Refresh Responses

    	
            

  {

    "Complete":false,

    "Domain":"MarketByOrder",

    "ID":3,

    "Key":{

      "Name":"VOD.L",

      "Service":"ELEKTRON_DD"

    },

    "Map":{

      "CountHint":778,

      "Entries":[

        {

          "Action":"Add",

          "Fields":{

            "LV_TIM_MS":59491136,

            "LV_TIM_NS":"16:31:31.136",

            "MMID":null,

            "ORDER_ID":"527404153393082087",

            "ORDER_PRC":136.26,

...

...

            "PR_TIM_NS":"16:31:31.136"

          },

          "Key":"NTI3NDA0MTUzMzkzMDgyMDg3"

        },

        {

          "Action":"Add",

          "Fields":{

            "LV_TIM_MS":59400547,

            "LV_TIM_NS":"16:30:00.547",

...

...

   },

    "Type":"Refresh"

  }

 

  {

    "ClearCache":false,

    "Complete":false,

    "Domain":"MarketByOrder",

    "ID":3,

    "Key":{

      "Name":"VOD.L",

      "Service":"ELEKTRON_DD"

    },

    "Map":{

      "Entries":[

        {

          "Action":"Add",

          "Fields":{

            "LV_TIM_MS":43345759,

            "LV_TIM_NS":"12:02:25.759",

...

...

   },

    "Type":"Refresh"

  }

 

  {

    "ClearCache":false,

    "Domain":"MarketByOrder",

    "ID":3,

    "Key":{

      "Name":"VOD.L",

      "Service":"ELEKTRON_DD"

    },

    "Map":{

      "Entries":[

        {

          "Action":"Add",

          "Fields":{

            "LV_TIM_MS":59400547,

...

...

   },

    "Type":"Refresh"

  }

Notice that unlike the MarketPrice request where we only receive a single Refresh message, with Level 2 data we can receive multiple Refresh messages – particularly for heavily traded instruments with a deep Order Book.

NOTE: all but the final Refresh Messages have an attribute of Complete: false – and the final Refresh does not have this attribute (the default value for Complete is true).

What this means is that when processing Level 2 data Refresh messages, we must not mark the data delivery as Complete – until a Refresh without a Complete: false attribute has been received.

Furthermore, if we request Level 2 data for multiple RICs (e.g. a Batch request), the full set of Refresh Message for a particular RIC may not arrive contiguously. It is possible to receive a Refresh Message for one RIC interspersed between Refresh Messages for other RICs we requested.

If you are a Refinitiv Real-Time Data Contributor you may be interested in the the next Tutorial on Contributing data - otherwise please skip to the Closing Summary where you will also find links to examples, documentation etc:

Contributing Data to Refinitiv Real-Time   Skip to Closing Summary