From 51bc7cdec15d093272c259e793a9c691775b5194 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Isma=C3=ABl=20Bouya?= Date: Tue, 31 Jul 2018 00:36:05 +0200 Subject: [PATCH] Eat several positions in the order book after some time spent --- ccxt_wrapper.py | 4 ++++ portfolio.py | 12 ++++++++++-- tests/test_ccxt_wrapper.py | 32 ++++++++++++++++++++++++++++++++ tests/test_portfolio.py | 25 +++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/ccxt_wrapper.py b/ccxt_wrapper.py index c4aa94d..aaccc61 100644 --- a/ccxt_wrapper.py +++ b/ccxt_wrapper.py @@ -299,6 +299,10 @@ class poloniexE(poloniex): "total": decimal.Decimal(summary["totalValue"]), } + def fetch_nth_order_book(self, symbol, action, number): + book = self.fetch_order_book(symbol, limit=number) + return decimal.Decimal(book[action + "s"][-1][0]) + def nonce(self): """ Wrapped to allow nonce with other libraries diff --git a/portfolio.py b/portfolio.py index bed4326..94472a3 100644 --- a/portfolio.py +++ b/portfolio.py @@ -4,6 +4,10 @@ from decimal import Decimal as D, ROUND_DOWN from ccxt import ExchangeError, InsufficientFunds, ExchangeNotAvailable, InvalidOrder, OrderNotCached, OrderNotFound, RequestTimeout, InvalidNonce class Computation: + @staticmethod + def eat_several(market): + return lambda x, y: market.ccxt.fetch_nth_order_book(x["symbol"], y, 15) + computations = { "default": lambda x, y: x[y], "average": lambda x, y: x["average"], @@ -288,8 +292,12 @@ class Trade: if tick in self.tick_actions: update, compute_value = self.tick_actions[tick] elif tick % 3 == 1: - update = "market_adjust" - compute_value = "default" + if tick < 20: + update = "market_adjust" + compute_value = "default" + else: + update = "market_adjust_eat" + compute_value = Computation.eat_several(self.market) else: update = "waiting" compute_value = None diff --git a/tests/test_ccxt_wrapper.py b/tests/test_ccxt_wrapper.py index c326f0a..44e660e 100644 --- a/tests/test_ccxt_wrapper.py +++ b/tests/test_ccxt_wrapper.py @@ -549,3 +549,35 @@ class poloniexETest(unittest.TestCase): self.assertTrue(self.s.is_dust_trade(D("0.0000009"), D("1000"))) self.assertTrue(self.s.is_dust_trade(D("0.000001"), D("10"))) self.assertFalse(self.s.is_dust_trade(D("0.000001"), D("100"))) + + def test_fetch_nth_order_book(self): + with mock.patch.object(self.s, "fetch_order_book") as t: + t.return_value = { + "asks": [ + [1.269e-05, 781.23105917], + [1.271e-05, 108.83577689], + [1.276e-05, 19162.15732141], + [1.277e-05, 34.13657561], + [1.28e-05, 95.14285714], + [1.281e-05, 11.13909862], + [1.282e-05, 43.42379871], + [1.284e-05, 493.67767887], + [1.288e-05, 6179.57843281], + [1.289e-05, 235.16250589] + ], + "bids": [ + [1.266e-05, 3496.42283539], + [1.23e-05, 9.02439024], + [1.229e-05, 3244.25987796], + [1.228e-05, 6692.16061185], + [1.207e-05, 9.19635459], + [1.206e-05, 4711.05943978], + [1.194e-05, 84.67400508], + [1.168e-05, 61.75268779], + [1.165e-05, 9.52789699], + [1.157e-05, 16.4900605] + ] + } + self.assertAlmostEqual(D("0.00001289"), self.s.fetch_nth_order_book("BTC/HUC", "ask", 10), 8) + t.assert_called_once_with("BTC/HUC", limit=10) + self.assertAlmostEqual(D("0.00001157"), self.s.fetch_nth_order_book("BTC/HUC", "bid", 10), 8) diff --git a/tests/test_portfolio.py b/tests/test_portfolio.py index bc69921..d4e5ab9 100644 --- a/tests/test_portfolio.py +++ b/tests/test_portfolio.py @@ -26,6 +26,12 @@ class ComputationTest(WebMockTestCase): portfolio.Computation.compute_value("foo", "bid", compute_value="test") compute.assert_called_with("foo", "bid") + def test_eat_several(self): + self.m.ccxt.fetch_nth_order_book.return_value = D("0.00001275") + + self.assertEqual(D("0.00001275"), portfolio.Computation.eat_several(self.m)({ "symbol": "BTC/HUC" }, "ask")) + + @unittest.skipUnless("unit" in limits, "Unit skipped") class TradeTest(WebMockTestCase): @@ -506,6 +512,25 @@ class TradeTest(WebMockTestCase): trade.orders = [] self.m.report.log_order.reset_mock() + with self.subTest(tick=22): + trade.update_order(order_mock, 22) + order_mock.cancel.assert_called() + new_order_mock.run.assert_called() + prepare_order.assert_called_with(compute_value=mock.ANY) + self.m.report.log_order.assert_called() + self.assertEqual(2, self.m.report.log_order.call_count) + calls = [ + mock.call(order_mock, 22, update="market_adjust_eat", + compute_value=mock.ANY, + new_order=new_order_mock), + mock.call(order_mock, 22, new_order=new_order_mock), + ] + self.m.report.log_order.assert_has_calls(calls) + + order_mock.reset_mock() + new_order_mock.reset_mock() + trade.orders = [] + self.m.report.log_order.reset_mock() def test_print_with_order(self): value_from = portfolio.Amount("BTC", "0.5") -- 2.41.0