파이썬/바이낸스 선물 API

[선물API] 계좌 정보 불러오기

Eluv 2023. 6. 22. 10:18

먼저 API키가 필요합니다.

바이낸스 API키 발급 방법->  바이낸스 API키 발급

 

만약 안되면 사용중인 PC의 시간을 동기화 해줘야 합니다.

윈도우 11 기준 화면 우측 하단에 표기된 시간을 우클릭 후

 날짜 및 시간 조정을 누르신 다음 '지금 동기화'를 누르시면 됩니다.

import requests
import hmac
import hashlib
import time
from pprint import pprint

# 바이낸스 API 키와 시크릿 로드
with open("D:/코인/binance key.txt") as f:
    lines = f.readlines()
    api_key = lines[0].strip()
    secret_key = lines[1].strip()

headers = {
    "X-MBX-APIKEY": api_key,
}

# 바이낸스 API 요청 함수
def binance_api(endpoint, params, method):
    params["timestamp"] = int(time.time() * 1000)
    query_string = "&".join([f"{key}={value}" for key, value in params.items()])
    params["signature"] = hmac.new(secret_key.encode(), query_string.encode(), hashlib.sha256).hexdigest()
    url = "https://fapi.binance.com" + endpoint
    try:
        if method == "GET":
            response = requests.get(url, headers=headers, params=params)
        elif method == "POST":
            response = requests.post(url, headers=headers, params=params)
        else:
            raise ValueError(f"잘못된 요청입니다 : {url}, {endpoint}, {params}, {method}")
        return response.json()
    except requests.exceptions.Timeout:
        print(f"시간 초과 {url}, {endpoint}, {params}, {method}")
    except requests.exceptions.RequestException as e:
        print(f"에러 발생 : {e} \n {url}, {endpoint}, {params}, {method}")

# 계좌 잔액 및 포지션 정보 조회
def fetch_account_info():
    endpoint = "/fapi/v2/account"
    params = {}
    return binance_api(endpoint, params, "GET")


account_info = fetch_account_info()
pprint(account_info)

balance = {'total' : account_info['totalMarginBalance'] ,'Order' : account_info['totalOpenOrderInitialMargin'] ,'Position' : account_info['totalUnrealizedProfit']}
print(balance)

08) 계좌 잔고 조회 - 파이썬을 이용한 비트코인 자동매매 (개정판) (wikidocs.net)

 

 

다음은 출력 결과입니다.

{'assets': [ ..(중략)
            {'asset': 'USDT',
             'availableBalance': '175.17533811',
             'crossUnPnl': '0.00000000',
             'crossWalletBalance': '175.21032339',
             'initialMargin': '0.00000000',
             'maintMargin': '0.00000000',
             'marginAvailable': True,
             'marginBalance': '175.21032339', # 잔고
             'maxWithdrawAmount': '175.21032339', # 사용 가능한 금액
             'openOrderInitialMargin': '0.00000000', # 대기 주문 금액
             'positionInitialMargin': '0.00000000', # 포지션 유지 금액
             'unrealizedProfit': '0.00000000',
             'updateTime': 1733133671800,
             'walletBalance': '175.21032339'},

 

보유중인 코인에 대한 정보입니다.

'positions': [
            {'askNotional': '0',
             'bidNotional': '0',
             'entryPrice': '0.0', # 평단가
             'initialMargin': '0',
             'isolated': False,
             'isolatedWallet': '0',
             'leverage': '10', # 레버리지 배율
             'maintMargin': '0',
             'maxNotional': '25000000',
             'notional': '0',
             'openOrderInitialMargin': '0',
             'positionAmt': '0.000',  # 보유 수량
             'positionInitialMargin': '0',
             'positionSide': 'LONG',
             'symbol': 'ETHUSDT', # 종목 이름
             'unrealizedProfit': '0.00000000',
             'updateTime': '1686523901026'},
            {'askNotional': '0',
             'bidNotional': '0',
             'entryPrice': '1916.0',
             'initialMargin': '0.95803485',
             'isolated': False,
             'isolatedWallet': '0',
             'leverage': '10',
             'maintMargin': '0.04790174',
             'maxNotional': '25000000',
             'notional': '-9.58034854',
             'openOrderInitialMargin': '0',
             'positionAmt': '-0.005',
             'positionInitialMargin': '0.95803485',
             'positionSide': 'SHORT',
             'symbol': 'ETHUSDT',
             'unrealizedProfit': '-0.00034854',
             'updateTime': '1687395040585'},

같은 ETHUSDT를 'LONG'과 'SHORT' 으로 포지션을 분리하여 보여줍니다.

저는 Multi-Assets mode로 설정했는데, 아마 Single-Asset mode도 비슷할겁니다.

 

출력결과 마지막 부분입니다.

 'totalCrossUnPnl': '0.00000000',
 'totalCrossWalletBalance': '175.42536530',
 'totalInitialMargin': '146.90938343',
 'totalMaintMargin': '0.00000000',
 'totalMarginBalance': '175.42536530', # 잔고
 'totalOpenOrderInitialMargin': '146.90938343', # 대기 주문 금액
 'totalPositionInitialMargin': '0.00000000', # 포지션 유지 금액
 'totalUnrealizedProfit': '0.00000000',
 'totalWalletBalance': '175.42536530',
 'tradeGroupId': -1,
 'updateTime': 0}

 

 

여담으로 원래 CCXT를 사용해서 불러오는 코드였는데

블로그 글 중 파이참 설치하는 내용을 작성하느라 재설치 했더니

ccxt 버전이 바뀐 탓인지 포지션 정보를 불러오는 항목이 달라져서

그냥 아예 바이낸스 API를 직접 사용해서 불러오도록 변경했습니다.