Skip to content

ExchangeRegistry

The ExchangeRegistry is the central plugin registration system for the bt_api ecosystem. It implements the Registry Pattern, providing both a global singleton (backward compatible) and isolated instances (for testing and multi-tenant scenarios).

Overview

The registry maps exchange name strings (e.g., "BINANCE___SPOT") to concrete feed class implementations. All exchange plugins register themselves at import time, and the BtApi main class delegates to the registry at runtime.

Key Design: Dual-Mode Descriptor

ExchangeRegistry uses a custom descriptor _ClassMethodOrInstance that adapts behavior based on call context:

  • Class call (ExchangeRegistry.register_feed(...)): Class-level registration
  • Instance call (registry.register_feed(...)): Instance-level isolated registration

This allows the same API to work both as a global singleton and as isolated instances.

Class Reference

ExchangeRegistry

class ExchangeRegistry:

Methods

register_feed(exchange_name: str, feed_class: Type[AbstractVenueFeed]) -> None

Register a feed class to an exchange name.

ExchangeRegistry.register_feed("BINANCE___SPOT", BinanceSpotFeed)
unregister_feed(exchange_name: str) -> None

Unregister a feed class from an exchange name.

ExchangeRegistry.unregister_feed("BINANCE___SPOT")
create_feed(exchange_name: str, data_queue: Queue, **kwargs) -> AbstractVenueFeed

Create an instance of the registered feed class.

feed = ExchangeRegistry.create_feed("BINANCE___SPOT", data_queue)
get_registered_feed(exchange_name: str) -> Optional[Type[AbstractVenueFeed]]

Retrieve the registered feed class without instantiation.

feed_class = ExchangeRegistry.get_registered_feed("BINANCE___SPOT")
is_registered(exchange_name: str) -> bool

Check if an exchange name is registered.

if ExchangeRegistry.is_registered("BINANCE___SPOT"):
    ...
list_registered() -> List[str]

List all registered exchange names.

exchanges = ExchangeRegistry.list_registered()
create_isolated() -> "ExchangeRegistry"

Factory method to create an isolated registry instance.

registry = ExchangeRegistry.create_isolated()
registry.register_feed("TEST___SPOT", MockFeed)

Singleton vs Isolated

Global singleton (backward compatible):

from bt_api_base.registry import ExchangeRegistry

ExchangeRegistry.register_feed("BINANCE___SPOT", BinanceSpotFeed)
feed = ExchangeRegistry.create_feed("BINANCE___SPOT", data_queue)

Isolated instance (for testing):

registry = ExchangeRegistry.create_isolated()
registry.register_feed("TEST___SPOT", MockFeed)
feed = registry.create_feed("TEST___SPOT", data_queue)


中文

概述

ExchangeRegistry 是 bt_api 生态系统的中央插件注册系统。它实现了注册表模式,同时提供全局单例(向后兼容)和隔离实例(用于测试和多租户场景)。

核心设计:双模式描述符

ExchangeRegistry 使用自定义描述符 _ClassMethodOrInstance,根据调用上下文自适应行为:

  • 类调用 (ExchangeRegistry.register_feed(...)): 类级注册
  • 实例调用 (registry.register_feed(...)): 实例级隔离注册

主要方法

方法 说明
register_feed(name, cls) 注册 feed 类到交易所名称
unregister_feed(name) 取消注册
create_feed(name, queue, **kwargs) 创建 feed 实例
get_registered_feed(name) 获取已注册的 feed 类
is_registered(name) 检查是否已注册
list_registered() 列出所有已注册名称
create_isolated() 创建隔离的注册表实例

使用示例

from bt_api_base.registry import ExchangeRegistry

# 全局单例
ExchangeRegistry.register_feed("BINANCE___SPOT", BinanceSpotFeed)
feed = ExchangeRegistry.create_feed("BINANCE___SPOT", data_queue)

# 隔离实例
registry = ExchangeRegistry.create_isolated()
registry.register_feed("TEST___SPOT", MockFeed)