본문 바로가기
파이썬/가상화폐

Python 바이낸스 거래소 선물자동매매 개발 가이드 ep4.잔고 포지션 조회

by 행복론자 2023. 1. 5.

지난 글에서는 ep3. 마진타입 설정을 다뤄봤습니다

2022.12.31 - [파이썬/가상화폐] - Python 바이낸스 거래소 선물자동매매 개발 가이드 ep3.마진타입 설정(교차 vs 격리)

 

Python 바이낸스 거래소 선물자동매매 개발 가이드 ep3.마진타입 설정(교차 vs 격리)

지난 글에서는 ep2.레버리지 설정을 다뤄봤습니다 2022.12.29 - [파이썬/가상화폐] - Python 바이낸스 거래소 선물자동매매 개발 가이드 ep2.레버리지 설정 Python 바이낸스 거래소 선물자동매매 개발 가

jsp-dev.tistory.com

 

이번에는 바이낸스 선물 API를 이용하여 내 계정에 존재하는 잔고와 포지션을 조회하는 방법을 알아보도록 하겠습니다. 

먼저 잔고란 자산(Asset)을 의미합니다. 즉 선물계정에 보유하고 있는 코인을 의미합니다. 

헷갈리기 쉬운 점은 USDT를 이용해 BTC롱 포지션을 취하더라도 실제로 BTC를 보유하고 있는 것이 아니기 때문에 이 경우 BTC를 자산으로 볼 수 없습니다. 증거금으로 사용하는 USDT, BUSD이 자산으로 구분되고 이를 이용해 BTC, ETH 롱/숏 계약을 체결했다면 이는 진입 포지션으로 구분할 수 있습니다. 실제로 API를 호출하더라도 잔고와 포지션에 대해 구분된 응답을 수신합니다.
본 프로젝트에서는 USDT를 증거금으로 사용하기 때문에 앞으로 프로젝트에서 언급하는 자산은 USDT를 의미합니다. 그럼 API 사용을 알아보도록 하겠습니다.

사용할 API는 계정의 정보를 조회하는 역할을 합니다. 

샘플 코드를 보더라도 모듈의 이름을 get_account.py로 명명한 것을 알 수 있습니다. 

 

 

참고로 샘플 코드 목록을 보다 보면 get_balance.py라는 파일도 있습니다. get_balance.py 실행해보면 계정의 잔고를 가져오는 역할을 하기 때문에 잔고만 확인하기 위해서는 이 모듈 을 사용해도 됩니다.

 

 

하지만 get_account.py에서 사용하는 account 함수는 잔고 및 포지션 정보를 한번에 조회해오기 때문에 이 함수를 사용해 잔고와 포지션 정보를 한 번에 조회한다는 점을 알려드립니다. 

 

 

레버리지 설정, 마진타입 설정과 마찬가지로 계정정보가 필요한 API 호출에는 API Key가 필요하기 때문에 샘플코드에는 없었지만 API Key를 조회해오도록 코드를 추가했습니다.
main.py

import logging
from binance.um_futures import UMFutures
from binance.lib.utils import config_logging
from binance.error import ClientError
import os

config_logging(logging, logging.DEBUG)

key = os.getenv("BINANCE_API_KEY")
secret = os.getenv("BINANCE_SECRET_KEY")

um_futures_client = UMFutures(key=key, secret=secret)

try:
   res = um_futures_client.account(recvWindow=6000)
   logging.info(res)
 
except ClientError as error:
   logging.error(
       "Found error. status: {}, error code: {}, error message: {}".format(
           error.status_code, error.error_code, error.error_message
       )
   )

 

 

실행해보면 이런 결과가 나옵니다.

 

 

내 자산이 어디에 있는지 보기 어려울 수 있기 때문에 코드를 조금 고쳐보겠습니다. 

조회해온 데이터는 동일하지만 print 함수를 추가해 잔고와 포지션을 각각 구분해 출력하도록 했습니다.

import logging
from binance.um_futures import UMFutures
from binance.lib.utils import config_logging
from binance.error import ClientError
import os

config_logging(logging, logging.DEBUG)

key = os.getenv("BINANCE_API_KEY")
secret = os.getenv("BINANCE_SECRET_KEY")

um_futures_client = UMFutures(key=key, secret=secret)

try:
   res = um_futures_client.account(recvWindow=6000)
   for i in res['assets']:
       print(i)
   for i in res['positions']:
       print(i)

except ClientError as error:
   logging.error(
       "Found error. status: {}, error code: {}, error message: {}".format(
           error.status_code, error.error_code, error.error_message
       )
   )

 

 

출력해보면 다음처럼 구분되는 결과가 나옵니다.

 

 

출력되는 데이터 한 줄당 하나의 딕셔너리이며 코인별로 데이터가 구분되어 있습니다.

