使用 ccxt python 在 Binance 的现货和期货之间转移 USDT

Transfer USDT between spot and futures in Binance using ccxt python

exchange =   ccxt.binance({
--
"apiKey": 'xxx',
"secret": 'xxx',
'options': {
'adjustForTimeDifference': True
},
'enableRateLimit': True
})
 
exchange_f = ccxt.binance({
"apiKey": 'yyy',
"secret": 'yyy',
'options': {
'defaultType': 'future',
'adjustForTimeDifference': True
},
'enableRateLimit': True
})

exchange.load_markets()
exchange_f.load_markets()

#some calculations here

 if np.sum(sell_long_1) > 0:
            exchange.create_market_sell_order("ETH/USDT", np.sum(sell_long_1))
        elif np.sum(sell_short_1) < 0:
            exchange_f.create_market_buy_order("ETH/USDT", -np.sum(sell_short_1))
            account_balance_f = exchange_f.fetch_balance()['free']['USDT']
            exchange.sapi_post_futures_transfer({
                'asset': 'USDT',
                'amount': account_balance_f,
                'type': 2
            })

您好, 我正在使用 Python 进行算法交易。让我试着解释一下我的问题:

  1. 由于币安的资金费率,我在现货市场做多,在期货市场做空。
  2. 我的代码总是将免费的 USDT 转入现货余额。如果没有仓位,USDT会一直在现货钱包里。
  3. 当我想做空时,代码将 USDT 转移到期货钱包并在 ETH / USDT 永续市场开空头。关闭 ETH/USDT 期货市场的空头头寸后,代码将免费的 USDT 转移到现货钱包。
  4. 所以假设我处于完全空头头寸。然后一半的空头头寸被触发平仓。该代码正在关闭一半的空头头寸,并使用上面的代码检查期货钱包中的免费 USDT 金额。假设平掉一半仓位后,期货钱包中的免费USDT余额为100 USDT。
  5. 然后代码将免费的 100 USDT 从期货钱包转移到现货钱包。但是我这里出现了“资产转移失败:余额不足”的错误。
  6. 我猜错误的原因是,当时我有100 USDT,但我的另一半头寸仍然是空头。因此,如果价格上涨并且我在那几毫秒内亏损,期货钱包中的免费 USDT 数量将少于 100 USDT。

我的问题是:

  1. 这个问题有什么有效的解决办法吗?你有什么建议?
  2. 如果代码中有错误,它会停止 运行。我如何更新转账部分的代码,如果由于余额不足转账而出现错误,请再次尝试将未来钱包余额的99%(account_balance_f * 99%)转入现货钱包。

非常感谢您提前抽出时间。

Is there any effective solution for this problem? What would you suggest?

如果您使用隔离保证金模式,当您的头寸价值达到up/down时,您的余额不会改变。在隔离模式下,您的抵押品被放入一个子账户,但在交叉模式下,它们都是从同一个池中取出的,这就是为什么您的余额会随着您的仓位大小而增加或减少的原因

您可以为每个市场设置保证金模式exchange.setMarginMode( symbol, 'isolated');

You can read more about isolated margin mode here

If there is an error in the code, it stops running. How can i update the code in money transfer part that if there is an error due to the insufficient balance to transfer, try again to transfer 99% of the balance of future wallet (account_balance_f * 99%) to spot wallet.

你知道 Python 中的 error handling/exceptions 吗?


我还建议使用 unified transfer method, instead of sapi_post_futures_transfer, here's an example of it

# -*- coding: utf-8 -*-

import os
import sys
from pprint import pprint

root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(root + '/python')

import ccxt  # noqa: E402


def main():

    # apiKey must have universal transfer permissions
    binance = ccxt.binance({
        "apiKey": "...",
        "secret": "...",
    })
    binance.load_markets()

    pprint(binance.transfer('USDT', 0.1, 'spot', 'future'))
    transfers = binance.fetchTransfers()
    pprint('got ' + str(len(transfers)) + ' transfers')
    pprint(binance.transfer('USDT', 0.1, 'spot', 'margin'))

    # binance requires from and to in the params
    pprint(binance.fetchTransfers(None, None, None, {'from': 'spot', 'to': 'margin'}))

    # alternatively the same effect as above
    pprint(binance.fetchTransfers(None, None, None, {'type': 'MAIN_MARGIN'}))  # defaults to MAIN_UMFUTURE


main()