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분전 대비 상승률로 정상적으로 계산됩니다.
여기에서 사용된 전체 시장 티커의 가격 정보는
실제 차트와는 다소 오차가 있을 수 있습니다.
'파이썬 > 바이낸스 선물 웹소켓' 카테고리의 다른 글
[선물 WS] 실시간 체결 확인하기 (0) | 2024.12.01 |
---|---|
[선물 WS] 호가창 일부분 실시간 (0) | 2024.12.01 |
[선물 WS] 전체 시장 청산 주문 금액 1분마다 확인하기 (0) | 2024.11.24 |
[선물 WS] 차트 데이터 실시간으로 받기 (Kline Stream) (0) | 2023.06.18 |
[선물 WS] 주문 체결, 지갑 정보 전달받기 (User Data Stream) (0) | 2023.06.12 |