finfree-bybit-ticker/messages/Bybit.py

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)