APIError(code=-2027)
위의 오류는 현재 레버리지에서 최대 보유 가능한 포지션을 초과했을 때 발생합니다. 이 경우, 현재 보유하고 있는 포지션을 감소시키거나 레버리지를 감소시켜야 합니다.
레버리지를 조절하려면 현재 보유하고 있는 포지션의 마진을 감소시켜야 합니다. 이를 위해서는 먼저 현재 보유 중인 포지션의 마진을 확인하고, 마진을 줄이는 방법을 찾아야 합니다.
각 코인마다 레버리지 변경이 가능한 범위는 서로 다를 수 있습니다. 따라서, 레버리지가 몇으로 조절해야 하는지에 대한 최적의 값을 찾으려면, 해당 코인의 현재 레버리지 상태, 계정의 마진, 보유한 코인의 수량 등의 정보를 모두 고려해야 합니다.
레버리지를 변경하기 전에, 먼저 현재 보유 중인 포지션의 마진을 계산하여 계정의 마진과 비교해야 합니다. 이를 위해, 먼저 futures_position_information 함수를 사용하여 현재 보유 중인 포지션의 정보를 가져옵니다.
position_info = client.futures_position_information()
이 코드는 현재 계정에 보유중인 모든 코인의 포지션 정보를 가져옵니다. 각 코인의 포지션 정보에는 해당 코인의 심볼, 포지션의 방향, 포지션의 크기, 보유 중인 포지션의 마진 등이 포함됩니다.
포지션의 마진이 계정의 마진을 초과하지 않도록 하려면, 현재 보유 중인 포지션의 마진을 모두 더한 값을 계산해야 합니다. 이를 위해 다음 코드를 사용할 수 있습니다.
margin = sum([float(pos['isolatedMargin']) for pos in position_info])
이제, 레버리지를 변경할 때 사용할 수 있는 최대 포지션 크기를 계산할 수 있습니다. 이를 위해서는 다음과 같은 식을 사용합니다.
max_position_size = (account_balance * leverage) / current_price
위 식에서 account_balance는 계정 잔액을 나타내며, leverage는 조정하고자 하는 레버리지 수준을 나타냅니다. current_price는 현재 가격을 나타냅니다. 이 식으로 계산된 최대 포지션 크기가 현재 보유 중인 포지션 크기보다 작으면, 레버리지를 감소시켜야 합니다.
따라서, 레버리지가 몇으로 조절되어야 하는지 계산하기 위해서는 다음 단계를 따릅니다.
- futures_position_information 함수를 사용하여 현재 보유 중인 포지션 정보를 가져옵니다.
- 모든 코인의 포지션 정보에 대해, 해당 코인의 심볼, 포지션 방향, 포지션 크기, 보유 중인 포지션의 마진 등을 확인합니다.
- 보유 중인 포지션의 마진을 계산하여, 계정의 마진과 비교합니다.
- 현재 레버리지에서 보유할 수 있는 현재 레버리지에서 보유할 수 있는 최대 포지션 크기를 계산합니다. 이를 위해 계정의 잔액과 현재 레버리지를 사용하여, 포지션의 최대 크기를 계산합니다.
from binance.client import Client
from binance.exceptions import BinanceAPIException
# API key 및 secret key를 저장합니다.
api_key = 'your_api_key'
api_secret = 'your_api_secret'
# binance client 객체를 생성합니다.
client = Client(api_key, api_secret)
# 거래할 symbol과 leverage를 설정합니다.
symbol = 'BTCUSDT'
leverage = 25
# 계정 정보를 조회합니다.
account = client.futures_account()
account_balance = float(account['totalWalletBalance'])
# 최근 체결가격을 조회합니다.
ticker = client.futures_ticker(symbol=symbol)
current_price = float(ticker['lastPrice'])
# 현재 보유중인 포지션 정보를 조회합니다.
position_info = client.futures_position_information()
margin = sum([float(pos['isolatedMargin']) for pos in position_info])
# 모든 코인에 대해, 해당 코인의 심볼, 포지션 방향, 포지션 크기, 보유 중인 포지션의 마진 등을 확인합니다.
position_size = 0
for pos in position_info:
if pos['symbol'] == symbol:
if pos['positionSide'] == 'LONG':
position_size = float(pos['positionAmt'])
else:
position_size = -float(pos['positionAmt'])
# 레버리지를 변경하기 전에, 포지션의 최대 크기를 계산합니다.
max_position_size = (account_balance * leverage) / current_price
# 현재 보유 중인 포지션의 마진과 포지션의 최대 크기를 비교합니다.
if margin <= account_balance and abs(position_size) < max_position_size:
# 레버리지를 변경하고 포지션을 추가합니다.
# ...
else:
print('Cannot enter position. Margin or position size limit exceeded.')
위 코드에서, 레버리지와 거래할 symbol을 먼저 설정합니다. 그런 다음, futures_account 함수를 사용하여 계정 정보를 조회합니다. 조회한 계정 정보에서 totalWalletBalance 값을 가져와서 account_balance 변수에 저장합니다.
다음으로, futures_ticker 함수를 사용하여 현재 거래 가격을 가져와 current_price 변수에 저장합니다.
이어서, futures_position_information 함수를 사용하여 현재 보유 중인 포지션 정보를 가져옵니다. 이 정보를 사용하여 position_size 변수에 보유 중인 포지션의 크기를 저장합니다. 포지션 방향은 positionSide 값으로 구분하며, LONG은 매수 포지션을 의미합니다. 따라서, LONG 포지션의 경우 positionAmt 값이 양수이며, 매도 포지션의 경우 positionAmt 값이 음수입니다.
마지막으로, 포지션의 최대 크기를 계산하여, 현재 보유 중인 포지션의 마진과 비교합니다. 만약 레버리지를 조정해야 하는 경우, futures_change_leverage 함수를 사용하여 레버리지를 변경할 수 있습니다. 이 함수는 다음과 같은 매개변수를 입력받습니다.
- symbol: 거래할 코인의 심볼
- leverage: 변경할 레버리지 수준
try:
# 레버리지를 변경합니다.
response = client.futures_change_leverage(symbol=symbol, leverage=leverage)
# 레버리지 변경에 성공하면, 포지션을 추가합니다.
order = client.futures_create_order(
symbol=symbol,
side='BUY',
positionSide='LONG',
type='MARKET',
quantity=max_position_size,
)
except BinanceAPIException as e:
# 레버리지 변경에 실패하면 오류 메시지를 출력합니다.
print(e.message)
futures_change_leverage 함수를 사용하여 레버리지를 변경한 후, futures_create_order 함수를 사용하여 포지션을 추가합니다. futures_create_order 함수의 quantity 매개변수에는 max_position_size 값을 전달합니다. 이 값은 계산한 최대 포지션 크기입니다.
만약, 레버리지 변경에 실패하면 BinanceAPIException 예외가 발생합니다. 이 경우, 오류 메시지를 출력합니다.
이제, 이전에 발생한 APIError(code=-2027) 오류가 발생하지 않도록, 적절한 레버리지를 계산하고, 이를 사용하여 포지션을 추가하는 방법을 알게 되었습니다.