From 263bf918b13e19a69a3b8c7b64bfbd8f0773df1b Mon Sep 17 00:00:00 2001 From: Matthias Voppichler Date: Tue, 15 May 2018 19:49:28 +0200 Subject: [PATCH 1/3] Fix bug pointed out in #679 --- freqtrade/freqtradebot.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 56ace2ae2..7c955d423 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -397,7 +397,7 @@ class FreqtradeBot(object): return order_amount # use fee from order-dict if possible - if 'fee' in order and order['fee']: + if 'fee' in order and order['fee'] and (order['fee'].keys() >= {'currency', 'cost'}): if trade.pair.startswith(order['fee']['currency']): new_amount = order_amount - order['fee']['cost'] logger.info("Applying fee on amount for %s (from %s to %s) from Order", @@ -414,7 +414,7 @@ class FreqtradeBot(object): fee_abs = 0 for exectrade in trades: amount += exectrade['amount'] - if "fee" in exectrade: + if "fee" in exectrade and (exectrade['fee'].keys() >= {'currency', 'cost'}): # only applies if fee is in quote currency! if trade.pair.startswith(exectrade['fee']['currency']): fee_abs += exectrade['fee']['cost'] From a1fa688da007bf20f91562e2a1d4fad515c10022 Mon Sep 17 00:00:00 2001 From: Matthias Voppichler Date: Tue, 15 May 2018 19:49:47 +0200 Subject: [PATCH 2/3] Add tests for the new scenario --- freqtrade/tests/test_freqtradebot.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/freqtrade/tests/test_freqtradebot.py b/freqtrade/tests/test_freqtradebot.py index d9de2c3dc..a5bd435b0 100644 --- a/freqtrade/tests/test_freqtradebot.py +++ b/freqtrade/tests/test_freqtradebot.py @@ -1458,3 +1458,28 @@ def test_get_real_amount_fromorder(default_conf, trades_for_order, buy_order_fee assert log_has('Applying fee on amount for Trade(id=None, pair=LTC/ETH, amount=8.00000000, ' 'open_rate=0.24544100, open_since=closed) (from 8.0 to 7.996) from Order', caplog.record_tuples) + + +def test_get_real_amount_invalid(default_conf, trades_for_order, buy_order_fee, caplog, mocker): + """ + Test get_real_amount - fees in Stake currency + """ + # Remove "Currency" from fee dict + trades_for_order[0]['fee'] = {'cost': 0.008} + + 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_rate=0.245441, + open_order_id="123456" + ) + freqtrade = FreqtradeBot(default_conf, create_engine('sqlite://')) + # Amount does not change + assert freqtrade.get_real_amount(trade, buy_order_fee) == amount From ef78f2f03a6f74992d00d45bd3b725a2953ef6f0 Mon Sep 17 00:00:00 2001 From: Matthias Voppichler Date: Tue, 15 May 2018 20:13:43 +0200 Subject: [PATCH 3/3] Add test for invalid order_fee dict --- freqtrade/tests/test_freqtradebot.py | 29 ++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/freqtrade/tests/test_freqtradebot.py b/freqtrade/tests/test_freqtradebot.py index a5bd435b0..ebabc0187 100644 --- a/freqtrade/tests/test_freqtradebot.py +++ b/freqtrade/tests/test_freqtradebot.py @@ -1443,7 +1443,7 @@ def test_get_real_amount_fromorder(default_conf, trades_for_order, buy_order_fee 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) + mocker.patch('freqtrade.exchange.get_trades_for_order', return_value=[trades_for_order]) amount = float(sum(x['amount'] for x in trades_for_order)) trade = Trade( pair='LTC/ETH', @@ -1460,7 +1460,32 @@ def test_get_real_amount_fromorder(default_conf, trades_for_order, buy_order_fee caplog.record_tuples) -def test_get_real_amount_invalid(default_conf, trades_for_order, buy_order_fee, caplog, mocker): +def test_get_real_amount_invalid_order(default_conf, trades_for_order, buy_order_fee, mocker): + """ + Test get_real_amount with split trades (multiple trades for this order) + """ + limit_buy_order = deepcopy(buy_order_fee) + limit_buy_order['fee'] = {'cost': 0.004} + + 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=[]) + amount = float(sum(x['amount'] for x in trades_for_order)) + trade = Trade( + pair='LTC/ETH', + amount=amount, + exchange='binance', + open_rate=0.245441, + open_order_id="123456" + ) + freqtrade = FreqtradeBot(default_conf, create_engine('sqlite://')) + # Amount does not change + assert freqtrade.get_real_amount(trade, limit_buy_order) == amount + + +def test_get_real_amount_invalid(default_conf, trades_for_order, buy_order_fee, mocker): """ Test get_real_amount - fees in Stake currency """