From 78f2987f88ae2cc13c55b4d06c8b8cb6d050855f Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Fri, 2 Jul 2021 02:48:30 -0600 Subject: [PATCH] Added get open trades test --- tests/conftest.py | 8 +-- tests/conftest_trades.py | 94 +++++++++++++++++++++++++-------- tests/test_persistence.py | 2 +- tests/test_persistence_short.py | 32 +++++------ 4 files changed, 92 insertions(+), 44 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 625397caf..a19dbac2b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -205,10 +205,10 @@ def create_mock_trades(fee, use_db: bool = True): trade = mock_trade_6(fee) add_trade(trade) # TODO: margin trades - # trade = short_trade(fee) - # add_trade(trade) - # trade = leverage_trade(fee) - # add_trade(trade) + trade = short_trade(fee) + add_trade(trade) + trade = leverage_trade(fee) + add_trade(trade) if use_db: Trade.query.session.flush() diff --git a/tests/conftest_trades.py b/tests/conftest_trades.py index 41213732a..9bf334b48 100644 --- a/tests/conftest_trades.py +++ b/tests/conftest_trades.py @@ -319,8 +319,6 @@ def short_order(): 'amount': 123.0, 'filled': 123.0, 'remaining': 0.0, - 'leverage': 5.0, - 'isShort': True } @@ -335,36 +333,60 @@ def exit_short_order(): 'amount': 123.0, 'filled': 123.0, 'remaining': 0.0, - 'leverage': 5.0, - 'isShort': True } def short_trade(fee): """ - Closed trade... + 10 minute short limit trade on binance + + Short trade + fee: 0.25% base + interest_rate: 0.05% per day + open_rate: 0.123 base + close_rate: 0.128 base + amount: 123.0 crypto + stake_amount: 15.129 base + borrowed: 123.0 crypto + time-periods: 10 minutes(rounds up to 1/24 time-period of 1 day) + interest: borrowed * interest_rate * time-periods + = 123.0 * 0.0005 * 1/24 = 0.0025625 crypto + open_value: (amount * open_rate) - (amount * open_rate * fee) + = (123 * 0.123) - (123 * 0.123 * 0.0025) + = 15.091177499999999 + amount_closed: amount + interest = 123 + 0.0025625 = 123.0025625 + close_value: (amount_closed * close_rate) + (amount_closed * close_rate * fee) + = (123.0025625 * 0.128) + (123.0025625 * 0.128 * 0.0025) + = 15.78368882 + total_profit = open_value - close_value + = 15.091177499999999 - 15.78368882 + = -0.6925113200000013 + total_profit_percentage = total_profit / stake_amount + = -0.6925113200000013 / 15.129 + = -0.04577376693766946 + """ trade = Trade( pair='ETC/BTC', - stake_amount=0.001, + stake_amount=15.129, amount=123.0, amount_requested=123.0, fee_open=fee.return_value, fee_close=fee.return_value, open_rate=0.123, - close_rate=0.128, - close_profit=0.025, - close_profit_abs=0.000584127, + # close_rate=0.128, + # close_profit=-0.04577376693766946, + # close_profit_abs=-0.6925113200000013, exchange='binance', - is_open=False, + is_open=True, open_order_id='dry_run_exit_short_12345', strategy='DefaultStrategy', timeframe=5, sell_reason='sell_signal', # TODO-mg: Update to exit/close reason open_date=datetime.now(tz=timezone.utc) - timedelta(minutes=20), - close_date=datetime.now(tz=timezone.utc) - timedelta(minutes=2), + # close_date=datetime.now(tz=timezone.utc) - timedelta(minutes=2), # borrowed= - isShort=True + is_short=True ) o = Order.parse_from_ccxt_object(short_order(), 'ETC/BTC', 'sell') trade.orders.append(o) @@ -399,34 +421,60 @@ def leverage_order_sell(): 'amount': 123.0, 'filled': 123.0, 'remaining': 0.0, - 'leverage': 5.0, - 'isShort': True } def leverage_trade(fee): """ - Closed trade... + 5 hour short limit trade on kraken + + Short trade + fee: 0.25% base + interest_rate: 0.05% per day + open_rate: 0.123 base + close_rate: 0.128 base + amount: 123.0 crypto + amount_with_leverage: 615.0 + stake_amount: 15.129 base + borrowed: 60.516 base + leverage: 5 + time-periods: 5 hrs( 5/4 time-period of 4 hours) + interest: borrowed * interest_rate * time-periods + = 60.516 * 0.0005 * 1/24 = 0.0378225 base + open_value: (amount * open_rate) - (amount * open_rate * fee) + = (615.0 * 0.123) - (615.0 * 0.123 * 0.0025) + = 75.4558875 + + close_value: (amount_closed * close_rate) + (amount_closed * close_rate * fee) + = (615.0 * 0.128) + (615.0 * 0.128 * 0.0025) + = 78.9168 + total_profit = close_value - open_value - interest + = 78.9168 - 75.4558875 - 0.0378225 + = 3.423089999999992 + total_profit_percentage = total_profit / stake_amount + = 3.423089999999992 / 15.129 + = 0.22626016260162551 """ trade = Trade( pair='ETC/BTC', - stake_amount=0.001, - amount=615.0, - amount_requested=615.0, + stake_amount=15.129, + amount=123.0, + leverage=5, + amount_requested=123.0, fee_open=fee.return_value, fee_close=fee.return_value, open_rate=0.123, close_rate=0.128, - close_profit=0.005, # TODO-mg: Would this be -0.005 or -0.025 - close_profit_abs=0.000584127, - exchange='binance', + close_profit=0.22626016260162551, + close_profit_abs=3.423089999999992, + exchange='kraken', is_open=False, open_order_id='dry_run_leverage_sell_12345', strategy='DefaultStrategy', timeframe=5, sell_reason='sell_signal', # TODO-mg: Update to exit/close reason - open_date=datetime.now(tz=timezone.utc) - timedelta(minutes=20), - close_date=datetime.now(tz=timezone.utc) - timedelta(minutes=2), + open_date=datetime.now(tz=timezone.utc) - timedelta(minutes=300), + close_date=datetime.now(tz=timezone.utc), # borrowed= ) o = Order.parse_from_ccxt_object(leverage_order(), 'ETC/BTC', 'sell') diff --git a/tests/test_persistence.py b/tests/test_persistence.py index febfd5c2a..6709a526f 100644 --- a/tests/test_persistence.py +++ b/tests/test_persistence.py @@ -907,7 +907,7 @@ def test_get_open(fee, use_db): Trade.reset_trades() create_mock_trades(fee, use_db) - assert len(Trade.get_open_trades()) == 4 + assert len(Trade.get_open_trades()) == 5 Trade.use_db = True diff --git a/tests/test_persistence_short.py b/tests/test_persistence_short.py index b240de006..782782118 100644 --- a/tests/test_persistence_short.py +++ b/tests/test_persistence_short.py @@ -43,9 +43,6 @@ def test_update_with_binance(limit_short_order, limit_exit_short_order, fee, ten = (0.0010646656050132426 - 0.0010025208853391716) / 0.0010673339398629 = 0.05822425142973869 - #Old - = 1-(0.0010025208853391716/0.0010646656050132426) - = 0.05837017687191848 """ trade = Trade( id=2, @@ -636,40 +633,43 @@ def test_adjust_stop_loss(fee): assert trade.initial_stop_loss_pct == 0.05 # Get percent of profit with a custom rate (Higher than open rate) trade.adjust_stop_loss(0.7, 0.1) - # assert round(trade.stop_loss, 8) == 1.17 #TODO-mg: What is this test? + assert round(trade.stop_loss, 8) == 1.17 # TODO-mg: What is this test? assert trade.stop_loss_pct == 0.1 assert trade.initial_stop_loss == 1.05 assert trade.initial_stop_loss_pct == 0.05 # current rate lower again ... should not change trade.adjust_stop_loss(0.8, -0.1) - # assert round(trade.stop_loss, 8) == 1.17 #TODO-mg: What is this test? + assert round(trade.stop_loss, 8) == 1.17 # TODO-mg: What is this test? assert trade.initial_stop_loss == 1.05 assert trade.initial_stop_loss_pct == 0.05 # current rate higher... should raise stoploss trade.adjust_stop_loss(0.6, -0.1) - # assert round(trade.stop_loss, 8) == 1.26 #TODO-mg: What is this test? + assert round(trade.stop_loss, 8) == 1.26 # TODO-mg: What is this test? assert trade.initial_stop_loss == 1.05 assert trade.initial_stop_loss_pct == 0.05 # Initial is true but stop_loss set - so doesn't do anything trade.adjust_stop_loss(0.3, -0.1, True) - # assert round(trade.stop_loss, 8) == 1.26 #TODO-mg: What is this test? + assert round(trade.stop_loss, 8) == 1.26 # TODO-mg: What is this test? assert trade.initial_stop_loss == 1.05 assert trade.initial_stop_loss_pct == 0.05 assert trade.stop_loss_pct == 0.1 # TODO-mg: Do a test with a trade that has a liquidation price -# TODO: I don't know how to do this test, but it should be tested for shorts -# @pytest.mark.usefixtures("init_persistence") -# @pytest.mark.parametrize('use_db', [True, False]) -# def test_get_open(fee, use_db): -# Trade.use_db = use_db -# Trade.reset_trades() -# create_mock_trades(fee, use_db) -# assert len(Trade.get_open_trades()) == 4 -# Trade.use_db = True +# TODO-mg: I don't know how to do this test, but it should be tested for shorts + + +@pytest.mark.usefixtures("init_persistence") +@pytest.mark.parametrize('use_db', [True, False]) +def test_get_open(fee, use_db): + Trade.use_db = use_db + Trade.reset_trades() + create_mock_trades(fee, use_db) + assert len(Trade.get_open_trades()) == 5 + Trade.use_db = True def test_stoploss_reinitialization(default_conf, fee): + # TODO-mg: I don't understand this at all, I was going in the opposite direction as the matching function form test_persistance.py init_db(default_conf['db_url']) trade = Trade( pair='ETH/BTC',