From 820944e5cd0ffc257bc1d13f00f3bd325156e35b Mon Sep 17 00:00:00 2001 From: Sam Germain Date: Mon, 28 Jun 2021 01:10:51 -0600 Subject: [PATCH] shorting test_calc_close_trade_price --- tests/test_persistence_margin.py | 108 +++++++++++++++++++++++-------- 1 file changed, 82 insertions(+), 26 deletions(-) diff --git a/tests/test_persistence_margin.py b/tests/test_persistence_margin.py index 3936a99ee..c8d513508 100644 --- a/tests/test_persistence_margin.py +++ b/tests/test_persistence_margin.py @@ -299,6 +299,8 @@ def test_update_open_order(limit_short_order): amount=5, fee_open=0.1, fee_close=0.1, + interest_rate=0.0005, + is_short=True, exchange='binance', ) assert trade.open_order_id is None @@ -312,14 +314,18 @@ def test_update_open_order(limit_short_order): @pytest.mark.usefixtures("init_persistence") -def test_calc_open_trade_value(market_short_order, fee): +def test_calc_open_trade_value(market_short_order, ten_minutes_ago, fee): trade = Trade( pair='ETH/BTC', stake_amount=0.001, amount=5, open_rate=0.00004173, + open_date=ten_minutes_ago, fee_open=fee.return_value, fee_close=fee.return_value, + interest_rate=0.0005, + is_short=True, + leverage=3.0, exchange='kraken', ) trade.open_order_id = 'open_trade' @@ -331,30 +337,80 @@ def test_calc_open_trade_value(market_short_order, fee): assert trade._calc_open_trade_value() == 0.011481905420932834 -# @pytest.mark.usefixtures("init_persistence") -# def test_calc_close_trade_price(limit_buy_order, limit_sell_order, fee): -# trade = Trade( -# pair='ETH/BTC', -# stake_amount=0.001, -# amount=5, -# open_rate=0.00001099, -# fee_open=fee.return_value, -# fee_close=fee.return_value, -# exchange='binance', -# ) -# trade.open_order_id = 'close_trade' -# trade.update(limit_buy_order) # Buy @ 0.00001099 -# # Get the close rate price with a custom close rate and a regular fee rate -# assert trade.calc_close_trade_value(rate=0.00001234) == 0.0011200318470471794 -# # Get the close rate price with a custom close rate and a custom fee rate -# assert trade.calc_close_trade_value(rate=0.00001234, fee=0.003) == 0.0011194704275749754 -# # Test when we apply a Sell order, and ask price with a custom fee rate -# trade.update(limit_sell_order) -# assert trade.calc_close_trade_value(fee=0.005) == 0.0010619972701635854 +@pytest.mark.usefixtures("init_persistence") +def test_calc_close_trade_price(market_short_order, market_exit_short_order, ten_minutes_ago, fee): + """ + 10 minute short market trade on Kraken at 3x leverage + Short trade + fee: 0.25% base + interest_rate: 0.05% per 4 hrs + open_rate: 0.00004173 base + close_rate: 0.00001234 base + amount: 91.99181073 * leverage(3) = 275.97543219 crypto + borrowed: 275.97543219 crypto + time-periods: 10 minutes(rounds up to 1 time-period of 4hrs) + interest: borrowed * interest_rate * time-periods + = 275.97543219 * 0.0005 * 1 = 0.137987716095 crypto + amount_closed: amount + interest = 275.97543219 + 0.137987716095 = 276.113419906095 + close_value: (amount_closed * close_rate) + (amount_closed * close_rate * fee) + = (276.113419906095 * 0.00001234) + (276.113419906095 * 0.00001234 * 0.0025) + = 0.01134618380465571 + """ + trade = Trade( + pair='ETH/BTC', + stake_amount=0.001, + amount=5, + open_rate=0.00001099, + fee_open=fee.return_value, + fee_close=fee.return_value, + open_date=ten_minutes_ago, + interest_rate=0.0005, + is_short=True, + leverage=3.0, + exchange='kraken', + ) + trade.open_order_id = 'close_trade' + trade.update(market_short_order) # Buy @ 0.00001099 + # Get the close rate price with a custom close rate and a regular fee rate + assert isclose(trade.calc_close_trade_value(rate=0.00001234), 0.003415757700645315) + # Get the close rate price with a custom close rate and a custom fee rate + assert isclose(trade.calc_close_trade_value(rate=0.00001234, fee=0.003), 0.0034174613204461354) + # Test when we apply a Sell order, and ask price with a custom fee rate + trade.update(market_exit_short_order) + assert isclose(trade.calc_close_trade_value(fee=0.005), 0.011374478527360586) # @pytest.mark.usefixtures("init_persistence") -# def test_calc_profit(limit_buy_order, limit_sell_order, fee): +# def test_calc_profit(market_short_order, market_exit_short_order, fee): +# """ +# Five hour short trade on Kraken at 3x leverage +# Short trade +# Exchange: Kraken +# fee: 0.25% base +# interest_rate: 0.05% per 4 hours +# open_rate: 0.02 base +# close_rate: 0.01 base +# leverage: 3.0 +# amount: 5 * 3 = 15 crypto +# borrowed: 15 crypto +# time-periods: 5 hours = 5/4 + +# interest: borrowed * interest_rate * time-periods +# = 15 * 0.0005 * 5/4 = 0.009375 crypto +# open_value: (amount * open_rate) - (amount * open_rate * fee) +# = (15 * 0.02) - (15 * 0.02 * 0.0025) +# = 0.29925 +# amount_closed: amount + interest = 15 + 0.009375 = 15.009375 +# close_value: (amount_closed * close_rate) + (amount_closed * close_rate * fee) +# = (15.009375 * 0.01) + (15.009375 * 0.01 * 0.0025) +# = 0.150468984375 +# total_profit = open_value - close_value +# = 0.29925 - 0.150468984375 +# = 0.148781015625 +# total_profit_percentage = (open_value/close_value) - 1 +# = (0.29925/0.150468984375)-1 +# = 0.9887819489377738 +# """ # trade = Trade( # pair='ETH/BTC', # stake_amount=0.001, @@ -365,19 +421,19 @@ def test_calc_open_trade_value(market_short_order, fee): # exchange='binance', # ) # trade.open_order_id = 'something' -# trade.update(limit_buy_order) # Buy @ 0.00001099 +# trade.update(market_short_order) # Buy @ 0.00001099 # # Custom closing rate and regular fee rate # # Higher than open rate -# assert trade.calc_profit(rate=0.00001234) == 0.00011753 +# assert trade.calc_profit(rate=0.00004374) == 0.00011753 # # Lower than open rate -# assert trade.calc_profit(rate=0.00000123) == -0.00089086 +# assert trade.calc_profit(rate=0.00000437) == -0.00089086 # # Custom closing rate and custom fee rate # # Higher than open rate # assert trade.calc_profit(rate=0.00001234, fee=0.003) == 0.00011697 # # Lower than open rate # assert trade.calc_profit(rate=0.00000123, fee=0.003) == -0.00089092 # # Test when we apply a Sell order. Sell higher than open rate @ 0.00001173 -# trade.update(limit_sell_order) +# trade.update(market_exit_short_order) # assert trade.calc_profit() == 0.00006217 # # Test with a custom fee rate on the close trade # assert trade.calc_profit(fee=0.003) == 0.00006163