summaryrefslogtreecommitdiff
path: root/services/data-collector/src/data_collector
diff options
context:
space:
mode:
Diffstat (limited to 'services/data-collector/src/data_collector')
-rw-r--r--services/data-collector/src/data_collector/main.py13
-rw-r--r--services/data-collector/src/data_collector/ws_factory.py33
2 files changed, 43 insertions, 3 deletions
diff --git a/services/data-collector/src/data_collector/main.py b/services/data-collector/src/data_collector/main.py
index 4384985..b393cc2 100644
--- a/services/data-collector/src/data_collector/main.py
+++ b/services/data-collector/src/data_collector/main.py
@@ -9,9 +9,15 @@ from shared.logging import setup_logging
from shared.metrics import ServiceMetrics
from shared.notifier import TelegramNotifier
-from data_collector.binance_ws import BinanceWebSocket
from data_collector.config import CollectorConfig
from data_collector.storage import CandleStorage
+from data_collector.ws_factory import create_websocket
+
+
+# Health check port: base (HEALTH_PORT, default 8080) + offset
+# data-collector: +0 (8080), strategy-engine: +1 (8081)
+# order-executor: +2 (8082), portfolio-manager: +3 (8083)
+HEALTH_PORT_OFFSET = 0
async def run() -> None:
@@ -43,14 +49,15 @@ async def run() -> None:
# Use the first configured timeframe for the WebSocket subscription.
timeframe = config.timeframes[0] if config.timeframes else "1m"
- ws = BinanceWebSocket(
+ ws = create_websocket(
+ exchange_id=config.exchange_id,
symbols=config.symbols,
timeframe=timeframe,
on_candle=on_candle,
)
health = HealthCheckServer(
- "data-collector", port=config.health_port, auth_token=config.metrics_auth_token
+ "data-collector", port=config.health_port + HEALTH_PORT_OFFSET, auth_token=config.metrics_auth_token
)
health.register_check("redis", broker.ping)
await health.start()
diff --git a/services/data-collector/src/data_collector/ws_factory.py b/services/data-collector/src/data_collector/ws_factory.py
new file mode 100644
index 0000000..b8e2719
--- /dev/null
+++ b/services/data-collector/src/data_collector/ws_factory.py
@@ -0,0 +1,33 @@
+"""WebSocket factory for exchange-specific connections."""
+import logging
+
+from data_collector.binance_ws import BinanceWebSocket
+
+logger = logging.getLogger(__name__)
+
+# Supported exchanges for WebSocket streaming
+SUPPORTED_WS = {"binance": BinanceWebSocket}
+
+
+def create_websocket(exchange_id: str, **kwargs):
+ """Create an exchange-specific WebSocket handler.
+
+ Args:
+ exchange_id: Exchange identifier (e.g. 'binance')
+ **kwargs: Passed to the WebSocket constructor (symbols, timeframe, on_candle)
+
+ Returns:
+ WebSocket handler instance
+
+ Raises:
+ ValueError: If exchange is not supported for WebSocket streaming
+ """
+ ws_cls = SUPPORTED_WS.get(exchange_id)
+ if ws_cls is None:
+ supported = ", ".join(sorted(SUPPORTED_WS.keys()))
+ raise ValueError(
+ f"WebSocket streaming not supported for '{exchange_id}'. "
+ f"Supported: {supported}. "
+ f"Use REST polling as fallback for unsupported exchanges."
+ )
+ return ws_cls(**kwargs)