aboutsummaryrefslogtreecommitdiff
path: root/test.py
diff options
context:
space:
mode:
authorIsmaël Bouya <ismael.bouya@normalesup.org>2018-02-26 14:18:34 +0100
committerIsmaël Bouya <ismael.bouya@normalesup.org>2018-02-26 14:18:34 +0100
commitf70bb858007cd3be6766ee0aa4a3d9133952eb98 (patch)
tree0c56dd45d99ab6409cda4ef240759ec56981a351 /test.py
parentd24bb10c3cad1f144b76022481f46b4524873f4b (diff)
downloadTrader-f70bb858007cd3be6766ee0aa4a3d9133952eb98.tar.gz
Trader-f70bb858007cd3be6766ee0aa4a3d9133952eb98.tar.zst
Trader-f70bb858007cd3be6766ee0aa4a3d9133952eb98.zip
Retry running order when available balance is insufficient
Diffstat (limited to 'test.py')
-rw-r--r--test.py59
1 files changed, 52 insertions, 7 deletions
diff --git a/test.py b/test.py
index 52d737d..955e2a1 100644
--- a/test.py
+++ b/test.py
@@ -2073,24 +2073,68 @@ class OrderTest(WebMockTestCase):
2073 mock.patch.object(portfolio.Order, "mark_finished_order") as mark_finished_order: 2073 mock.patch.object(portfolio.Order, "mark_finished_order") as mark_finished_order:
2074 order = portfolio.Order("buy", portfolio.Amount("ETH", 0.001), 2074 order = portfolio.Order("buy", portfolio.Amount("ETH", 0.001),
2075 D("0.1"), "BTC", "long", self.m, "trade") 2075 D("0.1"), "BTC", "long", self.m, "trade")
2076 self.m.ccxt.create_order.side_effect = portfolio.ExchangeNotAvailable 2076 self.m.ccxt.create_order.side_effect = portfolio.InvalidOrder
2077 order.run() 2077 order.run()
2078 self.m.ccxt.create_order.assert_called_once() 2078 self.m.ccxt.create_order.assert_called_once()
2079 self.assertEqual(0, len(order.results)) 2079 self.assertEqual(0, len(order.results))
2080 self.assertEqual("closed", order.status) 2080 self.assertEqual("closed", order.status)
2081 mark_finished_order.assert_called_once() 2081 mark_finished_order.assert_called_once()
2082 2082
2083 self.m.ccxt.order_precision.return_value = 8
2083 self.m.ccxt.create_order.reset_mock() 2084 self.m.ccxt.create_order.reset_mock()
2084 with self.subTest(dust_amount_exception=True),\ 2085 with self.subTest(insufficient_funds=True),\
2085 mock.patch.object(portfolio.Order, "mark_finished_order") as mark_finished_order: 2086 mock.patch.object(portfolio.Order, "mark_finished_order") as mark_finished_order:
2086 order = portfolio.Order("buy", portfolio.Amount("ETH", 0.001), 2087 order = portfolio.Order("buy", portfolio.Amount("ETH", "0.001"),
2087 D("0.1"), "BTC", "long", self.m, "trade") 2088 D("0.1"), "BTC", "long", self.m, "trade")
2088 self.m.ccxt.create_order.side_effect = portfolio.InvalidOrder 2089 self.m.ccxt.create_order.side_effect = [
2090 portfolio.InsufficientFunds,
2091 portfolio.InsufficientFunds,
2092 portfolio.InsufficientFunds,
2093 { "id": 123 },
2094 ]
2089 order.run() 2095 order.run()
2090 self.m.ccxt.create_order.assert_called_once() 2096 self.m.ccxt.create_order.assert_has_calls([
2097 mock.call('ETH/BTC', 'limit', 'buy', D('0.0010'), account='exchange', price=D('0.1')),
2098 mock.call('ETH/BTC', 'limit', 'buy', D('0.00099'), account='exchange', price=D('0.1')),
2099 mock.call('ETH/BTC', 'limit', 'buy', D('0.0009801'), account='exchange', price=D('0.1')),
2100 mock.call('ETH/BTC', 'limit', 'buy', D('0.00097029'), account='exchange', price=D('0.1')),
2101 ])
2102 self.assertEqual(4, self.m.ccxt.create_order.call_count)
2103 self.assertEqual(1, len(order.results))
2104 self.assertEqual("open", order.status)
2105 self.assertEqual(4, order.tries)
2106 self.m.report.log_error.assert_called()
2107 self.assertEqual(4, self.m.report.log_error.call_count)
2108
2109 self.m.ccxt.order_precision.return_value = 8
2110 self.m.ccxt.create_order.reset_mock()
2111 self.m.report.log_error.reset_mock()
2112 with self.subTest(insufficient_funds=True),\
2113 mock.patch.object(portfolio.Order, "mark_finished_order") as mark_finished_order:
2114 order = portfolio.Order("buy", portfolio.Amount("ETH", "0.001"),
2115 D("0.1"), "BTC", "long", self.m, "trade")
2116 self.m.ccxt.create_order.side_effect = [
2117 portfolio.InsufficientFunds,
2118 portfolio.InsufficientFunds,
2119 portfolio.InsufficientFunds,
2120 portfolio.InsufficientFunds,
2121 portfolio.InsufficientFunds,
2122 ]
2123 order.run()
2124 self.m.ccxt.create_order.assert_has_calls([
2125 mock.call('ETH/BTC', 'limit', 'buy', D('0.0010'), account='exchange', price=D('0.1')),
2126 mock.call('ETH/BTC', 'limit', 'buy', D('0.00099'), account='exchange', price=D('0.1')),
2127 mock.call('ETH/BTC', 'limit', 'buy', D('0.0009801'), account='exchange', price=D('0.1')),
2128 mock.call('ETH/BTC', 'limit', 'buy', D('0.00097029'), account='exchange', price=D('0.1')),
2129 mock.call('ETH/BTC', 'limit', 'buy', D('0.00096059'), account='exchange', price=D('0.1')),
2130 ])
2131 self.assertEqual(5, self.m.ccxt.create_order.call_count)
2091 self.assertEqual(0, len(order.results)) 2132 self.assertEqual(0, len(order.results))
2092 self.assertEqual("closed", order.status) 2133 self.assertEqual("error", order.status)
2093 mark_finished_order.assert_called_once() 2134 self.assertEqual(5, order.tries)
2135 self.m.report.log_error.assert_called()
2136 self.assertEqual(5, self.m.report.log_error.call_count)
2137 self.m.report.log_error.assert_called_with(mock.ANY, message="Giving up Order(buy long 0.00096060 ETH at 0.1 BTC [pending])", exception=mock.ANY)
2094 2138
2095 2139
2096@unittest.skipUnless("unit" in limits, "Unit skipped") 2140@unittest.skipUnless("unit" in limits, "Unit skipped")
@@ -2750,6 +2794,7 @@ class HelperTest(WebMockTestCase):
2750 2794
2751 helper.print_balances(self.m) 2795 helper.print_balances(self.m)
2752 2796
2797 self.m.report.log_stage.assert_called_once_with("print_balances")
2753 self.m.balances.fetch_balances.assert_called_with() 2798 self.m.balances.fetch_balances.assert_called_with()
2754 self.m.report.print_log.assert_has_calls([ 2799 self.m.report.print_log.assert_has_calls([
2755 mock.call("total:"), 2800 mock.call("total:"),