-
-
Notifications
You must be signed in to change notification settings - Fork 8.7k
margin loan borrow buy sell repay
github-actions[bot] edited this page Jun 11, 2026
·
2 revisions
import ccxt from '../../js/ccxt.js';
// AUTO-TRANSPILE //
// Note, this is just an example and might not yet work on other exchanges, which are being still unified.
async function example() {
// ########## user inputs ##########
const exchange = new ccxt['binance']({ 'apiKey': 'xxx', 'secret': 'xxx' });
const symbol = 'BUSD/USDT'; // set target symbol
const marginMode = 'isolated'; // margin mode (cross or isolated)
const collateral_coin = 'USDT'; // which asset you want to use for margin-borrow collateral
const borrow_coin = 'BUSD'; // which coin to borrow
const order_side = 'sell'; // which side to trade
const amount_to_trade = 14; // how many coins to sell
const order_type = 'limit'; // order type (can be market, limit or etc)
const limit_price = 0.99; // price to sell at (set undefined/null/None if market-order)
const 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
const balance_margin = await exchange.fetchBalance({ 'defaultType': 'margin', 'marginMode': marginMode }); // 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
let needed_amount_to_borrow = undefined; // 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'];
console.log('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)
const 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
console.log('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
const balance_spot = await exchange.fetchBalance({ 'type': 'spot' });
if (exchange.parseNumber(balance_spot[collateral_coin]['free']) < needed_collateral_amount) {
console.log('hmm, I neither do have enough balance on spot - only ', balance_spot[collateral_coin]['free'], '. Script can not continue...');
return;
}
else {
console.log('Transferring ', needed_collateral_amount, ' to margin account');
await exchange.transfer(collateral_coin, needed_collateral_amount, 'spot', marginMode, { 'symbol': symbol });
}
}
// now, as we have enough margin collateral, initiate borrow
console.log('Initiating margin borrow of ', needed_amount_to_borrow, ' ', borrow_coin);
const borrowResult = await exchange.borrowMargin(borrow_coin, needed_amount_to_borrow, symbol, { 'marginMode': marginMode });
}
console.log('Submitting order.');
const order = await exchange.createOrder(symbol, order_type, order_side, amount_to_trade, limit_price, { 'marginMode': marginMode });
console.log('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 !== undefined) {
const amount_to_repay_back = needed_amount_to_borrow;
// At first, you need to get back the borrowed coin, by making an opposide trade
console.log('Making purchase back of ', amount_to_repay_back, ' ', borrow_coin, ' to repay it back.');
const purchase_back_price = 1.01;
const order_back = await exchange.createOrder(symbol, order_type, (order_side === 'buy' ? 'sell' : 'buy'), amount_to_repay_back, purchase_back_price, { 'marginMode': marginMode });
console.log('Now, repaying the loan.');
const repayResult = await exchange.repayMargin(borrow_coin, amount_to_repay_back, symbol, { 'marginMode': marginMode });
console.log('finished.');
}
}
await example();(If the page is not being rendered for you, you can refer to the mirror at https://docs.ccxt.com/)
- Install
- Examples
- Manual
- CCXT Pro
- Contributing
- Supported Exchanges
- Exchanges By Country
- API Spec By Method
- FAQ
- Changelog
- Awesome
- API Spec by Exchange
- fetchCurrencies
- alpaca
- apex
- ascendex
- aster
- backpack
- bigone
- binance
- bingx
- bit2c
- bitbank
- bitbns
- bitfinex
- bitflyer
- bitget
- bithumb
- bitmart
- bitmex
- bitopro
- bitrue
- bitso
- bitstamp
- bitteam
- bittrade
- bitvavo
- blockchaincom
- blofin
- btcbox
- btcmarkets
- btcturk
- bullish
- bybit
- bydfi
- cex
- coinbase
- coinbaseexchange
- coinbaseinternational
- coincheck
- coinex
- coinmate
- coinmetro
- coinone
- coinsph
- coinspot
- cryptocom
- cryptomus
- deepcoin
- delta
- deribit
- derive
- digifinex
- dydx
- exmo
- extended
- foxbit
- gate
- gemini
- grvt
- hashkey
- hibachi
- hitbtc
- hollaex
- htx
- hyperliquid
- independentreserve
- indodax
- kraken
- krakenfutures
- kucoin
- fetchBidsAsks
- latoken
- lbank
- lighter
- luno
- mercado
- mexc
- modetrade
- ndax
- novadax
- okx
- onetrading
- p2b
- pacifica
- paradex
- paymium
- phemex
- poloniex
- tokocrypto
- toobit
- upbit
- weex
- whitebit
- woo
- woofipro
- xt
- zaif
- fetchStatus