파이썬/바이낸스 선물 웹소켓

[선물 WS] 1분, 20분 상승 순위 실시간 출력하기

Eluv 2024. 12. 8. 12:07
import asyncio
import websockets
import requests
import json
import time
import ccxt

with open("D:/코인/binance key.txt") as f:
    lines = f.readlines()
    api_key = lines[0].strip()
    secret_key = lines[1].strip()

Futures_binance = ccxt.binanceusdm({
    'options': {
        'defaultType': 'future',
    }
})

url = 'https://fapi.binance.com/fapi/v1/ticker/bookTicker'
data = requests.get(url).json()

All_USDT_Ticker = {}
current_price = {}
price_history = {}
volume = {}
for x in data:
    if x['symbol'].endswith('USDT'):
        All_USDT_Ticker[x['symbol']] = float(x['bidPrice'])
        current_price[x['symbol']] = float(x['bidPrice'])
        price_history[x['symbol']] = [float(x['bidPrice'])]
        volume[x['symbol']] = 0
t = int(time.strftime('%M'))

async def ALL_Market_Ticker_Stream_1h():
    t = time.strftime('%M')
    uri = 'wss://fstream.binance.com/ws/!ticker@arr'
    async with websockets.connect(uri) as websocket:
        try:
            while True:
                data = json.loads(await websocket.recv())
                
                # 마지막 가격, 거래대금 업데이트
                for d in data :
                    if d['s'] in current_price and d['s'].endswith('USDT'):
                        current_price[d['s']] = float(d['c'])
                        volume[d['s']] = int(float(d['q']))

                if t != time.strftime('%M') :
                    # 1분 상승률 계산
                    percentage_changes = {}
                    for s in All_USDT_Ticker :
                        percentage_changes[s] = ((current_price[s] - All_USDT_Ticker[s]) / All_USDT_Ticker[s]) * 100
                        All_USDT_Ticker[s] = current_price[s]
                    top_gainers = sorted(percentage_changes.items(), key=lambda x: x[1], reverse=True)[:5]
                    print(f"\n----- {time.strftime('%H:%M')} -----\n[1분 동안 가장 많이 상승한 종목 Top 5]")
                    for rank, (symbol, change) in enumerate(top_gainers, start=1):
                        print(f"{rank}. {symbol:<12}: {change:>6.2f}%, 거래대금: {volume[symbol]:,}")

                    # 20분 상승률 계산
                    percentage_changes_20min = {}
                    for symbol, prices in price_history.items():
                        price_history[symbol].append(current_price[symbol])
                        if len(price_history[d['s']]) > 20:
                            price_history[symbol].pop(0)
                        start_price = prices[0]
                        end_price = prices[-1]
                        percentage_changes_20min[symbol] = ((end_price - start_price) / start_price) * 100

                    top_gainers_20min = sorted(percentage_changes_20min.items(), key=lambda x: x[1], reverse=True)[:5]
                    print(f"\n[20분 동안 가장 많이 상승한 종목 Top 5]")
                    for rank, (symbol, change) in enumerate(top_gainers_20min, start=1):
                        print(f"{rank}. {symbol:<12}: {change:>6.2f}% , 거래대금: {volume[symbol]:,}")

                    t = time.strftime('%M')

        except websockets.exceptions.ConnectionClosedOK:
            await websocket.close()
            print("웹소켓 연결이 종료되었습니다.")
        except asyncio.CancelledError:
            print("작업이 취소되었습니다.")
            await websocket.close()
            return
        except Exception as e:
            await websocket.close()
            print(f'ALL_Market_Ticker_Stream_1h 오류: {e}')

async def main():
    tasks = [
        asyncio.create_task(ALL_Market_Ticker_Stream_1h())
    ]
    try:
        await asyncio.gather(*tasks)
    except asyncio.CancelledError:
        print("메인 작업이 취소되었습니다.")
        for task in tasks:
            task.cancel()
        await asyncio.gather(*tasks, return_exceptions=True)
    except Exception as e:
        print(f"메인 함수에서 예외가 발생했습니다: {e}")
    finally:
        print("메인 함수의 작업이 종료되었습니다.")

if __name__ == '__main__':
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("프로그램을 종료합니다.")

 

 

출력 결과

----- 11:59 -----
[1분 동안 가장 많이 상승한 종목 Top 5]
1. MEWUSDT     :   0.63%, 거래대금: 99,334,977
2. ACTUSDT     :   0.58%, 거래대금: 384,123,796
3. 1000BONKUSDT:   0.40%, 거래대금: 445,534,091
4. XEMUSDT     :   0.26%, 거래대금: 21,784,508
5. LINAUSDT    :   0.13%, 거래대금: 11,714,626

[20분 동안 가장 많이 상승한 종목 Top 5]
1. 1000PEPEUSDT:   2.23% , 거래대금: 3,446,569,792
2. 1000XUSDT   :   2.05% , 거래대금: 189,355,147
3. MEWUSDT     :   1.52% , 거래대금: 99,334,977
4. 1000BONKUSDT:   1.31% , 거래대금: 445,534,091
5. 1000RATSUSDT:   1.22% , 거래대금: 61,766,153

 

 

1분마다 1분 동안, 최근 20분 동안

가장 많이 상승한 종목 5개를 선별합니다.

 

20분은 바이낸스에서 제공되지 않아서

1분마다 가격을 저장해서 가장 예전 가격, 최근가격을 비교합니다.

 

리스트의 길이가 20개가 채워지기 전까진 코드를 실행한 이후

가장 많이 상승한 종목을 출력하는 셈입니다.

20개가 채워지면 20분전 대비 상승률로 정상적으로 계산됩니다.

 

여기에서 사용된 전체 시장 티커의 가격 정보는

실제 차트와는 다소 오차가 있을 수 있습니다.