44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
from pybit.unified_trading import WebSocket
|
|
from typing import Callable
|
|
from functools import partial
|
|
from .TickerData import Message, TickerData
|
|
|
|
WS_URL = "wss://stream.bybit.com/v5/public/linear"
|
|
ws = WebSocket(
|
|
testnet=True,
|
|
channel_type="linear",
|
|
)
|
|
|
|
subscribed: set[str] = set()
|
|
lastPrice: dict[str, float] = dict()
|
|
|
|
class Bybit:
|
|
@staticmethod
|
|
def subscribe_symbol(symbol: str, callback: Callable[[TickerData], None]):
|
|
global subscribed
|
|
|
|
if symbol not in subscribed:
|
|
subscribed.add(symbol)
|
|
ws.ticker_stream(
|
|
symbol=symbol,
|
|
callback=lambda m: Bybit.handle_message(m, callback)
|
|
)
|
|
|
|
@staticmethod
|
|
def handle_message(message, callback: Callable[[TickerData], None]):
|
|
msg = Message.from_json(message)
|
|
if msg.data is not None and isinstance(msg.data, TickerData):
|
|
Bybit.handle_tickerdata(msg.data, callback)
|
|
|
|
@staticmethod
|
|
def handle_tickerdata(data: TickerData, callback: Callable[[TickerData], None]):
|
|
global lastPrice
|
|
if data.symbol not in lastPrice or lastPrice[data.symbol] != data.lastPrice:
|
|
lastPrice[data.symbol] = data.lastPrice
|
|
Bybit.handle_new_tickerdata(data, callback)
|
|
|
|
@staticmethod
|
|
def handle_new_tickerdata(data: TickerData, callback: Callable[[TickerData], None]):
|
|
callback(data)
|
|
|