Skip to content

Changelog

All notable changes to qldata are documented here.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[0.3.0] - 2025-12-05

Added

  • Resilience by Default: qd.stream() now enables auto-reconnect, rate limiting, sequence tracking, and time sync by default
  • ResilienceConfig: New configuration class for customizing resilience behavior
  • RateLimitManager: Intelligent rate limit handling for API calls
  • SequenceTracker: Detect and log missing messages in streams
  • TimeSyncManager: Clock synchronization with exchange servers
  • DataQualityMonitor: Real-time latency, throughput, and staleness tracking
  • AlertManager: Callback-based alerting for production systems
  • ConnectionStateManager: Track connection state transitions

Changed

  • Streaming sessions now include resilience features by default
  • Improved WebSocket reconnection with exponential backoff
  • Better error messages for connection failures

Fixed

  • WebSocket connection drops no longer cause data loss
  • Rate limit handling for high-frequency queries
  • Timestamp handling for Bybit linear contracts

[0.2.0] - 2025-11-15

Added

  • Fluent API: New chainable query builder for qd.data() and qd.stream()
  • Transform Pipeline: clean(), fill_forward(), resample() methods
  • Bybit Support: Full support for Bybit spot and linear perpetuals
  • Multi-Symbol Queries: Parallel downloads for multiple symbols
  • Symbol Discovery: list_symbols() with filtering options

Changed

  • Unified API design across all data sources
  • Improved DataFrame column naming consistency
  • Better timezone handling (all UTC)

Deprecated

  • Old-style positional arguments (use keyword arguments)

[0.1.0] - 2025-10-01

Added

  • Initial release
  • Binance spot and USDM futures support
  • Historical data fetching with qd.data()
  • Live streaming with qd.stream()
  • Basic data models (Bar, Tick, OrderBook)
  • Symbol information API
  • Parquet and DuckDB storage backends

Upgrade Guide

0.2.x → 0.3.0

Resilience is now enabled by default. To opt out:

# Disable resilience
stream = qd.stream(["BTCUSDT"], source="binance") \
    .resolution("tick") \
    .on_data(handler) \
    .get(start=True, resilience=False)

0.1.x → 0.2.0

Update to fluent API style:

# Old style (deprecated)
df = qd.get_bars("BTCUSDT", "binance", days=30, resolution="1h")

# New style (recommended)
df = qd.data("BTCUSDT", source="binance") \
    .last(30) \
    .resolution("1h") \
    .get()