lob-orderbook 0.1.1

High-performance limit order book with real-time market depth updates, NATS integration, and SQLite metrics
Documentation
import random
import json
import time
import asyncio
import nats

SYMBOLS = [
    "RELIANCE",
    "TCS",
    "INFY",
    "HDFCBANK",
    "ICICIBANK",
    "SBIN",
    "HDFC",
    "BAJFINANCE",
    "NSE_INR_BANKNIFTY_INDEX",
    "LT",
]

NATS_SERVER = "nats://localhost:4222"
SUBJECT = "marketdepth.data"
RATE = 20000.0  # messages per second

def generate_levels(count, base_price):
    levels = []
    for i in range(count):
        price = round((base_price + random.uniform(-10, 10) + (i * 0.1)), 2)
        quantity = random.randint(1, 100)
        levels.append([price, quantity])
    return levels

async def publish_messages():
    nc = await nats.connect(NATS_SERVER)
    print(f"Connected to NATS server at {NATS_SERVER}")
    delay = 1.0 / RATE
    
    while True:
        symbol = random.choice(SYMBOLS)
        current_time = int(time.time() * 1000)  # milliseconds
        
        # Random depth between 1-20 levels
        depth = random.randint(1, 20)
        
        # Generate market data
        market_data = {
            "exch_timestamp": current_time,
            "unified_symbol": symbol,
            "bids": generate_levels(depth, 100.0),
            "asks": generate_levels(depth, 101.0),
        }
        
        message = json.dumps(market_data).encode()
        
        # # # Uncomment to debug TCS messages
        # if symbol == "NSE_INR_BANKNIFTY_INDEX":
        #     print(f"Publishing message for NSE_INR_BANKNIFTY_INDEX (depth: {depth}): {message.decode()}")
        
        await nc.publish(SUBJECT, message)
        await asyncio.sleep(delay)

async def main():
    await publish_messages()

if __name__ == "__main__":
    asyncio.run(main())