| name | market-data |
| description | Market data retrieval with OpenAlgo - real-time quotes, historical OHLCV, market depth, option chains, WebSocket streaming, and symbol search |
OpenAlgo Market Data
Access real-time and historical market data using OpenAlgo's unified Python SDK. Supports REST API for on-demand data and WebSocket for real-time streaming.
Environment Setup
from openalgo import api
# REST API only
client = api(
api_key='your_api_key_here',
host='http://127.0.0.1:5000'
)
# With WebSocket streaming
client = api(
api_key='your_api_key_here',
host='http://127.0.0.1:5000',
ws_url='ws://127.0.0.1:8765',
verbose=True # Enable connection logs
)
Quick Start Scripts
Get Quotes
python scripts/quotes.py --symbol RELIANCE --exchange NSE
python scripts/quotes.py --symbols RELIANCE,TCS,INFY --exchange NSE
Get Historical Data
python scripts/history.py --symbol SBIN --exchange NSE --interval 5m --start 2025-01-01 --end 2025-01-15
Get Market Depth
python scripts/depth.py --symbol SBIN --exchange NSE
Stream Live Data
python scripts/stream.py --symbols NIFTY,BANKNIFTY --exchange NSE_INDEX --mode ltp
REST API Methods
1. Single Quote
Get current market quote for a symbol:
response = client.quotes(symbol="RELIANCE", exchange="NSE")
Response:
{
"status": "success",
"data": {
"open": 1172.0,
"high": 1196.6,
"low": 1163.3,
"ltp": 1187.75,
"ask": 1188.0,
"bid": 1187.85,
"prev_close": 1165.7,
"volume": 14414545
}
}
2. Multiple Quotes
Get quotes for multiple symbols in one call:
response = client.multiquotes(symbols=[
{"symbol": "RELIANCE", "exchange": "NSE"},
{"symbol": "TCS", "exchange": "NSE"},
{"symbol": "INFY", "exchange": "NSE"},
{"symbol": "NIFTY", "exchange": "NSE_INDEX"}
])
Response:
{
"status": "success",
"results": [
{
"symbol": "RELIANCE",
"exchange": "NSE",
"data": {
"open": 1542.3,
"high": 1571.6,
"low": 1540.5,
"ltp": 1569.9,
"prev_close": 1539.7,
"ask": 1569.9,
"bid": 1569.8,
"oi": 0,
"volume": 14054299
}
},
...
]
}
3. Market Depth (Level 2)
Get order book with 5 best bid/ask levels:
response = client.depth(symbol="SBIN", exchange="NSE")
Response:
{
"status": "success",
"data": {
"open": 760.0,
"high": 774.0,
"low": 758.15,
"ltp": 769.6,
"ltq": 205,
"prev_close": 746.9,
"volume": 9362799,
"oi": 161265750,
"totalbuyqty": 591351,
"totalsellqty": 835701,
"asks": [
{"price": 769.6, "quantity": 767},
{"price": 769.65, "quantity": 115},
{"price": 769.7, "quantity": 162},
{"price": 769.75, "quantity": 1121},
{"price": 769.8, "quantity": 430}
],
"bids": [
{"price": 769.4, "quantity": 886},
{"price": 769.35, "quantity": 212},
{"price": 769.3, "quantity": 351},
{"price": 769.25, "quantity": 343},
{"price": 769.2, "quantity": 399}
]
}
}
4. Historical Data (OHLCV)
Get historical candlestick data:
response = client.history(
symbol="SBIN",
exchange="NSE",
interval="5m",
start_date="2025-01-01",
end_date="2025-01-15"
)
Response (Pandas DataFrame):
close high low open volume
timestamp
2025-01-01 09:15:00+05:30 772.50 774.00 763.20 766.50 318625
2025-01-01 09:20:00+05:30 773.20 774.95 772.10 772.45 197189
2025-01-01 09:25:00+05:30 775.15 775.60 772.60 773.20 227544
...
Available Intervals:
response = client.intervals()
# Returns: {'minutes': ['1m', '3m', '5m', '10m', '15m', '30m'],
# 'hours': ['1h'], 'days': ['D']}
5. Option Chain
Get complete option chain for an underlying:
chain = client.optionchain(
underlying="NIFTY",
exchange="NSE_INDEX",
expiry_date="30JAN25",
strike_count=10 # ±10 strikes from ATM (optional)
)
Response:
{
"status": "success",
"underlying": "NIFTY",
"underlying_ltp": 26215.55,
"expiry_date": "30JAN25",
"atm_strike": 26200.0,
"chain": [
{
"strike": 26100.0,
"ce": {
"symbol": "NIFTY30JAN2526100CE",
"label": "ITM2",
"ltp": 490,
"bid": 490,
"ask": 491,
"volume": 1195800,
"oi": 5000000,
"lotsize": 75
},
"pe": {
"symbol": "NIFTY30JAN2526100PE",
"label": "OTM2",
"ltp": 193,
"bid": 191.2,
"ask": 193,
"volume": 1832700,
"oi": 4500000,
"lotsize": 75
}
},
...
]
}
6. Expiry Dates
Get available expiry dates:
response = client.expiry(
symbol="NIFTY",
exchange="NFO",
instrumenttype="options" # or "futures"
)
# Returns: ['30-JAN-25', '06-FEB-25', '13-FEB-25', ...]
Symbol Search & Discovery
Search Symbols
response = client.search(query="NIFTY 26000 JAN CE", exchange="NFO")
Response:
{
"status": "success",
"message": "Found 7 matching symbols",
"data": [
{
"symbol": "NIFTY30JAN2526000CE",
"exchange": "NFO",
"expiry": "30-JAN-25",
"strike": 26000,
"instrumenttype": "CE",
"lotsize": 75
},
...
]
}
Get Symbol Details
response = client.symbol(symbol="NIFTY30JAN25FUT", exchange="NFO")
Response:
{
"status": "success",
"data": {
"symbol": "NIFTY30JAN25FUT",
"exchange": "NFO",
"name": "NIFTY",
"expiry": "30-JAN-25",
"instrumenttype": "FUT",
"lotsize": 75,
"freeze_qty": 1800,
"tick_size": 10
}
}
Get All Instruments
Download complete instrument list for an exchange:
instruments = client.instruments(exchange="NSE")
# Returns Pandas DataFrame with all symbols
WebSocket Streaming
Connection Setup
from openalgo import api
import time
client = api(
api_key='your_api_key',
host='http://127.0.0.1:5000',
ws_url='ws://127.0.0.1:8765',
verbose=True # Show connection logs
)
# Connect to WebSocket
client.connect()
Verbose Levels
| Level | Value | Description |
|---|---|---|
| Silent | False or 0 |
Errors only (default) |
| Basic | True or 1 |
Connection, auth, subscription logs |
| Debug | 2 |
All market data updates |
Stream LTP (Last Traded Price)
instruments = [
{"exchange": "NSE", "symbol": "RELIANCE"},
{"exchange": "NSE", "symbol": "INFY"},
{"exchange": "NSE_INDEX", "symbol": "NIFTY"}
]
def on_ltp(data):
print(f"{data['symbol']}: {data['data']['ltp']}")
client.subscribe_ltp(instruments, on_data_received=on_ltp)
# Run for 60 seconds
time.sleep(60)
# Cleanup
client.unsubscribe_ltp(instruments)
client.disconnect()
Stream Quotes (OHLC + Bid/Ask)
def on_quote(data):
d = data['data']
print(f"{data['symbol']}: O={d['open']} H={d['high']} L={d['low']} LTP={d['ltp']}")
client.subscribe_quote(instruments, on_data_received=on_quote)
Stream Market Depth
def on_depth(data):
d = data['data']
print(f"{data['symbol']}: Best Bid={d['bids'][0]['price']} Best Ask={d['asks'][0]['price']}")
client.subscribe_depth(instruments, on_data_received=on_depth)
Get Cached Data
Access latest cached data without callback:
# After subscribing
ltp_data = client.get_ltp()
quote_data = client.get_quotes()
depth_data = client.get_depth()
# Access specific symbol
nifty_ltp = ltp_data['ltp']['NSE_INDEX']['NIFTY']['ltp']
Market Information
Trading Holidays
response = client.holidays(year=2025)
Response:
{
"data": [
{
"date": "2025-01-26",
"description": "Republic Day",
"holiday_type": "TRADING_HOLIDAY",
"closed_exchanges": ["NSE", "BSE", "NFO", "MCX"]
},
...
]
}
Exchange Timings
response = client.timings(date="2025-01-15")
Response:
{
"data": [
{"exchange": "NSE", "start_time": 1705293300000, "end_time": 1705315800000},
{"exchange": "BSE", "start_time": 1705293300000, "end_time": 1705315800000},
{"exchange": "MCX", "start_time": 1705293000000, "end_time": 1705346700000}
]
}
Common Patterns
Build a Watchlist
watchlist = [
{"symbol": "NIFTY", "exchange": "NSE_INDEX"},
{"symbol": "BANKNIFTY", "exchange": "NSE_INDEX"},
{"symbol": "RELIANCE", "exchange": "NSE"},
{"symbol": "HDFCBANK", "exchange": "NSE"},
{"symbol": "INFY", "exchange": "NSE"}
]
quotes = client.multiquotes(symbols=watchlist)
for item in quotes.get('results', []):
data = item.get('data', {})
change = ((data['ltp'] - data['prev_close']) / data['prev_close']) * 100
print(f"{item['symbol']}: {data['ltp']} ({change:+.2f}%)")
Fetch Intraday Data
from datetime import date
today = date.today().strftime("%Y-%m-%d")
intraday = client.history(
symbol="NIFTY",
exchange="NSE_INDEX",
interval="1m",
start_date=today,
end_date=today
)
print(f"Today's range: High={intraday['high'].max()}, Low={intraday['low'].min()}")
Monitor Option Chain Changes
import time
while True:
chain = client.optionchain(
underlying="NIFTY",
exchange="NSE_INDEX",
expiry_date="30JAN25",
strike_count=5
)
atm = chain.get('atm_strike')
print(f"\nNIFTY ATM: {atm}, LTP: {chain.get('underlying_ltp')}")
for strike in chain.get('chain', []):
if strike['strike'] == atm:
ce = strike['ce']
pe = strike['pe']
print(f" CE: {ce['ltp']} (Vol: {ce['volume']})")
print(f" PE: {pe['ltp']} (Vol: {pe['volume']})")
time.sleep(5)
Notes
- Use WebSocket for real-time data (lower latency, no rate limits)
- REST API is better for on-demand queries
- Historical data returns Pandas DataFrame for easy analysis
- Option chain includes OI, volume, bid/ask for all strikes
- Use
verbose=2for debugging WebSocket issues