그 중에서도 빨간색으로 표시한 영역을 보면 첫번째 줄에는 asset을 키로 갖고 있는 딕셔너리가 있고 symbol을 키로 갖고 있는 데이터들이 있습니다.
출력해보시면 아시겠지만 asset은 DOT, BTC, SOL, BNB, ETH, ADA, USDT, XRP, BUSD가 있고 이들이 선물계정에서 보유할 수 있는 자산 목록입니다.
그런데 증거금으로 USDT와 BUSD만 사용할 수 있다고 설명했는데 왜 DOT, BTC, SOL 같은 코인들이 자산목록에 나오는지 궁금하실 수 있습니다. 이는 Binance 현물 계정에서 선물계정으로 옮길 수 있는 코인목록들인데 계정의 자산에서 transfer 목록을 눌러보면 확인할 수 있습니다. 하지만 본 프로젝트에서는 USDT만 증거금으로 사용할 예정이므로 USDT의 보유량만을 자산으로 취급하도록 하겠습니다.
포지션을 나타내는 딕셔너리는 symbol을 키로 가지고 있으며 Binance에서 선물거래를 할 수 있는 모든 페어 목록이 나옵니다. 

 

 

위 캡쳐 이미지에는 자세히 보이지 않을 수 있지만 결과를 출력해보면 페어별로 격리/교차 구분 및 각각의 설정된 레버리지가 나옵니다. 또 만약 현재 포지션을 취하고 있으면 수익이라던지 보유 수량에 대한 정보도 나옵니다.
이 한 줄의 딕셔너리에 많은 데이터들이 있으나 각각이 무엇을 의미하는지 궁금하실 수 있습니다. 이 데이터 항목에 대한 설명은 Binance 공식 API (샘플 코드가 있는 링크가 아닙니다)에서 확인하실 수 있으니 출력된 데이터의 각 항목이 궁금하신 경우 참고하시기 바랍니다.

 

 

계속해서 포지션 데이터를 보면, 헷갈릴 수 있는 부분이 있습니다. 바로 포지션의 종류입니다. positionSide는 이름만 언뜻 보면 롱/숏을 구분하는 키일 것 같지만 사실 그렇지 않습니다. 이 항목이 의미하는 것은 포지션 모드이며 ‘BOTH’인 경우 롱 혹은 숏 한 방향만 취할 수 있는 단 방향 모드(One-Way Mode)를 의미합니다. 그 반대는 소위 ‘양빵’이라고 하는 모드로 롱/숏 포지션을 모두 잡을 수 있는 모드(Hedge Mode)를 의미합니다. 기본적으로는 One-Way Mode이니 positionSide가 BOTH로 나오는 것이 정상입니다. 

 

 

그러면 내가 롱포지션을 잡았는지 숏포지션을 잡았는지를 확인하기 위해서는 positionAmt라는 키를 살펴봐야 합니다. 이 값이 의미하는 바는 내가 계약한 수량인데 롱이면 양수로 나오고, 숏이면 음수로 나오게 됩니다.

이로써 계정의 잔고/포지션을 조회하는 방법에 대해 알아봤습니다. 마무리하기 전에 간단한 반복문을 사용해 잔고중 USDT의 정보만 확인하고 포지션중에서는 BTCUSDT만 확인하는 방법에 대해 알아보겠습니다. 
import 및 key, secret 정보는 동일하니 try-except 부분만 살펴보겠습니다.
main.py

try:
   res = um_futures_client.account(recvWindow=6000)
   for i in res['assets']:
       if i['asset'] == 'USDT':
           print(i)
   for i in res['positions']:
       if i['symbol'] == 'BTCUSDT':
           print(i)       

except ClientError as error:
   logging.error(
       "Found error. status: {}, error code: {}, error message: {}".format(
           error.status_code, error.error_code, error.error_message
       )
   )

 

 

API 호출 결과인 res 중 res[‘assets’]에는 자산목록들이 있고 res[‘positions’]에는 포지션 정보들이 있습니다. 먼저 자산목록 중에는 asset 키가 USDT인 데이터일 경우만 print 하도록 조건문을 넣었고 포지션 목록에서는 symbol 키가 BTCUSDT인 경우에만 print 하도록 조건문을 넣어봤습니다.
이렇게 해서 여러 자산/포지션 중에서 내가 원하는 데이터만 구분해 확인하는 방법까지 배워봤습니다. 

프로젝트에서는 이 함수들을 응용해 USDT 보유량을 조회하거나 현재 포지션 진입상태인지 아닌지 확인하는 로직을 구현할 예정입니다.

 


같이 읽어보면 좋은 글

2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

 

[전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

🎁 바이낸스 자동매매 시스템 개발 방법을 담은 책이 출시되었습니다. "나 대신 일해주는 코인선물자동매매 프로그램 개발, 노하우 및 소스를 모두 공개합니다" ✔️ Q: 무슨 내용인가요? Python

jsp-dev.tistory.com

 

2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄

 

[공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프

https://kmong.com/gig/417785 거래소별 코인 프리미엄 알림봇 개발 가이드를 드립니다 | 36000원부터 시작 가능한 총 평점 5점의 3개 총 작업 개수 완료한 총 평점 5점인 JSDEV의 전자책, 투잡·재테크 전자

jsp-dev.tistory.com

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글