|
| 1 | +from queue import Queue |
| 2 | +from typing import List, Dict, Iterator |
| 3 | + |
| 4 | +from entities.candle import Candle |
| 5 | +from entities.timespan import TimeSpan |
| 6 | +from pipeline.source import Source |
| 7 | +from providers.binance import BinanceProvider |
| 8 | + |
| 9 | + |
| 10 | +class BinanceRealtimeSource(Source): |
| 11 | + |
| 12 | + def __init__(self, binance_provider: BinanceProvider, symbols: List[str], time_span: TimeSpan): |
| 13 | + self.binance_provider = binance_provider |
| 14 | + self.symbols = symbols |
| 15 | + self.time_span = time_span |
| 16 | + self.queue = Queue() |
| 17 | + |
| 18 | + def read(self) -> Iterator[Candle]: |
| 19 | + for symbol in self.symbols: |
| 20 | + self.binance_provider.start_kline_socket(symbol, self.time_span, self._on_candle) |
| 21 | + |
| 22 | + while self.binance_provider.is_socket_alive(): |
| 23 | + yield self.queue.get() |
| 24 | + |
| 25 | + def _on_candle(self, candle: Candle): |
| 26 | + self.queue.put(candle) |
| 27 | + |
| 28 | + def serialize(self) -> Dict: |
| 29 | + obj = super().serialize() |
| 30 | + obj.update({ |
| 31 | + 'binanceProvider': self.binance_provider.serialize(), |
| 32 | + 'symbols': self.symbols, |
| 33 | + 'timeSpan': self.time_span.value, |
| 34 | + }) |
| 35 | + return obj |
| 36 | + |
| 37 | + @classmethod |
| 38 | + def deserialize(cls, data: Dict): |
| 39 | + provider = BinanceProvider.deserialize(data.get('binanceProvider')) |
| 40 | + return cls(provider, data.get('symbols'), TimeSpan(data.get('timeSpan'))) |
0 commit comments