Requesting Watchlist Data

Streaming market data values corresponding to data shown in TWS watchlists is available via the IBApi.EClient.reqMktData . This data is not tick-by-tick but consists of aggregate snapshots taken several times per second. A set of 'default' tick types are returned by default from a call to IBApi.EClient.reqMktData , and additional tick types are available by specifying the corresponding generic tick type in the market data request. Including the generic tick types many, but not all, types of data are available that can be displayed in TWS watchlists by adding additional columns. Each market data request uses a unique identifier (ticker ID) which identifies the returned data:

** Python **

self.reqMktData(1000, ContractSamples.USStockAtSmart(), "", False, False, [])
self.reqMktData(1001, ContractSamples.StockComboContract(), "", False, False, [])

** Java **

client.reqMktData(1001, ContractSamples.StockComboContract(), "", false, false, null);

Generic Tick Types

The most common tick types are delivered automatically after a successful market data request. There are however other tick types available by explicit request: the generic tick types. When invoking IBApi.EClient.reqMktData, specific generic ticks can be requested via the genericTickList parameter of the function:

** Python **

# Requesting RTVolume (Time & Sales), shortable and Fundamental Ratios generic ticks

self.reqMktData(1004, ContractSamples.USStockAtSmart(), "233,236,258", False, False, [])

** Java **

//Requesting RTVolume (Time & Sales), shortable and Fundamental Ratios generic ticks
client.reqMktData(1004, ContractSamples.USStockAtSmart(), "233,236,258", false, false, null);

For a list of available tick types please refer to Available Tick Types

Streaming Data Snapshots

With an exchange market data subscription, such as Network A (NYSE), Network B (ARCA), or Network C (NASDAQ) for US stocks, it is possible to request a snapshot of the current state of the market once instead of requesting a stream of updates continuously as market values change. By invoking the IBApi.EClient.reqMktData function passing in true for the snapshot parameter, the client application will receive the currently available market data once before a IBApi.EWrapper.tickSnapshotEnd event is sent 11 seconds later. Snapshot requests can only be made for the default tick types; no generic ticks can be specified. It is important to note that a snapshot request will only return available data over the 11 second span; in some cases values may not be returned for all tick types.

Snapshot request:

** Python **

self.reqMktData(1002, ContractSamples.FutureComboContract(), "", True, False, [])

** Java **

client.reqMktData(1003, ContractSamples.FutureComboContract(), "", true, false, null);

End marker reception:

** Python **

class TestWrapper(wrapper.EWrapper):

def tickSnapshotEnd(self, reqId: int):
print("TickSnapshotEnd. TickerId:", reqId)

** Java **

public class EWrapperImpl implements EWrapper {

    public void tickSnapshotEnd(int reqId) {
        System.out.println("TickSnapshotEnd: "+reqId);

Regulatory Snapshots

The fifth argument to reqMktData specifies a regulatory snapshot request to US stocks and options. Regulatory snapshots require TWS/IBG v963 and API 973.02 or higher and specific market data subscriptions.

For stocks, there are individual exchange-specific market data subscriptions necessary to receive streaming quotes. For instance, for NYSE stocks this subscription is known as "Network A", for ARCA/AMEX stocks it is called "Network B" and for NASDAQ stocks it is "Network C". Each subscription is added a la carte and has a separate market data fee.

Alternatively, there is also a "US Securities Snapshot Bundle" subscription which does not provide streaming data but which allows for real time calculated snapshots of US market NBBO prices. By setting the 5th parameter in the function IBApi.EClient.reqMktData to True, a regulatory snapshot request can be made from the API. The returned value is a calculation of the current market state based on data from all available exchanges.

[!WARNING] Each regulatory snapshot made will incur a fee of 0.01 USD to the account. This applies to both live and paper accounts.. If the monthly fee for regulatory snapshots reaches the price of a particular 'Network' subscription, the user will automatically be subscribed to that Network subscription for continuous streaming quotes and charged the associated fee for that month. At the end of the month the subscription will be terminated. Each listing exchange will be capped independently and will not be combined across listing exchanges.

** Python **

# Each regulatory snapshot request incurs a 0.01 USD fee
self.reqMktData(1003, ContractSamples.USStock(), "", False, True, [])

** Java **

// Each regulatory snapshot request incurs a 0.01 USD fee
client.reqMktData(1014, ContractSamples.USStock(), "", false, true, null);

The following table lists the cost and maximum allocation for regulatory snapshot quotes:

Listed Network Feed Price per reqSnapshot request Pro or non-Pro Max reqSnapshot request
NYSE (Network A/CTA) 0.01 USD Pro 4500
NYSE (Network A/CTA) 0.01 USD Non-Pro 150
AMEX (Network B/CTA) 0.01 USD Pro 2300
AMEX (Network B/CTA) 0.01 USD Non-Pro 150
NASDAQ (Network C/UTP) 0.01 USD Pro 2300
NASDAQ (Network C/UTP) 0.01 USD Non-Pro 150

Requesting regulatory snapshots is subject to pacing limitations:

  • If markets are closed, no more than two requests can be made in a 5 second period.
  • If markets are open, there can be no more than 5 requests pending for the same contract.