def test_no_profitable_trade(self): order_amount = 5 trade_profits = get_trade_profits(self.market, self.trading_pair, order_amount) profitables = [t for t in trade_profits if t.profit >= self.strategy.min_profitability] self.assertEqual(len(profitables), 0) self.strategy.order_amount = order_amount self.clock.backtest_til(self.start_timestamp + 1) self.assertEqual(len(self.strategy.market_info_to_active_orders), 0) self.assertEqual(len(self.strategy.celo_orders), 0)
def test_profitable_but_insufficient_balance(self): order_amount = Decimal("2") trade_profits = get_trade_profits(self.market, self.trading_pair, order_amount) celo_buy_trade = [t for t in trade_profits if t.is_celo_buy][0] self.assertTrue(celo_buy_trade.profit > self.strategy.min_profitability) self.market.set_balance(self.base_asset, 1) self.market.set_balance(self.quote_asset, 1) self.strategy.order_amount = order_amount self.clock.backtest_til(self.start_timestamp + 1) self.assertEqual(len(self.strategy.market_info_to_active_orders), 0) self.assertEqual(len(self.strategy.celo_orders), 0)
def test_profitable_celo_buy_trade(self): order_amount = Decimal("2") self.strategy.order_amount = order_amount trade_profits = get_trade_profits(self.market, self.trading_pair, order_amount) celo_buy_trade = [t for t in trade_profits if t.is_celo_buy][0] self.clock.backtest_til(self.start_timestamp + 1) ctp_active_orders = self.strategy.market_info_to_active_orders[self.market_info] self.assertEqual(len(ctp_active_orders), 1) self.assertFalse(ctp_active_orders[0].is_buy) self.assertEqual(ctp_active_orders[0].price, celo_buy_trade.ctp_price) self.assertEqual(ctp_active_orders[0].quantity, order_amount) self.assertEqual(len(self.strategy.celo_orders), 1) self.assertTrue(self.strategy.celo_orders[0].is_buy) self.assertEqual(self.strategy.celo_orders[0].price, celo_buy_trade.celo_price) self.assertEqual(self.strategy.celo_orders[0].amount, order_amount)
def test_get_trade_profits(self): """ Order book bids price amount update_id 0 9.95 1 1 1 9.85 2 1 2 9.75 3 1 3 9.65 4 1 4 9.55 5 1 Order book asks price amount update_id 0 10.05 1 1 1 10.15 2 1 2 10.25 3 1 3 10.35 4 1 4 10.45 5 1 """ order_amount = 1 trade_profits = get_trade_profits(self.market, self.trading_pair, order_amount) # Sell price at CTP (counter party) 1 CELO is 9.95 CUSD # At Celo 9.95 CUSD will get you 1 CELO, so the profit is 0% celo_buy_trade = trade_profits[0] self.assertTrue(celo_buy_trade.is_celo_buy) # Can sell at CTP at 9.9499 self.assertEqual(celo_buy_trade.ctp_price, Decimal("9.9499")) # Can buy at celo for 9.95 self.assertEqual(celo_buy_trade.celo_price, Decimal("9.95")) # profit is almost 0 self.assertAlmostEqual(celo_buy_trade.profit, Decimal('-0.00001005')) # Buy price at CTP (counter party) 1 CELO at 10.05 USD # at Celo 1 CELO will get you 10.5 USD, so the profit is (10.5 - 10.05)/10.05 = 0.0447761194 celo_sell_trade = trade_profits[1] self.assertFalse(celo_sell_trade.is_celo_buy) # Can buy price at CTP for 10.05 self.assertEqual(celo_sell_trade.ctp_price, Decimal("10.05")) # vwap price is 10.05 self.assertEqual(celo_sell_trade.ctp_vwap, Decimal("10.05")) # Can sell price celo at 10.w self.assertEqual(celo_sell_trade.celo_price, Decimal("10.5")) self.assertAlmostEqual(celo_sell_trade.profit, Decimal("0.0447761194")) order_amount = 5 trade_profits = get_trade_profits(self.market, self.trading_pair, order_amount) celo_buy_trade = trade_profits[0] self.assertTrue(celo_buy_trade.is_celo_buy) # VWAP Sell price (5 CELO) at CTP is ((9.95 * 1) + (9.85 * 2) + (9.75 * 2))/5 = 9.83 self.assertEqual(celo_buy_trade.ctp_vwap, Decimal("9.83")) self.assertEqual(celo_buy_trade.ctp_price, Decimal("9.75")) # for 9.83 * 5 USD, you can get 0.99 * 5 CELO at Celo, so the price is 9.83/0.99 = 9.92929292929 self.assertAlmostEqual(celo_buy_trade.celo_price, Decimal("9.92929292929")) # profit is -0.00999999999 self.assertAlmostEqual(celo_buy_trade.profit, Decimal("-0.00999999999")) celo_sell_trade = trade_profits[1] self.assertFalse(celo_sell_trade.is_celo_buy) # VWAP Buy price (5 CELO) at CTP is ((10.05 * 1) + (10.15 * 2) + (10.25 * 2))/5 = 10.169 self.assertEqual(celo_sell_trade.ctp_vwap, Decimal("10.169")) self.assertEqual(celo_sell_trade.ctp_price, Decimal("10.25")) # Can sell price celo at 10.1 each self.assertEqual(celo_sell_trade.celo_price, Decimal("10.1")) # profit = (10.1 - 10.17)/10.17 = -0.00678532795 self.assertAlmostEqual(celo_sell_trade.profit, Decimal("-0.00678532795"))