Example #1
0
    def setUp(self):
        self.amm_1: MockAMM = MockAMM("onion")

        self.amm_1.set_balance(base_asset, 500)
        self.amm_1.set_balance(quote_asset, 500)
        self.market_info_1 = MarketTradingPairTuple(self.amm_1, trading_pair,
                                                    base_asset, quote_asset)

        self.amm_2: MockAMM = MockAMM("garlic")
        self.amm_2.set_balance(base_asset, 500)
        self.amm_2.set_balance(quote_asset, 500)
        self.market_info_2 = MarketTradingPairTuple(self.amm_2, trading_pair,
                                                    base_asset, quote_asset)
        self.strategy = AmmArbStrategy(
            self.market_info_1,
            self.market_info_2,
            min_profitability=Decimal("0.01"),
            order_amount=Decimal("1"),
            market_1_slippage_buffer=Decimal("0.001"),
            market_2_slippage_buffer=Decimal("0.002"),
        )
        self.clock.add_iterator(self.amm_1)
        self.clock.add_iterator(self.amm_2)
        self.clock.add_iterator(self.strategy)
        self.market_order_fill_logger: EventLogger = EventLogger()
        self.amm_1.add_listener(MarketEvent.OrderFilled,
                                self.market_order_fill_logger)
        self.amm_2.add_listener(MarketEvent.OrderFilled,
                                self.market_order_fill_logger)
Example #2
0
 def test_non_concurrent_orders_submission(self):
     # On non concurrent orders submission, the second leg of the arb trade has to wait for the first leg order gets
     # filled.
     self.strategy = AmmArbStrategy()
     self.strategy.init_params(self.market_info_1,
                               self.market_info_2,
                               min_profitability=Decimal("0.01"),
                               order_amount=Decimal("1"),
                               concurrent_orders_submission=False)
     self.clock.add_iterator(self.strategy)
     asyncio.ensure_future(self.clock.run())
     self.amm_1.set_prices(trading_pair, True, 101)
     self.amm_1.set_prices(trading_pair, False, 100)
     self.amm_2.set_prices(trading_pair, True, 105)
     self.amm_2.set_prices(trading_pair, False, 104)
     self.ev_loop.run_until_complete(asyncio.sleep(1.5))
     placed_orders = self.strategy.tracked_limit_orders
     self.assertEqual(1, len(placed_orders))
     # Only one order submitted at this point, the one from amm_1
     amm_1_order = [
         order for market, order in placed_orders if market == self.amm_1
     ][0]
     amm_2_orders = [
         order for market, order in placed_orders if market == self.amm_2
     ]
     self.assertEqual(0, len(amm_2_orders))
     self.assertEqual(True, amm_1_order.is_buy)
     self.trigger_order_complete(True, self.amm_1, amm_1_order.quantity,
                                 amm_1_order.price,
                                 amm_1_order.client_order_id)
     # After the first leg order completed, the second one is now submitted.
     self.ev_loop.run_until_complete(asyncio.sleep(1.5))
     placed_orders = self.strategy.tracked_limit_orders
     amm_2_orders = [
         order for market, order in placed_orders if market == self.amm_2
     ]
     self.assertEqual(1, len(amm_2_orders))
     amm_2_order = amm_2_orders[0]
     self.assertEqual(False, amm_2_order.is_buy)
     self.trigger_order_complete(False, self.amm_2, amm_2_order.quantity,
                                 amm_2_order.price,
                                 amm_2_order.client_order_id)
     self.ev_loop.run_until_complete(asyncio.sleep(1.5))
     placed_orders = self.strategy.tracked_limit_orders
     new_amm_1_order = [
         order for market, order in placed_orders if market == self.amm_1
     ][0]
     # Check if new order is submitted when arb opportunity still presents
     self.assertNotEqual(amm_1_order.client_order_id,
                         new_amm_1_order.client_order_id)
    def setUp(self):
        self.clock: Clock = Clock(ClockMode.REALTIME)
        self.stack: contextlib.ExitStack = contextlib.ExitStack()
        self.amm_1: MockAMM = MockAMM(
            name="onion",
            client_config_map=ClientConfigAdapter(ClientConfigMap()))
        self.amm_1.set_balance(BASE_ASSET, 500)
        self.amm_1.set_balance(QUOTE_ASSET, 500)
        self.market_info_1 = MarketTradingPairTuple(self.amm_1, TRADING_PAIR, BASE_ASSET, QUOTE_ASSET)

        self.amm_2: MockAMM = MockAMM(
            name="garlic",
            client_config_map=ClientConfigAdapter(ClientConfigMap()))
        self.amm_2.set_balance(BASE_ASSET, 500)
        self.amm_2.set_balance(QUOTE_ASSET, 500)
        self.market_info_2 = MarketTradingPairTuple(self.amm_2, TRADING_PAIR, BASE_ASSET, QUOTE_ASSET)

        # Set some default prices.
        self.amm_1.set_prices(TRADING_PAIR, True, 101)
        self.amm_1.set_prices(TRADING_PAIR, False, 100)
        self.amm_2.set_prices(TRADING_PAIR, True, 105)
        self.amm_2.set_prices(TRADING_PAIR, False, 104)

        self.strategy = AmmArbStrategy()
        self.strategy.init_params(
            self.market_info_1,
            self.market_info_2,
            min_profitability=Decimal("0.01"),
            order_amount=Decimal("1"),
            market_1_slippage_buffer=Decimal("0.001"),
            market_2_slippage_buffer=Decimal("0.002"),
        )
        self.rate_source: FixedRateSource = FixedRateSource()
        self.strategy.rate_source = self.rate_source
        self.clock.add_iterator(self.amm_1)
        self.clock.add_iterator(self.amm_2)
        self.clock.add_iterator(self.strategy)
        self.market_order_fill_logger: EventLogger = EventLogger()
        self.amm_1.add_listener(MarketEvent.OrderFilled, self.market_order_fill_logger)
        self.amm_2.add_listener(MarketEvent.OrderFilled, self.market_order_fill_logger)
        self.rate_source.add_rate("ETH-USDT", Decimal(3000))

        self.stack.enter_context(self.clock)
        self.stack.enter_context(patch(
            "hummingbot.client.config.trade_fee_schema_loader.TradeFeeSchemaLoader.configured_schema_for_exchange",
            return_value=TradeFeeSchema()
        ))
        self.clock_task: asyncio.Task = safe_ensure_future(self.clock.run())