- [Binance Futures Margin](./examples/py/) ```python # -*- coding: utf-8 -*- import os import sys from pprint import pprint import ccxt # noqa: E402 print('CCXT Version:', ccxt.__version__) # Must read before your start: # # - https://github.com/ccxt/ccxt/wiki/Manual # - https://github.com/ccxt/ccxt/wiki/Manual#implicit-api-methods # - https://github.com/ccxt/ccxt/wiki/Manual#unified-api # # In short, Binance's API is structured as follows and you should understand # the meaning and the difference between ISOLATED vs CROSSED margin mode and # the difference between Hedged positions vs One-way positions. # # - wapi: funding for withdrawals and deposits (wapi) # - api: spot (api) # - sapi: spot margin # - CROSSED margin mode # - Hedged positions # - One-way positions # - ISOLATED margin mode # - Hedged positions # - One-way positions # - fapi: swap/perpetual futures margin # - CROSSED margin mode # - Hedged positions # - One-way positions # - ISOLATED margin mode # - Hedged positions # - One-way positions # - dapi: classic delivery futures margin # - CROSSED margin mode # - Hedged positions # - One-way positions # - ISOLATED margin mode # - Hedged positions # - One-way positions # # You should pick the following: # # 1. which API you want to trade (fapi, i believe) # 2. which specific margin mode you want (CROSSED or ISOLATED) # 3. which specific position mode you want (Hedged or One-way) # # Differences in margin modes: # # - CROSSED margin mode = you have one futures-margin account for all your positions, # if some position requires too much margin, your entire account is affected, # leaving less margin for the other positions, # thus you share the same margin _"across"_ all your positions # # - ISOLATED margin mode = you have separate futures-margin for each of your positions, # if some position runs out of margin the other positions are not affected, # thus your positions are _"isolated"_ from one another # # Difference in position modes: # # - One-way position mode - when you're in this mode # there's no such things as LONG or SHORT positions. # You just buy or sell a number of contracts, and # if the price goes down, your PnL goes negative, # if the price goes up, your PnL is positive. # Thus, the position operates `BOTH` ways, both long and short at the same time, # the notion of "long" and "short" is abstracted away from you, # so there's only one way the position can go and that way is called "BOTH". # # - Hedge mode - you either enter a `LONG` position or a `SHORT` position and # your PnL calculation rules depend on that # so there's a number of ways a position can go # # Which specific mode of trading (margin mode + position mode) do you want? def table(values): first = values[0] keys = list(first.keys()) if isinstance(first, dict) else range(0, len(first)) widths = [max([len(str(v[k])) for v in values]) for k in keys] string = ' | '.join(['{:<' + str(w) + '}' for w in widths]) return "\n".join([string.format(*[str(v[k]) for k in keys]) for v in values]) exchange = ccxt.binance({ 'apiKey': 'YOUR_API_KEY', 'secret': 'YOUR_SECRET', 'options': { 'defaultType': 'future', }, }) markets = exchange.load_markets() symbol = 'BTC/USDT' # YOUR SYMBOL HERE market = exchange.market(symbol) exchange.verbose = True # UNCOMMENT THIS AFTER LOADING THE MARKETS FOR DEBUGGING print('----------------------------------------------------------------------') print('Fetching your balance:') response = exchange.fetch_balance() pprint(response['total']) # make sure you have enough futures margin... # pprint(response['info']) # more details print('----------------------------------------------------------------------') # https://binance-docs.github.io/apidocs/futures/en/#position-information-v2-user_data print('Getting your positions:') response = exchange.fapiprivatev2_get_positionrisk() print(table(response)) print('----------------------------------------------------------------------') # https://binance-docs.github.io/apidocs/futures/en/#change-position-mode-trade print('Getting your current position mode (One-way or Hedge Mode):') response = exchange.fapiprivate_get_positionside_dual() if response['dualSidePosition']: print('You are in Hedge Mode') else: print('You are in One-way Mode') print('----------------------------------------------------------------------') # print('Setting your position mode to One-way:') # response = exchange.fapiprivate_post_positionside_dual({ # 'dualSidePosition': False, # }) # print(response) # print('Setting your positions to Hedge mode:') # response = exchange.fapiprivate_post_positionside_dual({ # 'dualSidePosition': True, # }) # print(response) # print('----------------------------------------------------------------------') # # https://binance-docs.github.io/apidocs/futures/en/#change-margin-type-trade # print('Changing your', symbol, 'position margin mode to CROSSED:') # response = exchange.fapiprivate_post_margintype({ # 'symbol': market['id'], # 'marginType': 'CROSSED', # }) # print(response) # print('Changing your', symbol, 'position margin mode to ISOLATED:') # response = exchange.fapiprivate_post_margintype({ # 'symbol': market['id'], # 'marginType': 'ISOLATED', # }) # print(response) # print('----------------------------------------------------------------------') # # https://binance-docs.github.io/apidocs/spot/en/#new-future-account-transfer-futures # code = 'USDT' # amount = 123.45 # currency = exchange.currency(code) # print('Moving', code, 'funds from your spot account to your futures account:') # response = exchange.sapi_post_futures_transfer({ # 'asset': currency['id'], # 'amount': exchange.currency_to_precision(code, amount), # # 1: transfer from spot account to USDT-Ⓜ futures account. # # 2: transfer from USDT-Ⓜ futures account to spot account. # # 3: transfer from spot account to COIN-Ⓜ futures account. # # 4: transfer from COIN-Ⓜ futures account to spot account. # 'type': 1, # }) # print('----------------------------------------------------------------------') # # for ISOLATED positions only # print('Modifying your ISOLATED', symbol, 'position margin:') # response = exchange.fapiprivate_post_positionmargin({ # 'symbol': market['id'], # 'amount': 123.45, # ←-------------- YOUR AMOUNT HERE # 'positionSide': 'BOTH', # use BOTH for One-way positions, LONG or SHORT for Hedge Mode # 'type': 1, # 1 = add position margin, 2 = reduce position margin # }) # print('----------------------------------------------------------------------') ```