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 |
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:
{
"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: