From 42be492404a06d60d8f70643e735a720b5b6e872 Mon Sep 17 00:00:00 2001 From: Kavinkumar <33546454+mkavinkumar1@users.noreply.github.com> Date: Thu, 3 Mar 2022 20:51:13 +0530 Subject: [PATCH] updated unit tests --- freqtrade/freqtradebot.py | 7 ++++-- freqtrade/optimize/backtesting1.py | 8 +++--- freqtrade/persistence/models.py | 22 ++++++---------- tests/rpc/test_rpc.py | 1 - tests/rpc/test_rpc_telegram.py | 40 ++++++++++++++++++++++-------- tests/test_freqtradebot.py | 7 +++--- 6 files changed, 51 insertions(+), 34 deletions(-) diff --git a/freqtrade/freqtradebot.py b/freqtrade/freqtradebot.py index 51f9a03a0..019fd24f2 100644 --- a/freqtrade/freqtradebot.py +++ b/freqtrade/freqtradebot.py @@ -629,7 +629,10 @@ class FreqtradeBot(LoggingMixin): trade.open_order_id = order_id trade.orders.append(order_obj) - trade.recalc_trade_from_orders() + if pos_adjust: + trade.recalc_trade_from_orders() + else: + trade.recalc_open_trade_value() Trade.query.session.add(trade) Trade.commit() @@ -1500,7 +1503,7 @@ class FreqtradeBot(LoggingMixin): return order_amount return self.fee_detection_from_trades(trade, order, order_amount, order.get('trades', [])) - rpc_msg:Dict[Any, Any] = {} + rpc_msg: Dict[Any, Any] = {} def fee_detection_from_trades(self, trade: Trade, order: Dict, order_amount: float, trades: List) -> float: diff --git a/freqtrade/optimize/backtesting1.py b/freqtrade/optimize/backtesting1.py index 03e8868c7..ec4d1c5cd 100644 --- a/freqtrade/optimize/backtesting1.py +++ b/freqtrade/optimize/backtesting1.py @@ -480,8 +480,10 @@ class Backtesting: return self._exit_trade(trade, sell_row, closerate) - def _exit_trade(self, trade: LocalTrade,sell_row: Tuple, - closerate: float, amount: float = None) -> Optional[LocalTrade]: + return None + + def _exit_trade(self, trade: LocalTrade, sell_row: Tuple, + closerate: float, amount: float = None) -> Optional[LocalTrade]: self.order_id_counter += 1 # mdebug if amount: @@ -821,7 +823,7 @@ class Backtesting: # mdebug logger.info(f'822 {order.safe_amount_after_fee} != {trade.amount}') order.close_bt_order(current_time) - trade.process_sell_sub_trade(order, is_non_bt = False) + trade.process_sell_sub_trade(order, is_non_bt=False) trade.recalc_trade_from_orders() else: trade.close_date = current_time diff --git a/freqtrade/persistence/models.py b/freqtrade/persistence/models.py index 93c3676cd..321c0ebd7 100644 --- a/freqtrade/persistence/models.py +++ b/freqtrade/persistence/models.py @@ -516,7 +516,8 @@ class LocalTrade(): raise ValueError(f'Unknown order type: {order.order_type}') Trade.commit() - def process_sell_sub_trade(self, order: Order, is_closed: bool = True, is_non_bt: bool = True) -> None: + def process_sell_sub_trade(self, order: Order, is_closed: bool = True, + is_non_bt: bool = True) -> None: orders = (self.select_filled_orders('buy')) sell_amount = order.safe_filled sell_rate = order.safe_price @@ -524,7 +525,8 @@ class LocalTrade(): if is_closed: if sell_amount == self.amount: self.close(sell_rate) - if is_non_bt: Trade.commit() + if is_non_bt: + Trade.commit() return profit = 0.0 idx = -1 @@ -547,12 +549,14 @@ class LocalTrade(): amount2 = b_order2.safe_amount_after_fee b_order2.average = (b_order2.average * amount2 - profit / (1 + self.fee_open)) / amount2 b_order2.order_update_date = datetime.now(timezone.utc) - if is_non_bt: Order.query.session.commit() + if is_non_bt: + Order.query.session.commit() self.recalc_trade_from_orders() self.close_profit_abs = profit self.close_profit = sell_stake_amount / (sell_stake_amount - profit) - 1 - if is_non_bt: Trade.commit() + if is_non_bt: + Trade.commit() def calc_profit2(self, open_rate: float, close_rate: float, amount: float) -> float: @@ -692,14 +696,6 @@ class LocalTrade(): return float(f"{profit_ratio:.8f}") def recalc_trade_from_orders(self): - # mdebug - import json - # logger.info(json.dumps(self.to_json(), indent =4)) - if len(self.select_filled_orders('buy')) < 2 and 0: - # Just in case, still recalc open trade value - # needs to remove - self.recalc_open_trade_value() - return total_amount = 0.0 total_stake = 0.0 for o in self.orders: @@ -723,8 +719,6 @@ class LocalTrade(): self.recalc_open_trade_value() if self.stop_loss_pct is not None and self.open_rate is not None: self.adjust_stop_loss(self.open_rate, self.stop_loss_pct) - # logger.info(json.dumps(self.to_json(), indent =4)) - # mdebug def select_order_by_order_id(self, order_id: str) -> Optional[Order]: """ diff --git a/tests/rpc/test_rpc.py b/tests/rpc/test_rpc.py index f66e6cf6e..1776bc7cf 100644 --- a/tests/rpc/test_rpc.py +++ b/tests/rpc/test_rpc.py @@ -439,7 +439,6 @@ def test_rpc_trade_statistics(default_conf, ticker, ticker_sell_up, fee, oobj = Order.parse_from_ccxt_object(limit_buy_order, limit_buy_order['symbol'], 'buy') trade.open_rate = oobj.safe_price trade.amount = oobj.safe_amount_after_fee - # Update the ticker with a market going up mocker.patch.multiple( 'freqtrade.exchange.Exchange', diff --git a/tests/rpc/test_rpc_telegram.py b/tests/rpc/test_rpc_telegram.py index 51d3bccb9..0044601a8 100644 --- a/tests/rpc/test_rpc_telegram.py +++ b/tests/rpc/test_rpc_telegram.py @@ -421,7 +421,9 @@ def test_daily_handle(default_conf, update, ticker, limit_buy_order, fee, # Simulate fulfilled LIMIT_BUY order for trade oobj = Order.parse_from_ccxt_object(limit_buy_order, limit_buy_order['symbol'], 'buy') - trade.update_trade(oobj) + trade.open_rate = oobj.safe_price + trade.amount = oobj.safe_amount_after_fee + trade.recalc_open_trade_value() # Simulate fulfilled LIMIT_SELL order for trade oobjs = Order.parse_from_ccxt_object(limit_sell_order, limit_sell_order['symbol'], 'sell') @@ -465,7 +467,9 @@ def test_daily_handle(default_conf, update, ticker, limit_buy_order, fee, trades = Trade.query.all() for trade in trades: - trade.update_trade(oobj) + trade.open_rate = oobj.safe_price + trade.amount = oobj.safe_amount_after_fee + trade.recalc_open_trade_value() trade.update_trade(oobjs) trade.close_date = datetime.utcnow() trade.is_open = False @@ -532,7 +536,9 @@ def test_weekly_handle(default_conf, update, ticker, limit_buy_order, fee, # Simulate fulfilled LIMIT_BUY order for trade oobj = Order.parse_from_ccxt_object(limit_buy_order, limit_buy_order['symbol'], 'buy') - trade.update_trade(oobj) + trade.open_rate = oobj.safe_price + trade.amount = oobj.safe_amount_after_fee + trade.recalc_open_trade_value() # Simulate fulfilled LIMIT_SELL order for trade oobjs = Order.parse_from_ccxt_object(limit_sell_order, limit_sell_order['symbol'], 'sell') @@ -580,7 +586,9 @@ def test_weekly_handle(default_conf, update, ticker, limit_buy_order, fee, trades = Trade.query.all() for trade in trades: - trade.update_trade(oobj) + trade.open_rate = oobj.safe_price + trade.amount = oobj.safe_amount_after_fee + trade.recalc_open_trade_value() trade.update_trade(oobjs) trade.close_date = datetime.utcnow() trade.is_open = False @@ -650,7 +658,9 @@ def test_monthly_handle(default_conf, update, ticker, limit_buy_order, fee, # Simulate fulfilled LIMIT_BUY order for trade oobj = Order.parse_from_ccxt_object(limit_buy_order, limit_buy_order['symbol'], 'buy') - trade.update_trade(oobj) + trade.open_rate = oobj.safe_price + trade.amount = oobj.safe_amount_after_fee + trade.recalc_open_trade_value() # Simulate fulfilled LIMIT_SELL order for trade oobjs = Order.parse_from_ccxt_object(limit_sell_order, limit_sell_order['symbol'], 'sell') @@ -698,7 +708,9 @@ def test_monthly_handle(default_conf, update, ticker, limit_buy_order, fee, trades = Trade.query.all() for trade in trades: - trade.update_trade(oobj) + trade.open_rate = oobj.safe_price + trade.amount = oobj.safe_amount_after_fee + trade.recalc_open_trade_value() trade.update_trade(oobjs) trade.close_date = datetime.utcnow() trade.is_open = False @@ -770,7 +782,9 @@ def test_profit_handle(default_conf, update, ticker, ticker_sell_up, fee, # Simulate fulfilled LIMIT_BUY order for trade oobj = Order.parse_from_ccxt_object(limit_buy_order, limit_buy_order['symbol'], 'buy') - trade.update_trade(oobj) + trade.open_rate = oobj.safe_price + trade.amount = oobj.safe_amount_after_fee + Trade.commit() context = MagicMock() # Test with invalid 2nd argument (should silently pass) @@ -1305,7 +1319,8 @@ def test_telegram_performance_handle(default_conf, update, ticker, fee, # Simulate fulfilled LIMIT_BUY order for trade oobj = Order.parse_from_ccxt_object(limit_buy_order, limit_buy_order['symbol'], 'buy') - trade.update_trade(oobj) + trade.open_rate = oobj.safe_price + trade.amount = oobj.safe_amount_after_fee # Simulate fulfilled LIMIT_SELL order for trade oobj = Order.parse_from_ccxt_object(limit_sell_order, limit_sell_order['symbol'], 'sell') @@ -1337,7 +1352,8 @@ def test_telegram_buy_tag_performance_handle(default_conf, update, ticker, fee, # Simulate fulfilled LIMIT_BUY order for trade oobj = Order.parse_from_ccxt_object(limit_buy_order, limit_buy_order['symbol'], 'buy') - trade.update_trade(oobj) + trade.open_rate = oobj.safe_price + trade.amount = oobj.safe_amount_after_fee # Simulate fulfilled LIMIT_SELL order for trade oobj = Order.parse_from_ccxt_object(limit_sell_order, limit_sell_order['symbol'], 'sell') @@ -1381,7 +1397,8 @@ def test_telegram_sell_reason_performance_handle(default_conf, update, ticker, f trade.sell_reason = 'TESTSELL' # Simulate fulfilled LIMIT_BUY order for trade oobj = Order.parse_from_ccxt_object(limit_buy_order, limit_buy_order['symbol'], 'buy') - trade.update_trade(oobj) + trade.open_rate = oobj.safe_price + trade.amount = oobj.safe_amount_after_fee # Simulate fulfilled LIMIT_SELL order for trade oobj = Order.parse_from_ccxt_object(limit_sell_order, limit_sell_order['symbol'], 'sell') @@ -1427,7 +1444,8 @@ def test_telegram_mix_tag_performance_handle(default_conf, update, ticker, fee, # Simulate fulfilled LIMIT_BUY order for trade oobj = Order.parse_from_ccxt_object(limit_buy_order, limit_buy_order['symbol'], 'buy') - trade.update_trade(oobj) + trade.open_rate = oobj.safe_price + trade.amount = oobj.safe_amount_after_fee # Simulate fulfilled LIMIT_SELL order for trade oobj = Order.parse_from_ccxt_object(limit_sell_order, limit_sell_order['symbol'], 'sell') diff --git a/tests/test_freqtradebot.py b/tests/test_freqtradebot.py index 5c4ed4edc..cbcb3d0a3 100644 --- a/tests/test_freqtradebot.py +++ b/tests/test_freqtradebot.py @@ -4621,8 +4621,8 @@ def test_position_adjust(mocker, default_conf_usdt, fee) -> None: assert trade.open_order_id is None assert trade.is_open assert trade.amount == 22 - assert trade.stake_amount == 203.5625 - assert pytest.approx(trade.open_rate) == 9.252840909090908 + assert trade.stake_amount == 203.59850374064837 + assert pytest.approx(trade.open_rate) == 9.254477442756745 orders = Order.query.all() assert orders @@ -4635,7 +4635,7 @@ def test_position_adjust(mocker, default_conf_usdt, fee) -> None: def test_position_adjust2(mocker, default_conf_usdt, fee) -> None: """ - buy 100 @ 11 + buy 100 @ 11 sell 50 @ 8 sell 50 @ 16 """ @@ -4801,6 +4801,7 @@ def test_position_adjust2(mocker, default_conf_usdt, fee) -> None: # Make sure the closed order is found as the second order. order = trade.select_order('sell', False) assert order.order_id == '602' + assert trade.is_open is False def test_process_open_trade_positions_exception(mocker, default_conf_usdt, fee, caplog) -> None: