exchange.get_max_amount_tradable looks at cost also
This commit is contained in:
parent
6e8420914e
commit
ff5fffefb4
@ -2119,19 +2119,39 @@ class Exchange:
|
|||||||
raise OperationalException(
|
raise OperationalException(
|
||||||
"Freqtrade only supports isolated futures for leverage trading")
|
"Freqtrade only supports isolated futures for leverage trading")
|
||||||
|
|
||||||
def get_max_amount_tradable(self, pair: str) -> float:
|
def get_max_amount_tradable(self, pair: str, price: float) -> float:
|
||||||
'''
|
'''
|
||||||
Gets the maximum amount of a currency that the exchange will let you trade
|
Gets the maximum amount of a currency that the exchange will let you trade
|
||||||
'''
|
'''
|
||||||
|
try:
|
||||||
market = self.markets[pair]
|
market = self.markets[pair]
|
||||||
contractSize = market['contractSize']
|
except KeyError:
|
||||||
if not contractSize or market['spot']:
|
raise ValueError(f"Can't get market information for symbol {pair}")
|
||||||
contractSize = 1
|
|
||||||
maxAmount = market['limits']['amount']['max']
|
market = self.markets[pair]
|
||||||
if maxAmount:
|
limits = market['limits']
|
||||||
return maxAmount * contractSize
|
max_amounts = []
|
||||||
else:
|
|
||||||
|
if (limits['cost']['max'] is not None):
|
||||||
|
max_amounts.append(
|
||||||
|
self._contracts_to_amount(
|
||||||
|
pair,
|
||||||
|
limits['cost']['max'] / price
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (limits['amount']['max'] is not None):
|
||||||
|
max_amounts.append(
|
||||||
|
self._contracts_to_amount(
|
||||||
|
pair,
|
||||||
|
limits['amount']['max']
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if not max_amounts:
|
||||||
return float('inf')
|
return float('inf')
|
||||||
|
else:
|
||||||
|
return min(max_amounts)
|
||||||
|
|
||||||
|
|
||||||
def is_exchange_known_ccxt(exchange_name: str, ccxt_module: CcxtModuleType = None) -> bool:
|
def is_exchange_known_ccxt(exchange_name: str, ccxt_module: CcxtModuleType = None) -> bool:
|
||||||
|
@ -4049,143 +4049,119 @@ def test_get_max_amount_tradable(
|
|||||||
default_conf,
|
default_conf,
|
||||||
):
|
):
|
||||||
api_mock = MagicMock()
|
api_mock = MagicMock()
|
||||||
|
default_conf['collateral'] = 'isolated'
|
||||||
|
default_conf['trading_mode'] = 'futures'
|
||||||
exchange = get_patched_exchange(mocker, default_conf, api_mock)
|
exchange = get_patched_exchange(mocker, default_conf, api_mock)
|
||||||
markets = {
|
markets = {
|
||||||
'XRP/USDT': {
|
'XRP/USDT:USDT': {
|
||||||
'limits': {
|
'limits': {
|
||||||
'leverage': {
|
|
||||||
'min': None,
|
|
||||||
'max': None,
|
|
||||||
},
|
|
||||||
'amount': {
|
'amount': {
|
||||||
'min': 0.001,
|
'min': 0.001,
|
||||||
'max': 10000
|
'max': 10000
|
||||||
},
|
},
|
||||||
'price': {
|
|
||||||
'min': 39.86,
|
|
||||||
'max': 306177
|
|
||||||
},
|
|
||||||
'cost': {
|
'cost': {
|
||||||
'min': 5,
|
'min': 5,
|
||||||
'max': None
|
'max': None
|
||||||
},
|
},
|
||||||
'market': {
|
|
||||||
'min': 0.001,
|
|
||||||
'max': 2000
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'precision': {
|
|
||||||
'price': 2,
|
|
||||||
'amount': 3,
|
|
||||||
'base': 8,
|
|
||||||
'quote': 8
|
|
||||||
},
|
},
|
||||||
'contractSize': None,
|
'contractSize': None,
|
||||||
'spot': False,
|
'spot': False,
|
||||||
'swap': True
|
|
||||||
},
|
},
|
||||||
'LTC/USDT': {
|
'LTC/USDT:USDT': {
|
||||||
'limits': {
|
'limits': {
|
||||||
'leverage': {
|
|
||||||
'min': None,
|
|
||||||
'max': None,
|
|
||||||
},
|
|
||||||
'amount': {
|
'amount': {
|
||||||
'min': 0.001,
|
'min': 0.001,
|
||||||
'max': None
|
'max': None
|
||||||
},
|
},
|
||||||
'price': {
|
|
||||||
'min': 39.86,
|
|
||||||
'max': 306177
|
|
||||||
},
|
|
||||||
'cost': {
|
'cost': {
|
||||||
'min': 5,
|
'min': 5,
|
||||||
'max': None
|
'max': None
|
||||||
},
|
},
|
||||||
'market': {
|
|
||||||
'min': 0.001,
|
|
||||||
'max': 2000
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'precision': {
|
|
||||||
'price': 2,
|
|
||||||
'amount': 3,
|
|
||||||
'base': 8,
|
|
||||||
'quote': 8
|
|
||||||
},
|
},
|
||||||
'contractSize': 0.01,
|
'contractSize': 0.01,
|
||||||
'spot': False,
|
'spot': False,
|
||||||
'swap': True
|
|
||||||
},
|
},
|
||||||
'ETH/USDT': {
|
'ETH/USDT:USDT': {
|
||||||
'limits': {
|
'limits': {
|
||||||
'leverage': {
|
|
||||||
'min': None,
|
|
||||||
'max': None,
|
|
||||||
},
|
|
||||||
'amount': {
|
'amount': {
|
||||||
'min': 0.001,
|
'min': 0.001,
|
||||||
'max': 10000
|
'max': 10000
|
||||||
},
|
},
|
||||||
'price': {
|
|
||||||
'min': 39.86,
|
|
||||||
'max': 306177
|
|
||||||
},
|
|
||||||
'cost': {
|
'cost': {
|
||||||
'min': 5,
|
'min': 5,
|
||||||
'max': None
|
'max': 30000,
|
||||||
},
|
},
|
||||||
'market': {
|
|
||||||
'min': 0.001,
|
|
||||||
'max': 2000
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'precision': {
|
|
||||||
'price': 2,
|
|
||||||
'amount': 3,
|
|
||||||
'base': 8,
|
|
||||||
'quote': 8
|
|
||||||
},
|
},
|
||||||
'contractSize': 0.01,
|
'contractSize': 0.01,
|
||||||
'spot': False,
|
'spot': False,
|
||||||
'swap': True
|
|
||||||
},
|
},
|
||||||
'BTC/USDT': {
|
'BTC/USDT': {
|
||||||
'limits': {
|
'limits': {
|
||||||
'leverage': {
|
|
||||||
'min': None,
|
|
||||||
'max': None,
|
|
||||||
},
|
|
||||||
'amount': {
|
'amount': {
|
||||||
'min': 0.001,
|
'min': 0.001,
|
||||||
'max': 10000
|
'max': 10000
|
||||||
},
|
},
|
||||||
'price': {
|
|
||||||
'min': 39.86,
|
|
||||||
'max': 306177
|
|
||||||
},
|
|
||||||
'cost': {
|
'cost': {
|
||||||
'min': 5,
|
'min': 5,
|
||||||
'max': None
|
'max': None
|
||||||
},
|
},
|
||||||
'market': {
|
|
||||||
'min': 0.001,
|
|
||||||
'max': 2000
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'precision': {
|
|
||||||
'price': 2,
|
|
||||||
'amount': 3,
|
|
||||||
'base': 8,
|
|
||||||
'quote': 8
|
|
||||||
},
|
},
|
||||||
'contractSize': 0.01,
|
'contractSize': 0.01,
|
||||||
'spot': True,
|
'spot': True,
|
||||||
'swap': False
|
},
|
||||||
}
|
'ADA/USDT': {
|
||||||
|
'limits': {
|
||||||
|
'amount': {
|
||||||
|
'min': 0.001,
|
||||||
|
'max': 10000
|
||||||
|
},
|
||||||
|
'cost': {
|
||||||
|
'min': 5,
|
||||||
|
'max': 500,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'contractSize': 0.01,
|
||||||
|
'spot': True,
|
||||||
|
},
|
||||||
|
'DOGE/USDT:USDT': {
|
||||||
|
'limits': {
|
||||||
|
'amount': {
|
||||||
|
'min': 0.001,
|
||||||
|
'max': 10000
|
||||||
|
},
|
||||||
|
'cost': {
|
||||||
|
'min': 5,
|
||||||
|
'max': 500
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'contractSize': None,
|
||||||
|
'spot': False,
|
||||||
|
},
|
||||||
|
'LUNA/USDT:USDT': {
|
||||||
|
'limits': {
|
||||||
|
'amount': {
|
||||||
|
'min': 0.001,
|
||||||
|
'max': 10000
|
||||||
|
},
|
||||||
|
'cost': {
|
||||||
|
'min': 5,
|
||||||
|
'max': 500
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'contractSize': 0.01,
|
||||||
|
'spot': False,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
mocker.patch('freqtrade.exchange.Exchange.markets', markets)
|
mocker.patch('freqtrade.exchange.Exchange.markets', markets)
|
||||||
assert exchange.get_max_amount_tradable('XRP/USDT') == 10000
|
assert exchange.get_max_amount_tradable('XRP/USDT:USDT', 2.0) == 10000
|
||||||
assert exchange.get_max_amount_tradable('LTC/USDT') == float('inf')
|
assert exchange.get_max_amount_tradable('LTC/USDT:USDT', 2.0) == float('inf')
|
||||||
assert exchange.get_max_amount_tradable('ETH/USDT') == 100
|
assert exchange.get_max_amount_tradable('ETH/USDT:USDT', 2.0) == 100
|
||||||
assert exchange.get_max_amount_tradable('BTC/USDT') == 10000
|
assert exchange.get_max_amount_tradable('DOGE/USDT:USDT', 2.0) == 250
|
||||||
|
assert exchange.get_max_amount_tradable('LUNA/USDT:USDT', 2.0) == 2.5
|
||||||
|
|
||||||
|
default_conf['trading_mode'] = 'spot'
|
||||||
|
exchange = get_patched_exchange(mocker, default_conf, api_mock)
|
||||||
|
mocker.patch('freqtrade.exchange.Exchange.markets', markets)
|
||||||
|
assert exchange.get_max_amount_tradable('BTC/USDT', 2.0) == 10000
|
||||||
|
assert exchange.get_max_amount_tradable('ADA/USDT', 2.0) == 250
|
||||||
|
Loading…
Reference in New Issue
Block a user