Back to Ccxt

https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code

wiki/examples/py/margin-loan-borrow-buy-sell-repay.md

4.5.525.0 KB
Original Source
python
import os
import sys

# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code

# AUTO-TRANSPILE #
# Note, this is just an example and might not yet work on other exchanges, which are being still unified.
async def example():
   # ########## user inputs ##########
   exchange = getattr(ccxt, 'binance')({
       'apiKey': 'xxx',
       'secret': 'xxx',
   })
   symbol = 'BUSD/USDT'  # set target symbol
   margin_mode = 'isolated'  # margin mode (cross or isolated)
   collateral_coin = 'USDT'  # which asset you want to use for margin-borrow collateral
   borrow_coin = 'BUSD'  # which coin to borrow
   order_side = 'sell'  # which side to trade
   amount_to_trade = 14  # how many coins to sell
   order_type = 'limit'  # order type (can be market, limit or etc)
   limit_price = 0.99  # price to sell at (set undefined/null/None if market-order)
   margin_magnitude = 5  # target margin (aka 'leverage'). This might also be obtainable using other unified methods, but for example purposes, we set here manually
   # ########## end of user-inputs ##########
   #
   # for example purposes, let's also check available balance at first
   balance_margin = await exchange.fetch_balance({
       'defaultType': 'margin',
       'marginMode': margin_mode,
   })  # use `defaultType` because of temporary bug, otherwise, after several days, you can use `type` too.
   # if we don't have enought coins, then we have to borrow at first
   needed_amount_to_borrow = None  # will be auto-set below
   if amount_to_trade > balance_margin[symbol][borrow_coin]['free']:
       needed_amount_to_borrow = amount_to_trade - balance_margin[symbol][borrow_coin]['free']
       print('hmm, I have only ', balance_margin[symbol][borrow_coin]['free'], ' ', borrow_coin, ' in margin balance, and still need additional ', needed_amount_to_borrow, ' to make an order. Lets borrow it.')
       # To initate a borrow, at first, check if we have enough collateral (for this example, as we make a sell-short, we need '-1' to keep for collateral currency)
       needed_collateral_amount = needed_amount_to_borrow / (margin_magnitude - 1)
       # Check if we have any collateral to get permission for borrow
       if balance_margin[symbol][collateral_coin]['free'] < needed_collateral_amount:
           # If we don't have enough collateral, then let's try to transfer collateral-asset from spot-balance to margin-balance
           print('hmm, I have only ', balance_margin[symbol][collateral_coin]['free'], ' in balance, but ', needed_collateral_amount, ' collateral is needed. I should transfer ', needed_collateral_amount, ' from spot')
           # let's check if we have spot balance at all
           balance_spot = await exchange.fetch_balance({
               'type': 'spot',
           })
           if exchange.parse_number(balance_spot[collateral_coin]['free']) < needed_collateral_amount:
               print('hmm, I neither do have enough balance on spot - only ', balance_spot[collateral_coin]['free'], '. Script can not continue...')
               return
           else:
               print('Transferring  ', needed_collateral_amount, ' to margin account')
               await exchange.transfer(collateral_coin, needed_collateral_amount, 'spot', margin_mode, {
                   'symbol': symbol,
               })
       # now, as we have enough margin collateral, initiate borrow
       print('Initiating margin borrow of ', needed_amount_to_borrow, ' ', borrow_coin)
       borrow_result = await exchange.borrow_margin(borrow_coin, needed_amount_to_borrow, symbol, {
           'marginMode': margin_mode,
       })
   print('Submitting order.')
   order = await exchange.create_order(symbol, order_type, order_side, amount_to_trade, limit_price, {
       'marginMode': margin_mode,
   })
   print('Order was submitted !', order['id'])
   #
   #
   # ...
   # ...
   # some time later, if you want to repay the loan back (like 'close the position')...
   # ...
   # ...
   #
   #
   # set the "repay-back" amount (for this example snippet, this will be same amount that we borrowed above)
   if needed_amount_to_borrow is not None:
       amount_to_repay_back = needed_amount_to_borrow
       # At first, you need to get back the borrowed coin, by making an opposide trade
       print('Making purchase back of ', amount_to_repay_back, ' ', borrow_coin, ' to repay it back.')
       purchase_back_price = 1.01
       order_back = await exchange.create_order(symbol, order_type, ('sell' if order_side == 'buy' else 'buy'), amount_to_repay_back, purchase_back_price, {
           'marginMode': margin_mode,
       })
       print('Now, repaying the loan.')
       repay_result = await exchange.repay_margin(borrow_coin, amount_to_repay_back, symbol, {
           'marginMode': margin_mode,
       })
       print('finished.')

   await exchange.close()


asyncio.run(example())