from pybit.unified_trading import WebSocket
from time import sleep




# Tick 데이터 형식 정의
tick_dict = {
    'timestamp_ms': int,     # 밀리초 단위의 타임스탬프
    'symbol': str,           # 거래 심볼
    'side': str,             # 매수/매도 측 (예: "Buy", "Sell")
    'volume_base': str,      # 기본 통화의 거래량 (문자열로 처리)
    'volume_quote': str,     # 기준 통화의 거래량 (문자열로 처리)
    'block_trade': str       # 블록 거래 여부 (문자열로 처리)
}

# 메시지 핸들러 함수 정의
def handle_message(message):
    if 'data' in message:
        data = message['data']
        for tick_data in data:
            # 필요한 항목만 추출하여 dictionary로 정리
            tick_info = {
                'timestamp_ms': int(tick_data.get('T', 0)),  # 정수형
                'symbol': str(tick_data.get('s', '')),       # 문자열
                'side': str(tick_data.get('S', '')),         # 문자열
                'volume_base': str(tick_data.get('v', '')),  # 문자열
                'volume_quote': str(tick_data.get('p', '')), # 문자열
                'block_trade': str(tick_data.get('BT', ''))  # 문자열
            }
            # 출력 또는 이후 처리
            print("Processed Tick Data:", tick_info)
    else:
        print("Received Message without 'data' field:", message)


def main():
    # WebSocket 객체 생성
    ws = WebSocket(
        testnet=False,    # 실제 거래가 아닌 테스트넷을 사용할 경우 True로 설정
        channel_type="linear"  # 리니어 채널 설정
    )



    # 다수의 거래 데이터 구독
    symbols = ["BTCUSDT", "ETHUSDT", "SOLUSDT", "SUIUSDT", "XRPUSDT"]
    ws.trade_stream(
        symbol=symbols,    # 구독할 심볼 설정
        callback=handle_message  # 데이터 수신 시 호출될 콜백 함수
    )

    # 데이터 수신 대기
    try:
        while True:
            sleep(1)  # 1초마다 반복
    except KeyboardInterrupt: # CTRL C 
        print("Interrupted by user")

if __name__ == "__main__":
    main()