def test_create_portfolio_needs_balancing3(self): exchange = DummyExchange(self.targets.keys(), self.balances) portfolio = Portfolio.make_portfolio(self.targets2, exchange, threshold=20) self.assertFalse(portfolio.needs_balancing)
def test_base_differences_start_xrp_xlm_usdt_rates(self): targets = { 'XRP': 50, 'XLM': 40, 'USDT': 10, } current = { 'XRP': 100, 'XLM': 100, 'USDT': 50, } rates = { 'XRP/USDT': 0.1, 'XLM/USDT': 0.4, } exchange = DummyExchange(targets.keys(), current, rates) portfolio = Portfolio.make_portfolio(targets, exchange) expected = { 'XRP': 40, 'XLM': 0, 'USDT': -40, } self.assertEqual(portfolio.differences_quote, expected)
def test_run_trade(self): targets = { 'XRP': 45, 'XLM': 45, 'USDT': 10, } current = {'XRP': 400, 'XLM': 400, 'USDT': 200} rates = { 'XRP/USDT': 1.0, 'XLM/USDT': 1.0, 'XLM/XRP': 1.0, } exchange = DummyExchange(targets.keys(), current, rates, 0.001) portfolio = Portfolio.make_portfolio(targets, exchange) balancer = SimpleBalancer() executor = Executor(portfolio, exchange, balancer) res = executor.run(force=True, trade=True) # Test the orders we get are correct expected = [ Order('XLM/USDT', 'BUY', 50, 1.0), Order('XRP/USDT', 'BUY', 50, 1.0), ] self.assertEqual(res['orders'], expected) self.assertEqual(exchange.balances['XRP'], 449.95) self.assertEqual(exchange.balances['XLM'], 449.95) self.assertEqual(exchange.balances['USDT'], 100)
def test_create_portfolio_defaults(self): exchange = DummyExchange(self.targets.keys(), self.targets) portfolio = Portfolio.make_portfolio(self.targets, exchange) self.assertEqual(portfolio.threshold, 1.0) self.assertEqual(portfolio.quote_currency, 'USDT') self.assertEqual(portfolio.exchange, exchange) self.assertEqual(portfolio.targets, self.targets)
def test_create_portfolio_custom(self): exchange = DummyExchange(self.targets.keys(), self.targets) portfolio = Portfolio.make_portfolio(self.targets, exchange, 2.0, 'BTC') self.assertEqual(portfolio.threshold, 2.0) self.assertEqual(portfolio.quote_currency, 'BTC') self.assertEqual(portfolio.exchange, exchange) self.assertEqual(portfolio.targets, self.targets)
def test_create_portfolio_differences_quote2(self): exchange = DummyExchange(self.targets.keys(), self.balances) portfolio = Portfolio.make_portfolio(self.targets2, exchange) expected = { 'XRP': -50, 'XLM': -50, 'USDT': 100, } self.assertEqual(portfolio.differences_quote, expected)
def execute(self, targets, current, rates, fee=0.001, max_orders=5, mode='mid'): exchange = DummyExchange(targets.keys(), current, rates, fee) portfolio = Portfolio.make_portfolio(targets, exchange) balancer = SimpleBalancer() return balancer.balance(portfolio, exchange, max_orders=max_orders, mode=mode)
def test_base_differences_start_xrp_xlm_usdt_rates3(self): targets = { 'XRP': 45, 'XLM': 45, 'USDT': 10, } current = { 'XRP': 40, 'XLM': 40, 'USDT': 20, } rates = { 'XRP/USDT': 0.5, 'XLM/USDT': 0.5, 'USDT/USDT': 1.0, } exchange = DummyExchange(targets.keys(), current, rates) portfolio = Portfolio.make_portfolio(targets, exchange) expected = { 'XRP': 7, 'XLM': 7, 'USDT': -14, } self.assertEqual(portfolio.differences_quote, expected) final_base = {} final_targets = {} total_base = 0 for cur in current: symbol = "{}/{}".format(cur, portfolio.quote_currency) final_base[cur] = current[cur] * exchange.rates[symbol]['mid'] final_base[cur] += portfolio.differences_quote[cur] total_base += final_base[cur] for cur in final_base: final_targets[cur] = (final_base[cur] / total_base) * 100 self.assertEqual(targets, final_targets)
def create_executor(self, targets, current, rates, fee=0.001): exchange = DummyExchange(targets.keys(), current, rates, fee) portfolio = Portfolio.make_portfolio(targets, exchange) balancer = SimpleBalancer() executor = Executor(portfolio, exchange, balancer) return executor
def test_create_portfolio_needs_balancing2(self): exchange = DummyExchange(self.targets.keys(), self.balances) portfolio = Portfolio.make_portfolio(self.targets2, exchange) self.assertTrue(portfolio.needs_balancing)
def test_create_portfolio_metric_zero(self): exchange = DummyExchange(self.targets.keys(), self.zero_balances) portfolio = Portfolio.make_portfolio(self.targets, exchange) self.assertEqual(portfolio.balance_rms_error, 0)
def test_create_portfolio_metric2(self): exchange = DummyExchange(self.targets.keys(), self.balances) portfolio = Portfolio.make_portfolio(self.targets2, exchange) self.assertAlmostEqual(portfolio.balance_rms_error, 7.071067, 5)
def test_create_portfolio_balances_pct_zero(self): exchange = DummyExchange(self.targets.keys(), self.zero_balances) portfolio = Portfolio.make_portfolio(self.targets, exchange) self.assertEqual(portfolio.balances_pct, self.zero_balances) self.assertNotEqual(portfolio.balances_pct, self.targets)
def test_create_portfolio_valuation_quote(self): exchange = DummyExchange(self.targets.keys(), self.balances) portfolio = Portfolio.make_portfolio(self.targets, exchange) self.assertEqual(portfolio.valuation_quote, 1000)
def setUp(self): balances = {'XRP': 100.0, 'BTC': 200.0, 'USDT': 300.0} rates = {'XRP/USDT': 0.33, 'BTC/USDT': 3500.0} self.exchange = DummyExchange(balances.keys(), balances, rates)
class test_DummyExchange(unittest.TestCase): def setUp(self): balances = {'XRP': 100.0, 'BTC': 200.0, 'USDT': 300.0} rates = {'XRP/USDT': 0.33, 'BTC/USDT': 3500.0} self.exchange = DummyExchange(balances.keys(), balances, rates) def test_balances(self): self.assertEqual(self.exchange.balances['XRP'], 100) self.assertEqual(self.exchange.balances['BTC'], 200) self.assertEqual(self.exchange.balances['USDT'], 300) def test_pairs(self): expected = [ 'XRP/XRP', 'XRP/BTC', 'XRP/USDT', 'BTC/XRP', 'BTC/BTC', 'BTC/USDT', 'USDT/XRP', 'USDT/BTC', 'USDT/USDT' ] self.assertEqual(self.exchange.pairs, expected) def test_execute_buy(self): order = Order('XRP/USDT', 'BUY', 10, 0.32) self.exchange.execute_order(order) self.assertEqual(self.exchange.balances['XRP'], 109.99) self.assertEqual(self.exchange.balances['BTC'], 200.0) self.assertEqual(self.exchange.balances['USDT'], 296.8) def test_execute_sell(self): order = Order('BTC/USDT', 'SELL', 0.01, 3500) self.exchange.execute_order(order) self.assertEqual(self.exchange.balances['XRP'], 100.00) self.assertEqual(self.exchange.balances['BTC'], 199.99) self.assertEqual(self.exchange.balances['USDT'], 334.965) def test_execute_buy_toomuch1(self): order = Order('XRP/USDT', 'BUY', 1000, 0.32) with self.assertRaises(ValueError): self.exchange.execute_order(order) def test_execute_sell_toomuch2(self): order = Order('BTC/USDT', 'SELL', 1000, 3500) with self.assertRaises(ValueError): self.exchange.execute_order(order) def test_preprocess_order_true(self): order = Order('XRP/USDT', 'BUY', 50, 0.32) self.assertEqual(self.exchange.preprocess_order(order), order) def test_preprocess_order_false(self): order = Order('XRP/USDT', 'BUY', 0.1, 0.32) self.assertIsNone(self.exchange.preprocess_order(order)) def test_preprocess_order_bad(self): order = Order('ZEC/USDT', 'BUY', 10, 0.32) self.assertIsNone(self.exchange.preprocess_order(order))