diff --git a/freqtrade/tests/conftest.py b/freqtrade/tests/conftest.py index 4a8e294b9..dbc10e28a 100644 --- a/freqtrade/tests/conftest.py +++ b/freqtrade/tests/conftest.py @@ -499,3 +499,74 @@ def result(): # that inserts a trade of some type and open-status # return the open-order-id # See tests in rpc/main that could use this + + +@pytest.fixture(scope="function") +def trades_for_order(): + return [{'info': {'id': 34567, + 'orderId': 123456, + 'price': '0.24544100', + 'qty': '8.00000000', + 'commission': '0.00800000', + 'commissionAsset': 'LTC', + 'time': 1521663363189, + 'isBuyer': True, + 'isMaker': False, + 'isBestMatch': True}, + 'timestamp': 1521663363189, + 'datetime': '2018-03-21T20:16:03.189Z', + 'symbol': 'LTC/ETH', + 'id': '34567', + 'order': '123456', + 'type': None, + 'side': 'buy', + 'price': 0.245441, + 'cost': 1.963528, + 'amount': 8.0, + 'fee': {'cost': 0.008, 'currency': 'LTC'}}] + + +@pytest.fixture(scope="function") +def trades_for_order2(): + return [{'info': {'id': 34567, + 'orderId': 123456, + 'price': '0.24544100', + 'qty': '8.00000000', + 'commission': '0.00800000', + 'commissionAsset': 'LTC', + 'time': 1521663363189, + 'isBuyer': True, + 'isMaker': False, + 'isBestMatch': True}, + 'timestamp': 1521663363189, + 'datetime': '2018-03-21T20:16:03.189Z', + 'symbol': 'LTC/ETH', + 'id': '34567', + 'order': '123456', + 'type': None, + 'side': 'buy', + 'price': 0.245441, + 'cost': 1.963528, + 'amount': 4.0, + 'fee': {'cost': 0.004, 'currency': 'LTC'}}, + {'info': {'id': 34567, + 'orderId': 123456, + 'price': '0.24544100', + 'qty': '8.00000000', + 'commission': '0.00800000', + 'commissionAsset': 'LTC', + 'time': 1521663363189, + 'isBuyer': True, + 'isMaker': False, + 'isBestMatch': True}, + 'timestamp': 1521663363189, + 'datetime': '2018-03-21T20:16:03.189Z', + 'symbol': 'LTC/ETH', + 'id': '34567', + 'order': '123456', + 'type': None, + 'side': 'buy', + 'price': 0.245441, + 'cost': 1.963528, + 'amount': 4.0, + 'fee': {'cost': 0.004, 'currency': 'LTC'}}] diff --git a/freqtrade/tests/test_freqtradebot.py b/freqtrade/tests/test_freqtradebot.py index cc306f11d..c9413cbe7 100644 --- a/freqtrade/tests/test_freqtradebot.py +++ b/freqtrade/tests/test_freqtradebot.py @@ -1285,192 +1285,92 @@ def test_sell_profit_only_disable_loss(default_conf, limit_buy_order, mocker) -> def test_get_real_amount_quote(default_conf, trades_for_order, mocker): """ - Test get_real_amount + Test get_real_amount - fee in quote currency """ - rv = [{'info': {'id': 34567, - 'orderId': 123456, - 'price': '0.24544100', - 'qty': '8.00000000', - 'commission': '0.00800000', - 'commissionAsset': 'LTC', - 'time': 1521663363189, - 'isBuyer': True, - 'isMaker': False, - 'isBestMatch': True}, - 'timestamp': 1521663363189, - 'datetime': '2018-03-21T20:16:03.189Z', - 'symbol': 'LTC/ETH', - 'id': '34567', - 'order': '123456', - 'type': None, - 'side': 'buy', - 'price': 0.245441, - 'cost': 1.963528, - 'amount': 8.0, - 'fee': {'cost': 0.008, 'currency': 'LTC'}}] - mocker.patch('freqtrade.exchange.get_trades_for_order', return_value=rv) + mocker.patch('freqtrade.exchange.get_trades_for_order', return_value=trades_for_order) patch_get_signal(mocker) patch_RPCManager(mocker) patch_coinmarketcap(mocker) mocker.patch('freqtrade.exchange.validate_pairs', MagicMock(return_value=True)) + amount = sum(x['amount'] for x in trades_for_order) trade = Trade( pair='LTC/ETH', - amount=8, + amount=amount, exchange='binance', open_order_id="123456" ) freqtrade = FreqtradeBot(default_conf, create_engine('sqlite://')) - # Amount - cost - assert freqtrade.get_real_amount(trade) == 7.992 + # Amount is reduced by "fee" + assert freqtrade.get_real_amount(trade) == amount - (amount * 0.001) -def test_get_real_amount_stake(default_conf, mocker): +def test_get_real_amount_stake(default_conf, trades_for_order, mocker): """ - Test get_real_amount + Test get_real_amount - fees in Stake currency """ - - rv = [{'info': {'id': 34567, - 'orderId': 123456, - 'price': '0.24544100', - 'qty': '8.00000000', - 'commission': '0.00800000', - 'commissionAsset': 'LTC', - 'time': 1521663363189, - 'isBuyer': True, - 'isMaker': False, - 'isBestMatch': True}, - 'timestamp': 1521663363189, - 'datetime': '2018-03-21T20:16:03.189Z', - 'symbol': 'LTC/ETH', - 'id': '34567', - 'order': '123456', - 'type': None, - 'side': 'buy', - 'price': 0.245441, - 'cost': 1.963528, - 'amount': 8.0, - 'fee': {'cost': 0.008, 'currency': 'ETH'}}] - mocker.patch('freqtrade.exchange.get_trades_for_order', return_value=rv) - - patch_get_signal(mocker) - patch_RPCManager(mocker) - patch_coinmarketcap(mocker) - mocker.patch('freqtrade.exchange.validate_pairs', MagicMock(return_value=True)) - trade = Trade( - pair='IOTA/ETH', - amount=8, - exchange='binance', - open_order_id="123456" - ) - freqtrade = FreqtradeBot(default_conf, create_engine('sqlite://')) - # Amount - cost - assert freqtrade.get_real_amount(trade) == 8 - - -def test_get_real_amount_BNB(default_conf, mocker): - """ - Test get_real_amount - """ - - rv = [{'info': {'id': 34567, - 'orderId': 123456, - 'price': '0.24544100', - 'qty': '8.00000000', - 'commission': '0.00800000', - 'commissionAsset': 'LTC', - 'time': 1521663363189, - 'isBuyer': True, - 'isMaker': False, - 'isBestMatch': True}, - 'timestamp': 1521663363189, - 'datetime': '2018-03-21T20:16:03.189Z', - 'symbol': 'LTC/ETH', - 'id': '34567', - 'order': '123456', - 'type': None, - 'side': 'buy', - 'price': 0.245441, - 'cost': 1.963528, - 'amount': 8.0, - 'fee': {'cost': 0.00094518, 'currency': 'BNB'}}] - mocker.patch('freqtrade.exchange.get_trades_for_order', return_value=rv) - - patch_get_signal(mocker) - patch_RPCManager(mocker) - patch_coinmarketcap(mocker) - mocker.patch('freqtrade.exchange.validate_pairs', MagicMock(return_value=True)) - trade = Trade( - pair='IOTA/ETH', - amount=8, - exchange='binance', - open_order_id="123456" - ) - freqtrade = FreqtradeBot(default_conf, create_engine('sqlite://')) - # Amount - cost - assert freqtrade.get_real_amount(trade) == 8 - - -def test_get_real_amount_multi(default_conf, mocker): - """ - Test get_real_amount - """ - - rv = [{'info': {'id': 34567, - 'orderId': 123456, - 'price': '0.24544100', - 'qty': '8.00000000', - 'commission': '0.00800000', - 'commissionAsset': 'LTC', - 'time': 1521663363189, - 'isBuyer': True, - 'isMaker': False, - 'isBestMatch': True}, - 'timestamp': 1521663363189, - 'datetime': '2018-03-21T20:16:03.189Z', - 'symbol': 'LTC/ETH', - 'id': '34567', - 'order': '123456', - 'type': None, - 'side': 'buy', - 'price': 0.245441, - 'cost': 1.963528, - 'amount': 4.0, - 'fee': {'cost': 0.004, 'currency': 'LTC'}}, - {'info': {'id': 34567, - 'orderId': 123456, - 'price': '0.24544100', - 'qty': '8.00000000', - 'commission': '0.00800000', - 'commissionAsset': 'LTC', - 'time': 1521663363189, - 'isBuyer': True, - 'isMaker': False, - 'isBestMatch': True}, - 'timestamp': 1521663363189, - 'datetime': '2018-03-21T20:16:03.189Z', - 'symbol': 'LTC/ETH', - 'id': '34567', - 'order': '123456', - 'type': None, - 'side': 'buy', - 'price': 0.245441, - 'cost': 1.963528, - 'amount': 4.0, - 'fee': {'cost': 0.004, 'currency': 'LTC'}}] - mocker.patch('freqtrade.exchange.get_trades_for_order', return_value=rv) + trades_for_order[0]['fee']['currency'] = 'ETH' patch_get_signal(mocker) patch_RPCManager(mocker) patch_coinmarketcap(mocker) mocker.patch('freqtrade.exchange.validate_pairs', MagicMock(return_value=True)) + mocker.patch('freqtrade.exchange.get_trades_for_order', return_value=trades_for_order) + amount = sum(x['amount'] for x in trades_for_order) trade = Trade( pair='LTC/ETH', - amount=8, + amount=amount, exchange='binance', open_order_id="123456" ) freqtrade = FreqtradeBot(default_conf, create_engine('sqlite://')) - # Amount - cost - assert freqtrade.get_real_amount(trade) == 7.992 + # Amount does not change + assert freqtrade.get_real_amount(trade) == amount + + +def test_get_real_amount_BNB(default_conf, trades_for_order, mocker): + """ + Test get_real_amount - Fees in BNB + """ + + trades_for_order[0]['fee']['currency'] = 'BNB' + trades_for_order[0]['fee']['cost'] = 0.00094518 + + patch_get_signal(mocker) + patch_RPCManager(mocker) + patch_coinmarketcap(mocker) + mocker.patch('freqtrade.exchange.validate_pairs', MagicMock(return_value=True)) + mocker.patch('freqtrade.exchange.get_trades_for_order', return_value=trades_for_order) + amount = sum(x['amount'] for x in trades_for_order) + trade = Trade( + pair='LTC/ETH', + amount=amount, + exchange='binance', + open_order_id="123456" + ) + freqtrade = FreqtradeBot(default_conf, create_engine('sqlite://')) + # Amount does not change + assert freqtrade.get_real_amount(trade) == amount + + +def test_get_real_amount_multi(default_conf, trades_for_order2, mocker): + """ + Test get_real_amount with split trades (multiple trades for this order) + """ + + patch_get_signal(mocker) + patch_RPCManager(mocker) + patch_coinmarketcap(mocker) + mocker.patch('freqtrade.exchange.validate_pairs', MagicMock(return_value=True)) + mocker.patch('freqtrade.exchange.get_trades_for_order', return_value=trades_for_order2) + amount = float(sum(x['amount'] for x in trades_for_order2)) + trade = Trade( + pair='LTC/ETH', + amount=amount, + exchange='binance', + open_order_id="123456" + ) + freqtrade = FreqtradeBot(default_conf, create_engine('sqlite://')) + # Amount is reduced by "fee" + assert freqtrade.get_real_amount(trade) == amount - (amount * 0.001)