Невозможно закрыть маржинальную позицию с помощью Binance APIPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно закрыть маржинальную позицию с помощью Binance API

Сообщение Anonymous »

Вот пример закрытия позиции на счете с изолированной маржой, но он не работает. Пожалуйста, помогите ЗАКРЫТЬ открытые маржинальные позиции и погасить маржинальный кредит. Не удалось найти правильный пример позиции закрытия маржи (без фьючерсов) в официальной документации binance-api. Вот полный код ниже. Постарайтесь привести примеры.

Код: Выделить всё

from binance.client import Client
from binance.enums import *
from colorama import Fore, init
from decimal import Decimal
import time

# Инициализация Colorama
init(autoreset=True)

# Ваши API-ключи
api_key = "Ваш_API_KEY"
api_secret = "Ваш_API_SECRET"

# Создание клиента Binance
client = Client(api_key, api_secret)

def get_symbol_filters(symbol):
"""Получает фильтры торговой пары."""
try:
symbol_info = client.get_symbol_info(symbol)
filters = {f['filterType']: f for f in symbol_info['filters']}
return filters
except Exception as e:
print(Fore.RED + f"❌ Ошибка получения фильтров для {symbol}: {e}")
return {}

def round_quantity(quantity, step_size):
"""Округляет количество до допустимого значения (LOT_SIZE)."""
step_size = Decimal(step_size)
return (Decimal(quantity) // step_size) * step_size

def get_open_position(symbol):
"""Получает данные о текущей позиции."""
try:
margin_account = client.get_isolated_margin_account()
for asset in margin_account['assets']:
if asset['symbol'] == symbol:
base_asset = asset['baseAsset']
quote_asset = asset['quoteAsset']
return {
"base_free": Decimal(base_asset['free']),
"base_borrowed": Decimal(base_asset['borrowed']),
"quote_free": Decimal(quote_asset['free']),
"quote_borrowed": Decimal(quote_asset['borrowed']),
"base_asset": base_asset['asset'],
"quote_asset": quote_asset['asset']
}
print(Fore.YELLOW + f"⚠️ Позиция для {symbol} не найдена.")
return None
except Exception as e:
print(Fore.RED + f"❌ Ошибка получения позиций: {e}")
return None

def close_margin_position(symbol, side, quantity):
"""Закрывает маржинальную позицию (LONG/SHORT)."""
try:
side_type = SIDE_SELL if side == "LONG" else SIDE_BUY
filters = get_symbol_filters(symbol)
lot_size_filter = filters.get('LOT_SIZE', {})
min_qty = Decimal(lot_size_filter.get('minQty', '0'))
step_size = Decimal(lot_size_filter.get('stepSize', '1'))

quantity = round_quantity(quantity, step_size)

if quantity < min_qty:
print(Fore.YELLOW + f"ℹ️ Количество {quantity} меньше минимального LOT_SIZE ({min_qty}). Пропуск.")
return False

print(Fore.YELLOW + f"Попытка закрыть {side} позицию ({quantity} {symbol})...")
client.create_margin_order(
symbol=symbol,
side=side_type,
type=ORDER_TYPE_MARKET,
quantity=float(quantity),
isIsolated='TRUE'
)
print(Fore.GREEN + f"✅ Успешно закрыта {side} позиция для {symbol}.")
return True
except Exception as e:
print(Fore.RED + f"❌ Ошибка при закрытии {side} позиции: {e}")
return False

def repay_margin_loan(symbol, asset, amount):
"""Возвращает заемные средства."""
try:
repay_amount = Decimal(amount)
available_balance = Decimal(client.get_asset_balance(asset)['free'])

if repay_amount > available_balance:
print(Fore.YELLOW + f"⚠️ Недостаточно средств для возврата {amount} {asset}.  Доступно: {available_balance}.")
repay_amount = available_balance

if repay_amount == 0:
print(Fore.YELLOW + f"⚠️ Невозможно вернуть {asset}, баланс равен нулю.")
return False

print(Fore.YELLOW + f"Возврат {repay_amount} {asset} для {symbol}...")
client.repay_margin_loan(
asset=asset,
amount=str(repay_amount),
symbol=symbol,
isIsolated='TRUE'
)
print(Fore.GREEN + f"✅ Успешно возвращено {repay_amount} {asset}.")
return True
except Exception as e:
print(Fore.RED + f"❌ Ошибка при возврате {asset}: {e}")
return False

def close_and_repay(symbol):
"""Закрывает позицию и возвращает заемные средства."""
try:
position = get_open_position(symbol)
if not position:
return

base_free = position['base_free']
base_borrowed = position['base_borrowed']
quote_free = position['quote_free']
quote_borrowed = position['quote_borrowed']

# Закрытие LONG
if base_free > 0:
while base_free > 0:
if close_margin_position(symbol, "LONG", base_free):
time.sleep(3)
base_free = get_open_position(symbol)['base_free']

# Закрытие SHORT
if quote_borrowed > 0:
while quote_borrowed > 0:
if close_margin_position(symbol, "SHORT", quote_borrowed):
time.sleep(3)
quote_borrowed = get_open_position(symbol)['quote_borrowed']

# Возврат долгов
if base_borrowed > 0:
while base_borrowed > 0:
repay_margin_loan(symbol, position['base_asset'], base_borrowed)
time.sleep(3)
base_borrowed = get_open_position(symbol)['base_borrowed']

if quote_borrowed > 0:
while quote_borrowed > 0:
repay_margin_loan(symbol, position['quote_asset'], quote_borrowed)
time.sleep(3)
quote_borrowed = get_open_position(symbol)['quote_borrowed']

print(Fore.GREEN + f"✅ Все операции по {symbol} завершены.")
except Exception as e:
print(Fore.RED + f"❌ Ошибка при обработке {symbol}: {e}")

if __name__ == "__main__":
try:
print(Fore.YELLOW + "Инициализация Binance API...")
client.ping()
print(Fore.GREEN + "✅ Успешное подключение!")
close_and_repay("XRPUSDT")
except Exception as e:
print(Fore.RED + f"❌ Ошибка подключения к Binance API: {e}")
Вот пример закрытия позиции на счете с изолированной маржой, но он не работает. Пожалуйста, помогите ЗАКРЫТЬ открытые маржинальные позиции и погасить маржинальный кредит. Не удалось найти правильный пример позиции закрытия маржи (без фьючерсов) в официальной документации binance-api. Вот полный код ниже. Постарайтесь привести примеры.

Подробнее здесь: https://stackoverflow.com/questions/792 ... inance-api
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Python / Binance API — Как получить позицию по фьючерсам Binance Leaderboard из API?
    Anonymous » » в форуме Python
    0 Ответы
    63 Просмотры
    Последнее сообщение Anonymous
  • Невозможно получить данные из Binance API с помощью binance-python.
    Anonymous » » в форуме Python
    0 Ответы
    82 Просмотры
    Последнее сообщение Anonymous
  • Binance TR API, Binance Websocket иногда не отправляет данные
    Anonymous » » в форуме Javascript
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Почему я получаю эту ошибку «ModuleNotFoundError: нет модуля с именем «binance.client»; «binance» не является пакетом по
    Anonymous » » в форуме Python
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • DxTrade API - Как закрыть позицию?
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»