IB@stoqey/ib
@stoqey/ibkr (High-Level Wrapper)Market Data

Market Data & Contract Search

Resolving contracts, fetching historical bars, streaming real-time bars, and tick data with MarketDataManager.

Overview (MarketDataManager)

MarketDataManager.Instance provides streamlined methods for resolving IBKR contracts, querying historical price bars, subscribing to real-time candlestick updates, and receiving tick-by-tick market data.


1. Resolving Contracts

Use getContract() to resolve full contract details from simple search parameters:

import ibkr, { MarketDataManager } from "@stoqey/ibkr";

await ibkr();

const mkdManager = MarketDataManager.Instance;

// Resolve Stock Contract
const stockContract = await mkdManager.getContract({
  symbol: "AAPL",
  secType: "STK",
  exchange: "SMART",
  currency: "USD",
});

// Resolve Option Contract
const optionContract = await mkdManager.getContract({
  symbol: "AAPL",
  secType: "OPT",
  right: "C",
  strike: 250,
  multiplier: 100,
  currency: "USD",
  exchange: "SMART",
});

To search for all matching contract descriptions matching a query:

const matches = await mkdManager.searchContracts({
  symbol: "ES",
  secType: "FUT",
});

2. Fetching Historical Bars

getHistoricalData() returns OHLCV candlestick bars asynchronously:

import { BarSizeSetting, WhatToShow } from "@stoqey/ib";

const bars = await mkdManager.getHistoricalData(
  stockContract,
  undefined,                  // endDateTime (undefined = now)
  "1 D",                      // durationStr ("1 D", "1 W", "1 M")
  BarSizeSetting.MINUTES_FIVE, // barSizeSetting
  WhatToShow.TRADES,          // whatToShow
  true                        // useRTH (Regular Trading Hours)
);

console.log(`Fetched ${bars.length} historical bars!`);

3. Real-Time Bar Updates

Subscribe to live streaming candlestick bar updates using getHistoricalDataUpdates() and IBKREvents:

import { IBKREvents, IBKREVENTS } from "@stoqey/ibkr";
import type { MarketData } from "@stoqey/ibkr";
import { BarSizeSetting, WhatToShow } from "@stoqey/ib";

// Listen for live bar updates
IBKREvents.Instance.on(IBKREVENTS.IBKR_BAR, (bar: MarketData) => {
  console.log(`[Bar Update] ${bar.instrument?.symbol} | Close: $${bar.close} | Vol: ${bar.volume}`);
});

// Request historical data updates
await mkdManager.getHistoricalDataUpdates(
  stockContract,
  BarSizeSetting.SECONDS_FIVE,
  WhatToShow.TRADES
);

// Unsubscribe when finished:
// mkdManager.removeHistoricalDataUpdates(stockContract);

4. Tick-by-Tick Market Data Updates

getTickByTickDataUpdates() streams individual tick trades, updates portfolio valuations, aggregates ticks into 1-second bars, and emits them via IBKR_BAR:

await mkdManager.getTickByTickDataUpdates(stockContract);

// Unsubscribe when finished:
// mkdManager.removeTickByTickDataUpdates(stockContract);

Historical Ticks

const historicalTicks = await mkdManager.getHistoricalTicksLast(
  stockContract,
  new Date("2026-01-15T14:30:00Z"),
  new Date("2026-01-15T15:30:00Z"),
  1000, // max count
  false
);

5. Instant Quotes (getQuote)

Retrieve the latest cached quote snapshot or a point-in-time quote at a target timestamp:

// Latest quote
const latestQuote = await mkdManager.getQuote(stockContract);

// Point-in-time quote
const pastQuote = await mkdManager.getQuote(stockContract, new Date("2026-01-15T15:30:00Z"));

On this page