바이낸스 API를 이용해 선물 거래를 하는 데 있어 이번 글에서는 예시로 BTC/USDT를 대상으로 레버리지 배율을 3으로 하고, 격리 모드에서 롱/숏 포지션을 잡아보도록 하겠습니다. 현물은 매수/매도에 대한 개념이지만 선물에서는 롱(buy) 포지션을 종료하기 위해서 숏(sell)을 수행하고, 반대로 숏 포지션을 종료하기 위해서는 롱을 수행하는 개념입니다. (추후에 여유가 되면 양방향으로 동시에 수행하는 헷지 모드에 대해서도 다루어볼 예정이기도 합니다.)
업비트에서 시장가/지정가 매수/매도 하는 것과 비슷한 맥락을 가지고 있습니다. 아래 글을 참고하면 될 것 같습니다.
2022.06.15 - [Programming/Crypto] - pyupbit 활용 - 코인 매수/매도하기
ccxt를 활용 binance API key 세팅 및 레버리지 배율 조정
이전 글에 있었던 코드를 바탕으로 아래와 같이 시작합니다. 레버리지 배율은 3배로 하고, isolated 상태로 지정합니다.
import pickle
import ccxt
import time
import pandas as pd
# api key 부르기
with open('./keypair/binance_secret_key.pkl', 'rb') as k:
secret_key = pickle.load(k)
secret = secret_key['secret key']
access = secret_key['access key']
# 바이낸스 객체 지정 - 선물 거래
binance = ccxt.binance(config = {
'apiKey':access,
'secret':secret,
'enableRateLimit':True,
'options':{
'defaultType':'future'
}
})
# 선물 계좌 조회
balances = binance.fetch_balance(params={"type": "future"})
time.sleep(0.1)
# 현재 예수금
TotalMoney = float(balances['USDT']['total'])
# 레버리지 배율, 비트코인, 격리유무 설정
leverage = 3
target_coin = 'BTCUSDT'
isolated = True
# 레버리지 세팅하기
try:
print(binance.fapiPrivate_post_leverage({'symbol': target_coin, 'leverage': leverage}))
except Exception as e:
print("error:", e)
# 격리 유무 세팅하기
if isolated == True:
try:
print(binance.fapiPrivate_post_margintype({'symbol': target_coin, 'marginType': 'ISOLATED'}))
except Exception as e:
print("error:", e)
로그인해서 아래 그림처럼 세팅된 것을 알 수 있습니다.
Binance 시장가로 포지션 잡아보기
Binance 거래소에서 테더 기준 수수료는 아래 표와 같습니다. 지정가와 시장가 수수료 중에 시장가는 호가창에 있는 매물들을 바로 체결을 할 수 있지만 수수료가 조금 더 많이 나가는 것을 알 수 있습니다.
사람마다 체결하는 부분에 있어 다양성을 존중합니다. 또한 진입할 사이즈를 정해야 하는데 들고 있는 예수금의 n%로 가셔도 좋고, 단리로 특정 수량만큼 정해서 들어가는 방법 등 다양하게 존재합니다. 저는 예시로 시장가로 최소 수량만큼 예시로 롱 포지션을 잡도록 하겠습니다. 참고로 비트코인 선물같은 경우 최소 수량은 0.001 btc입니다. 함수 이름만 보면 시장가(market)로 롱(buy)으로 잡을 수 있음을 알 수 있습니다. create_market_buy_order() 에 거래하고자 하는 티커와 수량을 기입합니다.
print(binance.create_market_buy_order(target_coin, 0.001))
맨 아래에 포지션이 잡혀있는 것을 알 수 있습니다.
아래 사진 상태 시점에서 보유 수량과 진입가격(평단가), 미실현 손익을 조회하고자 할 때는 계좌를 다시 조회하여 아래처럼 코드를 수행합니다.
balances = binance.fetch_balance(params={"type": "future"})
time.sleep(0.1)
for posi in balances['info']['positions']:
if posi['symbol'] == target_coin:
amt = float(posi['positionAmt']) # 수량
entryPrice = float(posi['entryPrice']) # 진입가격
leverage = float(posi['leverage'])
unrealizedProfit = float(posi['unrealizedProfit']) # 미실현손익
isolated = posi['isolated']
break
print(amt) # 위 바이낸스 포지션 사진에서 0.001 btc
print(entryPrice) # 위 바이낸스 포지션 사진에서 19,094k
print(unrealizedProfit) # 위 바이낸스 포지션 사진에서 0.03 USDT 만큼 수익 중. 손실 중이라면 음수로 나타남
python에서 나온 결과와 바이낸스에 찍혀 있는 결과와 비교를 해보면 완전히 같음을 알 수 있습니다.
포지션 청산하기
위의 예제에서 롱으로 포지션을 진입을 하였고, 보유수량과 진입 가격을 알기 때문에 이제 포지션을 정리해보겠습니다. 롱 상태에서 정리를 하려면 sell(short)로 주문을 넣어야 하고 지정가(limit)로 주문을 넣어보겠습니다.
저는 진입가격(19,094k) 에서 1% 부분에서 익절을 내는 주문을 넣겠습니다. 아래와 같이 구현을 하면 됩니다. 아래 코드는 지금 본인이 누리고 있는 미실현 손익에 대한 %가 아닌, 진입 가격에 대한 1% 높은 부분에서 정리하겠다는 뜻입니다. 만약에 내가 정말 1% 수익만을 원한다면 설정한 레버리지 배율을 target_rate 값을 나누어서 주문을 넣으면 될 것입니다.
또한 지금 예제로는 롱으로 포지션을 잡고 숏으로 정리를 하는데, 반대인 경우에 대해서는 부호가 반대로 되어야하는 것을 반드시 유의해주셔야 합니다.
target_coin_ticker = "BTC/USDT"
# 진입 가격에대해서 어느 정도 익절을 하고 싶은지 설정.
target_rate = 0.01
# 티커, 보유수량, 진입가격에서 원하는 익절 구간 만큼
print(binance.create_limit_sell_order(Target_Coin_Ticker, amt, entryPrice * (1.0 + target_rate)))
수행하는 즉시 Open Orders 탭을 누르면 진입가격(19,094k)에서 1.01배 높은 19,284k에 sell 주문이 정확하게 들어간 것을 알 수 있습니다.
이제 앞으로 포지션을 진입할 때와 청산하고자 할 때, 특정 상황이나 조건을 각자 매매하기 이전에 세운 가설이나 여러 방법을 적용시켜서 매매를 해볼 수 있을 것입니다. 하지만 이렇게 단순하게 롱/숏으로 주문을 넣고 빼기에는 안전장치가 상대적으로 부족할 수 있습니다. 다음 글에서는 포지션 진입을 함과 동시에 본인이 감내할 수 있는 수준을 정하여 Stoploss 설정과 주문을 취소하는 과정에 대해 설명해보겠습니다.
아래는 블로그 주인장의 토스 익명 후원 링크입니다. 글이 도움되거나 흡족스러웠다면 후원해주시면 감사하겠습니다.
'Programming > Crypto' 카테고리의 다른 글
파이썬을 활용한 매매 도구 하이킨아시(Heikin-Ashi) 구현하기 (0) | 2023.01.14 |
---|---|
Binance API와 ccxt를 활용한 선물 계좌 조회 및 선물 거래 시작하기 (0) | 2022.09.19 |
바이낸스 암호화폐 데이터 부르기 (ccxt를 활용한 binance 암호화폐 데이터 부르기) (7) | 2022.09.06 |
바이낸스(Binance) API Key 발급하기 (0) | 2022.09.02 |
Python을 활용한 매매보조지표 구현하기(상대강도지수 RSI, MFI, CCI) (2) | 2022.08.27 |