使用 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 进行算法交易。让我试着解释一下我的问题:
- 由于币安的资金费率,我在现货市场做多,在期货市场做空。
- 我的代码总是将免费的 USDT 转入现货余额。如果没有仓位,USDT会一直在现货钱包里。
- 当我想做空时,代码将 USDT 转移到期货钱包并在 ETH / USDT 永续市场开空头。关闭 ETH/USDT 期货市场的空头头寸后,代码将免费的 USDT 转移到现货钱包。
- 所以假设我处于完全空头头寸。然后一半的空头头寸被触发平仓。该代码正在关闭一半的空头头寸,并使用上面的代码检查期货钱包中的免费 USDT 金额。假设平掉一半仓位后,期货钱包中的免费USDT余额为100 USDT。
- 然后代码将免费的 100 USDT 从期货钱包转移到现货钱包。但是我这里出现了“资产转移失败:余额不足”的错误。
- 我猜错误的原因是,当时我有100 USDT,但我的另一半头寸仍然是空头。因此,如果价格上涨并且我在那几毫秒内亏损,期货钱包中的免费 USDT 数量将少于 100 USDT。
我的问题是:
- 这个问题有什么有效的解决办法吗?你有什么建议?
- 如果代码中有错误,它会停止 运行。我如何更新转账部分的代码,如果由于余额不足转账而出现错误,请再次尝试将未来钱包余额的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()
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 进行算法交易。让我试着解释一下我的问题:
- 由于币安的资金费率,我在现货市场做多,在期货市场做空。
- 我的代码总是将免费的 USDT 转入现货余额。如果没有仓位,USDT会一直在现货钱包里。
- 当我想做空时,代码将 USDT 转移到期货钱包并在 ETH / USDT 永续市场开空头。关闭 ETH/USDT 期货市场的空头头寸后,代码将免费的 USDT 转移到现货钱包。
- 所以假设我处于完全空头头寸。然后一半的空头头寸被触发平仓。该代码正在关闭一半的空头头寸,并使用上面的代码检查期货钱包中的免费 USDT 金额。假设平掉一半仓位后,期货钱包中的免费USDT余额为100 USDT。
- 然后代码将免费的 100 USDT 从期货钱包转移到现货钱包。但是我这里出现了“资产转移失败:余额不足”的错误。
- 我猜错误的原因是,当时我有100 USDT,但我的另一半头寸仍然是空头。因此,如果价格上涨并且我在那几毫秒内亏损,期货钱包中的免费 USDT 数量将少于 100 USDT。
我的问题是:
- 这个问题有什么有效的解决办法吗?你有什么建议?
- 如果代码中有错误,它会停止 运行。我如何更新转账部分的代码,如果由于余额不足转账而出现错误,请再次尝试将未来钱包余额的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()