def setUp(self):
        self.clock_tick_size = 1
        self.clock: Clock = Clock(ClockMode.BACKTEST, self.clock_tick_size, self.start_timestamp, self.end_timestamp)
        self.market: MockPaperExchange = MockPaperExchange()
        self.mid_price = 100
        self.bid_spread = 0.01
        self.ask_spread = 0.01
        self.order_refresh_time = 30
        self.market.set_balanced_order_book(trading_pair=self.trading_pair,
                                            mid_price=self.mid_price,
                                            min_price=1,
                                            max_price=200,
                                            price_step_size=1,
                                            volume_step_size=10)
        self.market.set_balance("HBOT", 500)
        self.market.set_balance("ETH", 5000)
        self.market.set_quantization_param(
            QuantizationParams(
                self.trading_pair, 6, 6, 6, 6
            )
        )
        self.market_info = MarketTradingPairTuple(self.market, self.trading_pair,
                                                  self.base_asset, self.quote_asset)
        self.clock.add_iterator(self.market)
        self.order_fill_logger: EventLogger = EventLogger()
        self.cancel_order_logger: EventLogger = EventLogger()
        self.market.add_listener(MarketEvent.OrderFilled, self.order_fill_logger)
        self.market.add_listener(MarketEvent.OrderCancelled, self.cancel_order_logger)

        self.ext_market: MockPaperExchange = MockPaperExchange()
        self.ext_market_info: MarketTradingPairTuple = MarketTradingPairTuple(
            self.ext_market, self.trading_pair, self.base_asset, self.quote_asset
        )
        self.ext_market.set_balanced_order_book(trading_pair=self.trading_pair,
                                                mid_price=100, min_price=1, max_price=400, price_step_size=1,
                                                volume_step_size=100)
        self.order_book_asset_del = OrderBookAssetPriceDelegate(self.ext_market, self.trading_pair)

        self.one_level_strategy = PureMarketMakingStrategy()
        self.one_level_strategy.init_params(
            self.market_info,
            bid_spread=Decimal("0.01"),
            ask_spread=Decimal("0.01"),
            order_amount=Decimal("1"),
            order_refresh_time=3.0,
            filled_order_delay=3.0,
            order_refresh_tolerance_pct=-1,
            minimum_spread=-1,
            asset_price_delegate=self.order_book_asset_del,
            take_if_crossed=True
        )
示例#2
0
    def setUp(self):
        self.clock: Clock = Clock(ClockMode.BACKTEST, 1.0,
                                  self.start_timestamp, self.end_timestamp)
        self.market_1: BacktestMarket = BacktestMarket()
        self.market_2: BacktestMarket = BacktestMarket()

        self.market_1_data: MockOrderBookLoader = MockOrderBookLoader(
            *self.market_1_symbols)
        self.market_2_data: MockOrderBookLoader = MockOrderBookLoader(
            *self.market_2_symbols)
        self.market_1_data.set_balanced_order_book(1.0, 0.5, 1.5, 0.01, 10)
        self.market_2_data.set_balanced_order_book(1.0, 0.5, 1.5, 0.005, 5)

        self.market_1.add_data(self.market_1_data)
        self.market_2.add_data(self.market_2_data)

        self.market_1.set_balance("COINALPHA", 500)
        self.market_1.set_balance("WETH", 500)

        self.market_2.set_balance("COINALPHA", 500)
        self.market_2.set_balance("ETH", 500)

        self.market_1.set_quantization_param(
            QuantizationParams(self.market_1_symbols[0], 5, 5, 5, 5))
        self.market_2.set_quantization_param(
            QuantizationParams(self.market_2_symbols[0], 5, 5, 5, 5))
        self.market_symbol_pair_1 = MarketSymbolPair(*([self.market_1] +
                                                       self.market_1_symbols))
        self.market_symbol_pair_2 = MarketSymbolPair(*([self.market_2] +
                                                       self.market_2_symbols))
        self.market_pair: ArbitrageMarketPair = ArbitrageMarketPair(
            *(self.market_symbol_pair_1 + self.market_symbol_pair_2))

        self.logging_options: int = ArbitrageStrategy.OPTION_LOG_ALL

        self.strategy: ArbitrageStrategy = ArbitrageStrategy(
            [self.market_pair],
            min_profitability=0.03,
            logging_options=self.logging_options)

        self.clock.add_iterator(self.market_1)
        self.clock.add_iterator(self.market_2)
        self.clock.add_iterator(self.strategy)

        self.market_1_order_fill_logger: EventLogger = EventLogger()
        self.market_2_order_fill_logger: EventLogger = EventLogger()

        self.market_1.add_listener(MarketEvent.OrderFilled,
                                   self.market_1_order_fill_logger)
        self.market_2.add_listener(MarketEvent.OrderFilled,
                                   self.market_2_order_fill_logger)
示例#3
0
    def setUp(self):
        self.db_path: str = realpath(
            join(__file__, "../bamboo_relay_uncordinated_test.sqlite"))
        try:
            os.unlink(self.db_path)
        except FileNotFoundError:
            pass

        self.market_logger = EventLogger()
        self.wallet_logger = EventLogger()
        for event_tag in self.market_events:
            self.market.add_listener(event_tag, self.market_logger)
        for event_tag in self.wallet_events:
            self.wallet.add_listener(event_tag, self.wallet_logger)
    def _initialize_event_loggers(self):
        self.buy_order_completed_logger = EventLogger()
        self.sell_order_completed_logger = EventLogger()
        self.order_filled_logger = EventLogger()
        self.order_failure_logger = EventLogger()

        events_and_loggers = [
            (MarketEvent.BuyOrderCompleted, self.buy_order_completed_logger),
            (MarketEvent.SellOrderCompleted, self.sell_order_completed_logger),
            (MarketEvent.OrderFilled, self.order_filled_logger),
            (MarketEvent.OrderFailure, self.order_failure_logger)]

        for event, logger in events_and_loggers:
            self.exchange.add_listener(event, logger)
    def setUp(self):
        self.clock: Clock = Clock(ClockMode.BACKTEST, 1.0,
                                  self.start_timestamp, self.end_timestamp)
        self.maker_market: BacktestMarket = BacktestMarket()
        self.taker_market: BacktestMarket = BacktestMarket()
        self.maker_data: MockOrderBookLoader = MockOrderBookLoader(
            *self.maker_symbols)
        self.taker_data: MockOrderBookLoader = MockOrderBookLoader(
            *self.taker_symbols)
        self.maker_data.set_balanced_order_book(1.0, 0.5, 1.5, 0.01, 10)
        self.taker_data.set_balanced_order_book(1.0, 0.5, 1.5, 0.001, 4)
        self.maker_market.add_data(self.maker_data)
        self.taker_market.add_data(self.taker_data)
        self.maker_market.set_balance("COINALPHA", 5)
        self.maker_market.set_balance("WETH", 5)
        self.maker_market.set_balance("QETH", 5)
        self.taker_market.set_balance("COINALPHA", 5)
        self.taker_market.set_balance("ETH", 5)
        self.maker_market.set_quantization_param(
            QuantizationParams(self.maker_symbols[0], 5, 5, 5, 5))
        self.taker_market.set_quantization_param(
            QuantizationParams(self.taker_symbols[0], 5, 5, 5, 5))

        self.market_pair: CrossExchangeMarketPair = CrossExchangeMarketPair(
            *([self.maker_market] + self.maker_symbols + [self.taker_market] +
              self.taker_symbols + [2]))

        logging_options: int = (
            CrossExchangeMarketMakingStrategy.OPTION_LOG_ALL &
            (~CrossExchangeMarketMakingStrategy.OPTION_LOG_NULL_ORDER_SIZE))
        self.strategy: CrossExchangeMarketMakingStrategy = CrossExchangeMarketMakingStrategy(
            [self.market_pair],
            0.003,
            order_size_portfolio_ratio_limit=0.3,
            logging_options=logging_options)
        self.logging_options = logging_options
        self.clock.add_iterator(self.maker_market)
        self.clock.add_iterator(self.taker_market)
        self.clock.add_iterator(self.strategy)

        self.maker_order_fill_logger: EventLogger = EventLogger()
        self.taker_order_fill_logger: EventLogger = EventLogger()
        self.cancel_order_logger: EventLogger = EventLogger()
        self.maker_market.add_listener(MarketEvent.OrderFilled,
                                       self.maker_order_fill_logger)
        self.taker_market.add_listener(MarketEvent.OrderFilled,
                                       self.taker_order_fill_logger)
        self.maker_market.add_listener(MarketEvent.OrderCancelled,
                                       self.cancel_order_logger)
示例#6
0
    def setUp(self):
        self.maxDiff = None
        self.clock: Clock = Clock(ClockMode.BACKTEST, 1.0,
                                  self.start_timestamp, self.end_timestamp)
        self.market_1: MockPaperExchange = MockPaperExchange(
            client_config_map=ClientConfigAdapter(ClientConfigMap()))
        self.market_2: MockPaperExchange = MockPaperExchange(
            client_config_map=ClientConfigAdapter(ClientConfigMap()))

        self.market_1.set_balanced_order_book(self.market_1_trading_pairs[0],
                                              1.0, 0.5, 1.5, 0.01, 10)
        self.market_2.set_balanced_order_book(self.market_2_trading_pairs[0],
                                              1.0, 0.5, 1.5, 0.005, 5)

        self.market_1.set_balance("COINALPHA", 500)
        self.market_1.set_balance("WETH", 500)
        self.market_2.set_balance("COINALPHA", 500)
        self.market_2.set_balance("ETH", 500)
        self.market_1.set_quantization_param(
            QuantizationParams(self.market_1_trading_pairs[0], 5, 5, 5, 5))
        self.market_2.set_quantization_param(
            QuantizationParams(self.market_2_trading_pairs[0], 5, 5, 5, 5))
        self.market_trading_pair_tuple_1 = MarketTradingPairTuple(
            *([self.market_1] + self.market_1_trading_pairs))
        self.market_trading_pair_tuple_2 = MarketTradingPairTuple(
            *([self.market_2] + self.market_2_trading_pairs))
        self.market_pair: ArbitrageMarketPair = ArbitrageMarketPair(
            self.market_trading_pair_tuple_1, self.market_trading_pair_tuple_2)

        self.logging_options: int = ArbitrageStrategy.OPTION_LOG_ALL

        self.strategy: ArbitrageStrategy = ArbitrageStrategy()
        self.strategy.init_params(
            [self.market_pair],
            min_profitability=Decimal("0.03"),
            logging_options=self.logging_options,
            secondary_to_primary_quote_conversion_rate=Decimal("0.95"))

        self.clock.add_iterator(self.market_1)
        self.clock.add_iterator(self.market_2)
        self.clock.add_iterator(self.strategy)

        self.market_1_order_fill_logger: EventLogger = EventLogger()
        self.market_2_order_fill_logger: EventLogger = EventLogger()

        self.market_1.add_listener(MarketEvent.OrderFilled,
                                   self.market_1_order_fill_logger)
        self.market_2.add_listener(MarketEvent.OrderFilled,
                                   self.market_2_order_fill_logger)
    def test_create_order_when_order_is_instantly_closed(self, mock_api):
        trading_rules = self.get_trading_rules_mock()
        self.exchange._trading_rules = self.exchange._format_trading_rules(
            trading_rules)

        url = f"{CONSTANTS.REST_URL}/{CONSTANTS.ORDER_CREATE_PATH_URL}"
        regex_url = re.compile(f"^{url}".replace(".",
                                                 r"\.").replace("?", r"\?"))
        resp = self.get_order_create_response_mock()
        resp["status"] = "closed"
        mock_api.post(regex_url, body=json.dumps(resp))

        event_logger = EventLogger()
        self.exchange.add_listener(MarketEvent.BuyOrderCreated, event_logger)

        order_id = "someId"
        self.async_run_with_timeout(coroutine=self.exchange._create_order(
            trade_type=TradeType.BUY,
            order_id=order_id,
            trading_pair=self.trading_pair,
            amount=Decimal("1"),
            order_type=OrderType.LIMIT,
            price=Decimal("5.1"),
        ))

        self.assertEqual(1, len(event_logger.event_log))
        self.assertEqual(order_id, event_logger.event_log[0].order_id)
        self.assertTrue(order_id in self.exchange.in_flight_orders)
示例#8
0
    async def test_sell_order(self):
        self._http_player.replay_timestamp_ms = 1648500097825
        clock_task: asyncio.Task = safe_ensure_future(self.run_clock())
        event_logger: EventLogger = EventLogger()
        self._connector.add_listener(MarketEvent.SellOrderCreated,
                                     event_logger)
        self._connector.add_listener(MarketEvent.OrderFilled, event_logger)

        try:
            self._connector.sell("DAI-WETH", Decimal(100), OrderType.LIMIT,
                                 Decimal("0.002816023229500"))
            order_created_event: SellOrderCreatedEvent = await event_logger.wait_for(
                SellOrderCreatedEvent, timeout_seconds=5)
            self.assertEqual(
                "0x63c7ffaf8dcede44c51cc2ea7ab3a5c0ea4915c9dab57dfcb432ea92ad174391",  # noqa: mock
                order_created_event.exchange_order_id)
            self._http_player.replay_timestamp_ms = 1648500133889
            order_filled_event: OrderFilledEvent = await event_logger.wait_for(
                OrderFilledEvent, timeout_seconds=5)
            self.assertEqual(
                "0x63c7ffaf8dcede44c51cc2ea7ab3a5c0ea4915c9dab57dfcb432ea92ad174391",  # noqa: mock
                order_filled_event.exchange_trade_id)
        finally:
            clock_task.cancel()
            try:
                await clock_task
            except asyncio.CancelledError:
                pass
    async def test_collect_fees(self):
        self._http_player.replay_timestamp_ms = 1652728322607
        clock_task: asyncio.Task = safe_ensure_future(self.run_clock())
        event_logger: EventLogger = EventLogger()
        self._connector.add_listener(MarketEvent.RangePositionUpdate,
                                     event_logger)
        self._connector.add_listener(MarketEvent.RangePositionFeeCollected,
                                     event_logger)

        try:
            self._connector.collect_fees("COIN1-COIN3", 1001)
            pos_update_event: RangePositionUpdateEvent = await event_logger.wait_for(
                RangePositionUpdateEvent, timeout_seconds=5)
            self.assertEqual(
                "0x74ae9ae03e8bee4d6954dfb4944c87dae5de5f63f4932be3b16dfc93601f0fdc",  # noqa: mock
                pos_update_event.exchange_order_id)
            self._http_player.replay_timestamp_ms = 1652728328486
            fees_collected_event: RangePositionFeeCollectedEvent = await event_logger.wait_for(
                RangePositionFeeCollectedEvent, timeout_seconds=5)
            self.assertEqual(
                "0x74ae9ae03e8bee4d6954dfb4944c87dae5de5f63f4932be3b16dfc93601f0fdc",  # noqa: mock
                fees_collected_event.exchange_order_id)
        finally:
            clock_task.cancel()
            try:
                await clock_task
            except asyncio.CancelledError:
                pass
    async def test_remove_liquidity(self):
        self._http_player.replay_timestamp_ms = 1652728331046
        clock_task: asyncio.Task = safe_ensure_future(self.run_clock())
        event_logger: EventLogger = EventLogger()
        self._connector.add_listener(MarketEvent.RangePositionUpdate,
                                     event_logger)
        self._connector.add_listener(MarketEvent.RangePositionLiquidityRemoved,
                                     event_logger)

        try:
            self._connector.remove_liquidity("COIN1-COIN3", 1000)
            pos_update_event: RangePositionUpdateEvent = await event_logger.wait_for(
                RangePositionUpdateEvent, timeout_seconds=5)
            self.assertEqual(
                "0x84c2e5633ea6f5aaa8fe19464a65b2a30d1fce66513db4b11439c09288962e7a",  # noqa: mock
                pos_update_event.exchange_order_id)
            self._http_player.replay_timestamp_ms = 1652728338292
            liquidity_removed_event: RangePositionLiquidityRemovedEvent = await event_logger.wait_for(
                RangePositionLiquidityRemovedEvent, timeout_seconds=5)
            self.assertEqual(
                "0x84c2e5633ea6f5aaa8fe19464a65b2a30d1fce66513db4b11439c09288962e7a",  # noqa: mock
                liquidity_removed_event.exchange_order_id)
        finally:
            clock_task.cancel()
            try:
                await clock_task
            except asyncio.CancelledError:
                pass
    async def test_add_liquidity(self):
        self._http_player.replay_timestamp_ms = 1652728316475
        clock_task: asyncio.Task = safe_ensure_future(self.run_clock())
        event_logger: EventLogger = EventLogger()
        self._connector.add_listener(MarketEvent.RangePositionUpdate,
                                     event_logger)
        self._connector.add_listener(MarketEvent.RangePositionLiquidityAdded,
                                     event_logger)

        try:
            self._connector.add_liquidity("COIN1-COIN3", Decimal("1"),
                                          Decimal("1"), Decimal("1"),
                                          Decimal("5"), "LOW")
            pos_update_event: RangePositionUpdateEvent = await event_logger.wait_for(
                RangePositionUpdateEvent, timeout_seconds=5)
            self.assertEqual(
                "0x0b6145277c7a6eefff5db3f595a3563da77df7f6face91122fd117fb6345ba0f",  # noqa: mock
                pos_update_event.exchange_order_id)
            self._http_player.replay_timestamp_ms = 1652728320503
            liquidity_added_event: RangePositionLiquidityAddedEvent = await event_logger.wait_for(
                RangePositionLiquidityAddedEvent, timeout_seconds=5)
            self.assertEqual(
                "0x0b6145277c7a6eefff5db3f595a3563da77df7f6face91122fd117fb6345ba0f",  # noqa: mock
                liquidity_added_event.exchange_order_id)
        finally:
            clock_task.cancel()
            try:
                await clock_task
            except asyncio.CancelledError:
                pass
    async def test_approve_token(self):
        self._http_player.replay_timestamp_ms = 1652728282963
        coin1_in_flight_order: GatewayInFlightLPOrder = await self._connector.approve_token(
            "uniswapLP", "COIN1")
        self._http_player.replay_timestamp_ms = 1652728286030
        coin3_in_flight_order: GatewayInFlightLPOrder = await self._connector.approve_token(
            "uniswapLP", "COIN3")

        self.assertEqual(
            "0x65ef330422dc9892460e3ea67338013b9ca619270f960c4531f47a1812cb7677",  # noqa: mock
            coin1_in_flight_order.exchange_order_id)
        self.assertEqual(
            "0x551970f039ed4190b00a7277bf7e952aec371ac562853e89b54bbeea82c9ed86",  # noqa: mock
            coin3_in_flight_order.exchange_order_id)

        clock_task: asyncio.Task = safe_ensure_future(self.run_clock())
        event_logger: EventLogger = EventLogger()
        self._connector.add_listener(TokenApprovalEvent.ApprovalSuccessful,
                                     event_logger)

        self._http_player.replay_timestamp_ms = 1652728338292
        try:
            async with timeout(5):
                while len(event_logger.event_log) < 2:
                    await event_logger.wait_for(TokenApprovalSuccessEvent)
            self.assertEqual(2, len(event_logger.event_log))
            self.assertEqual({"uniswapLP_COIN1", "uniswapLP_COIN3"},
                             set(e.token_symbol
                                 for e in event_logger.event_log))
        finally:
            clock_task.cancel()
            try:
                await clock_task
            except asyncio.CancelledError:
                pass
示例#13
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)
示例#14
0
    async def test_approve_token(self):
        self._http_player.replay_timestamp_ms = 1648499867736
        weth_in_flight_order: GatewayInFlightOrder = await self._connector.approve_token(
            "WETH")
        self._http_player.replay_timestamp_ms = 1648499871595
        dai_in_flight_order: GatewayInFlightOrder = await self._connector.approve_token(
            "DAI")

        self.assertEqual(
            "0x6c975ba8c1d35e8542ffd05956d9ec227c1ac234ae4d5f69819aa24bae784321",  # noqa: mock
            weth_in_flight_order.exchange_order_id)
        self.assertEqual(
            "0x919438daa20dc2f5381fdf25b6b89a189d055b3a1d6d848c44e53dc10f49168c",  # noqa: mock
            dai_in_flight_order.exchange_order_id)

        clock_task: asyncio.Task = safe_ensure_future(self.run_clock())
        event_logger: EventLogger = EventLogger()
        self._connector.add_listener(TokenApprovalEvent.ApprovalSuccessful,
                                     event_logger)

        self._http_player.replay_timestamp_ms = 1648500060232
        try:
            async with timeout(10):
                while len(event_logger.event_log) < 2:
                    await event_logger.wait_for(TokenApprovalSuccessEvent)
            self.assertEqual(2, len(event_logger.event_log))
            self.assertEqual({"WETH", "DAI"},
                             set(e.token_symbol
                                 for e in event_logger.event_log))
        finally:
            clock_task.cancel()
            try:
                await clock_task
            except asyncio.CancelledError:
                pass
 async def collect_cancel_approval(self):
     print("Creating and then canceling token approval...\t\t",
           end="",
           flush=True)
     connector: GatewayEVMAMM = self._connector
     event_logger: EventLogger = EventLogger()
     connector.add_listener(TokenApprovalEvent.ApprovalCancelled,
                            event_logger)
     try:
         async with self.run_clock():
             tracked_order_1: GatewayInFlightOrder = await connector.approve_token(
                 "DAI",
                 max_fee_per_gas=MAX_FEE_PER_GAS,
                 max_priority_fee_per_gas=MAX_PRIORITY_FEE_PER_GAS)
             tracked_order_2: GatewayInFlightOrder = await connector.approve_token(
                 "WETH",
                 max_fee_per_gas=MAX_FEE_PER_GAS,
                 max_priority_fee_per_gas=MAX_PRIORITY_FEE_PER_GAS)
             tracked_order_1._creation_timestamp = connector.current_timestamp - 86400
             tracked_order_2._creation_timestamp = connector.current_timestamp - 86400
             safe_ensure_future(connector.cancel_outdated_orders(600))
             while len(event_logger.event_log) < 2:
                 await event_logger.wait_for(TokenApprovalCancelledEvent)
     finally:
         connector.remove_listener(TokenApprovalEvent.ApprovalCancelled,
                                   event_logger)
     print("done")
示例#16
0
    def setUp(self):
        self.maxDiff = None
        self.clock: Clock = Clock(ClockMode.BACKTEST, 1.0,
                                  self.start_timestamp, self.end_timestamp)
        self.market: MockPaperExchange = MockPaperExchange()

        self.market.set_balanced_order_book(self.trading_pair, 10, 5, 15, 0.1,
                                            1)

        self.market.set_balance(self.base_asset, 500)
        self.market.set_balance(self.quote_asset, 500)
        self.market.set_quantization_param(
            QuantizationParams(self.trading_pair, 5, 5, 5, 5))
        self.market_info = MarketTradingPairTuple(self.market,
                                                  self.trading_pair,
                                                  self.base_asset,
                                                  self.quote_asset)
        self.logging_options: int = CeloArbStrategy.OPTION_LOG_ALL
        self.strategy = CeloArbStrategy()
        self.strategy.init_params(self.market_info,
                                  min_profitability=Decimal("0.01"),
                                  order_amount=Decimal("1"),
                                  celo_slippage_buffer=Decimal("0.001"),
                                  logging_options=self.logging_options,
                                  hb_app_notification=False,
                                  mock_celo_cli_mode=True)
        self.clock.add_iterator(self.market)
        self.clock.add_iterator(self.strategy)
        self.market_order_fill_logger: EventLogger = EventLogger()
        self.market.add_listener(MarketEvent.OrderFilled,
                                 self.market_order_fill_logger)
        CeloCLI.unlock_account(TEST_ADDRESS, TEST_PASSWORD)
示例#17
0
    async def test_buy_order(self):
        self._http_player.replay_timestamp_ms = 1648500060561
        clock_task: asyncio.Task = safe_ensure_future(self.run_clock())
        event_logger: EventLogger = EventLogger()
        self._connector.add_listener(MarketEvent.BuyOrderCreated, event_logger)
        self._connector.add_listener(MarketEvent.OrderFilled, event_logger)

        try:
            self._connector.buy("DAI-WETH", Decimal(100), OrderType.LIMIT,
                                Decimal("0.002861464039500"))
            order_created_event: BuyOrderCreatedEvent = await event_logger.wait_for(
                BuyOrderCreatedEvent, timeout_seconds=5)
            self.assertEqual(
                "0xc3d3166e6142c479b26c21e007b68e2b7fb1d28c1954ab344b45d7390139654f",  # noqa: mock
                order_created_event.exchange_order_id)
            self._http_player.replay_timestamp_ms = 1648500097569
            order_filled_event: OrderFilledEvent = await event_logger.wait_for(
                OrderFilledEvent, timeout_seconds=5)
            self.assertEqual(
                "0xc3d3166e6142c479b26c21e007b68e2b7fb1d28c1954ab344b45d7390139654f",  # noqa: mock
                order_filled_event.exchange_trade_id)
        finally:
            clock_task.cancel()
            try:
                await clock_task
            except asyncio.CancelledError:
                pass
    def setUp(self):
        self.clock: Clock = Clock(ClockMode.BACKTEST, 60.0,
                                  self.start_timestamp, self.end_timestamp)
        self.clock_tick_size = 60
        self.maker_market: BacktestMarket = BacktestMarket()
        self.maker_data: MockOrderBookLoader = MockOrderBookLoader(
            *self.maker_symbols)
        self.mid_price = 100
        self.bid_threshold = 0.01
        self.ask_threshold = 0.01
        self.cancel_order_wait_time = 45
        self.maker_data.set_balanced_order_book(mid_price=self.mid_price,
                                                min_price=1,
                                                max_price=200,
                                                price_step_size=1,
                                                volume_step_size=10)
        self.maker_market.add_data(self.maker_data)
        self.maker_market.set_balance("COINALPHA", 500)
        self.maker_market.set_balance("WETH", 500)
        self.maker_market.set_balance("QETH", 500)
        self.maker_market.set_quantization_param(
            QuantizationParams(self.maker_symbols[0], 5, 5, 5, 5))

        self.market_pair: PureMarketPair = PureMarketPair(
            *([self.maker_market] + self.maker_symbols))

        logging_options: int = (
            PureMarketMakingStrategy.OPTION_LOG_ALL &
            (~PureMarketMakingStrategy.OPTION_LOG_NULL_ORDER_SIZE))
        self.strategy: {PureMarketMakingStrategy} = PureMarketMakingStrategy(
            [self.market_pair],
            order_size=1,
            bid_place_threshold=self.bid_threshold,
            ask_place_threshold=self.ask_threshold,
            cancel_order_wait_time=45,
            logging_options=logging_options)
        self.logging_options = logging_options
        self.clock.add_iterator(self.maker_market)
        self.clock.add_iterator(self.strategy)

        self.maker_order_fill_logger: EventLogger = EventLogger()
        self.cancel_order_logger: EventLogger = EventLogger()
        self.maker_market.add_listener(MarketEvent.OrderFilled,
                                       self.maker_order_fill_logger)
        self.maker_market.add_listener(MarketEvent.OrderCancelled,
                                       self.cancel_order_logger)
示例#19
0
    def setUp(self) -> None:
        super().setUp()
        self.ev_loop = asyncio.get_event_loop()
        self.event_listener = EventLogger()

        self.exchange = BittrexExchange(self.api_key,
                                        self.secret_key,
                                        trading_pairs=[self.trading_pair])
    def _initialize_event_loggers(self):
        self.buy_order_completed_logger = EventLogger()
        self.sell_order_completed_logger = EventLogger()
        self.order_cancelled_logger = EventLogger()
        self.order_filled_logger = EventLogger()
        self.funding_payment_completed_logger = EventLogger()

        events_and_loggers = [
            (MarketEvent.BuyOrderCompleted, self.buy_order_completed_logger),
            (MarketEvent.SellOrderCompleted, self.sell_order_completed_logger),
            (MarketEvent.OrderCancelled, self.order_cancelled_logger),
            (MarketEvent.OrderFilled, self.order_filled_logger),
            (MarketEvent.FundingPaymentCompleted,
             self.funding_payment_completed_logger)
        ]

        for event, logger in events_and_loggers:
            self.exchange.add_listener(event, logger)
示例#21
0
 def setUp(self):
     self.db_path: str = realpath(join(__file__, "../connector_test.sqlite"))
     try:
         os.unlink(self.db_path)
     except FileNotFoundError:
         pass
     self.event_logger = EventLogger()
     for event_tag in self.events:
         self.connector.add_listener(event_tag, self.event_logger)
    async def test_update_approval_status(self):
        def create_approval_record(token_symbol: str,
                                   tx_hash: str) -> GatewayInFlightLPOrder:
            return GatewayInFlightLPOrder(
                client_order_id=self._connector.create_approval_order_id(
                    "uniswapLP", token_symbol),
                exchange_order_id=tx_hash,
                trading_pair=token_symbol,
                lp_type=LPType.ADD,
                lower_price=s_decimal_0,
                upper_price=s_decimal_0,
                amount_0=s_decimal_0,
                amount_1=s_decimal_0,
                token_id=0,
                gas_price=s_decimal_0,
                creation_timestamp=self._connector.current_timestamp)

        successful_records: List[GatewayInFlightLPOrder] = [
            create_approval_record(
                "COIN1",
                "0x273a720fdc92554c47f409f4f74d3c262937451ccdbaddfd8d0185a9e3c64dd2"  # noqa: mock
            ),
            create_approval_record(
                "COIN3",
                "0x27d7a7156bd0afc73092602da67774aa3319adbc72213122d65480e482ce0a8b"  # noqa: mock
            ),
        ]
        """fake_records: List[GatewayInFlightLPOrder] = [
            create_approval_record(
                "COIN1",
                "0x273a720fdc92554c47f409f4f74d3c262937451ccdbaddfd8d0185a9e3c64dd1"        # noqa: mock
            ),
            create_approval_record(
                "COIN3",
                "0x27d7a7156bd0afc73092602da67774aa3319adbc72213122d65480e482ce0a8a"        # noqa: mock
            ),
        ]"""

        event_logger: EventLogger = EventLogger()
        self._connector.add_listener(TokenApprovalEvent.ApprovalSuccessful,
                                     event_logger)
        self._connector.add_listener(TokenApprovalEvent.ApprovalFailed,
                                     event_logger)

        try:
            await self._connector.update_token_approval_status(
                successful_records)
            self.assertEqual(2, len(event_logger.event_log))
            self.assertEqual({"uniswapLP_COIN1", "uniswapLP_COIN3"},
                             set(e.token_symbol
                                 for e in event_logger.event_log))
        finally:
            self._connector.remove_listener(
                TokenApprovalEvent.ApprovalSuccessful, event_logger)
            self._connector.remove_listener(TokenApprovalEvent.ApprovalFailed,
                                            event_logger)
示例#23
0
    def setUp(self) -> None:
        self.clock_tick_size = 1
        self.clock: Clock = Clock(ClockMode.BACKTEST, self.clock_tick_size,
                                  self.start_timestamp, self.end_timestamp)

        self.mid_price = 100
        self.bid_spread = 0.01
        self.ask_spread = 0.01
        self.order_refresh_time = 1

        trading_pairs = list(
            map(lambda quote_asset: "ETH-" + quote_asset, ["USDT", "BTC"]))
        market, market_infos = self.create_market(trading_pairs,
                                                  self.mid_price, {
                                                      "USDT": 5000,
                                                      "ETH": 500,
                                                      "BTC": 100
                                                  })
        self.market = market
        self.market_infos = market_infos

        self.clock.add_iterator(self.market)
        self.order_fill_logger: EventLogger = EventLogger()
        self.cancel_order_logger: EventLogger = EventLogger()
        self.market.add_listener(MarketEvent.OrderFilled,
                                 self.order_fill_logger)
        self.market.add_listener(MarketEvent.OrderCancelled,
                                 self.cancel_order_logger)

        self.default_strategy = LiquidityMiningStrategy()
        self.default_strategy.init_params(
            exchange=self.market,
            market_infos=self.market_infos,
            token="ETH",
            order_amount=Decimal(2),
            spread=Decimal(0.0005),
            inventory_skew_enabled=False,
            target_base_pct=Decimal(0.5),
            order_refresh_time=5,
            order_refresh_tolerance_pct=Decimal(
                0.1),  # tolerance of 10 % change
            max_order_age=3,
        )
    def setUp(self) -> None:
        super().setUp()
        self.log_records = []
        self.mocking_assistant = NetworkMockingAssistant()
        self.exchange = GateIoExchange(self.api_key,
                                       self.api_secret,
                                       trading_pairs=[self.trading_pair])
        self.event_listener = EventLogger()

        self.exchange.logger().setLevel(1)
        self.exchange.logger().addHandler(self)
示例#25
0
    async def test_update_order_status(self):
        def create_order_record(trading_pair: str, trade_type: TradeType,
                                tx_hash: str, price: Decimal, amount: Decimal,
                                gas_price: Decimal) -> GatewayInFlightOrder:
            order: GatewayInFlightOrder = GatewayInFlightOrder(
                client_order_id=self._connector.create_market_order_id(
                    trade_type, trading_pair),
                exchange_order_id=tx_hash,
                trading_pair=trading_pair,
                order_type=OrderType.LIMIT,
                trade_type=trade_type,
                price=price,
                amount=amount,
                gas_price=gas_price,
                creation_timestamp=self._connector.current_timestamp)
            order.fee_asset = self._connector._native_currency
            self._connector._order_tracker.start_tracking_order(order)
            return order

        successful_records: List[GatewayInFlightOrder] = [
            create_order_record(
                "DAI-WETH",
                TradeType.BUY,
                "0xc7287236f64484b476cfbec0fd21bc49d85f8850c8885665003928a122041e18",  # noqa: mock
                Decimal("0.00267589"),
                Decimal("1000"),
                Decimal("29"))
        ]
        fake_records: List[GatewayInFlightOrder] = [
            create_order_record(
                "DAI-WETH",
                TradeType.BUY,
                "0xc7287236f64484b476cfbec0fd21bc49d85f8850c8885665003928a122041e17",  # noqa: mock
                Decimal("0.00267589"),
                Decimal("1000"),
                Decimal("29"))
        ]

        event_logger: EventLogger = EventLogger()
        self._connector.add_listener(MarketEvent.OrderFilled, event_logger)

        try:
            await self._connector.update_order_status(successful_records +
                                                      fake_records)
            async with timeout(10):
                while len(event_logger.event_log) < 1:
                    await event_logger.wait_for(OrderFilledEvent)
            filled_event: OrderFilledEvent = event_logger.event_log[0]
            self.assertEqual(
                "0xc7287236f64484b476cfbec0fd21bc49d85f8850c8885665003928a122041e18",  # noqa: mock
                filled_event.exchange_trade_id)
        finally:
            self._connector.remove_listener(MarketEvent.OrderFilled,
                                            event_logger)
示例#26
0
    async def test_update_approval_status(self):
        def create_approval_record(token_symbol: str,
                                   tx_hash: str) -> GatewayInFlightOrder:
            return GatewayInFlightOrder(
                client_order_id=self._connector.create_approval_order_id(
                    token_symbol),
                exchange_order_id=tx_hash,
                trading_pair=token_symbol,
                order_type=OrderType.LIMIT,
                trade_type=TradeType.BUY,
                price=s_decimal_0,
                amount=s_decimal_0,
                gas_price=s_decimal_0,
                creation_timestamp=self._connector.current_timestamp)

        successful_records: List[GatewayInFlightOrder] = [
            create_approval_record(
                "WETH",
                "0x66b533792f45780fc38573bfd60d6043ab266471607848fb71284cd0d9eecff9"  # noqa: mock
            ),
            create_approval_record(
                "DAI",
                "0x4f81aa904fcb16a8938c0e0a76bf848df32ce6378e9e0060f7afc4b2955de405"  # noqa: mock
            ),
        ]
        fake_records: List[GatewayInFlightOrder] = [
            create_approval_record(
                "WETH",
                "0x66b533792f45780fc38573bfd60d6043ab266471607848fb71284cd0d9eecff8"  # noqa: mock
            ),
            create_approval_record(
                "DAI",
                "0x4f81aa904fcb16a8938c0e0a76bf848df32ce6378e9e0060f7afc4b2955de404"  # noqa: mock
            ),
        ]

        event_logger: EventLogger = EventLogger()
        self._connector.add_listener(TokenApprovalEvent.ApprovalSuccessful,
                                     event_logger)
        self._connector.add_listener(TokenApprovalEvent.ApprovalFailed,
                                     event_logger)

        try:
            await self._connector.update_token_approval_status(
                successful_records + fake_records)
            self.assertEqual(2, len(event_logger.event_log))
            self.assertEqual({"WETH", "DAI"},
                             set(e.token_symbol
                                 for e in event_logger.event_log))
        finally:
            self._connector.remove_listener(
                TokenApprovalEvent.ApprovalSuccessful, event_logger)
            self._connector.remove_listener(TokenApprovalEvent.ApprovalFailed,
                                            event_logger)
    def setUp(self):
        self.db_path: str = realpath(join(__file__, "../connector_test.sqlite"))
        try:
            # on windows cannot unlink the sqlite db file before closing the db
            if os.name != 'nt':
                os.unlink(self.db_path)
        except FileNotFoundError:
            pass

        self.event_logger = EventLogger()
        for event_tag in self.events:
            self.connector.add_listener(event_tag, self.event_logger)
示例#28
0
    async def test_cancel_approval(self):
        connector: GatewayEVMAMM = self._connector
        event_logger: EventLogger = EventLogger()
        connector.add_listener(TokenApprovalEvent.ApprovalCancelled,
                               event_logger)

        expected_evm_approve_tx_hash_set: Set[str] = {
            "0x7666bb5ba3ecec828e323f20685dfd03a067e7b2830b217363293b166b48a679",  # noqa: mock
            "0x7291d26447e300bd37260add7ac7db9a745f64c7ee10854695b0a70b0897456f",  # noqa: mock
        }
        expected_cancel_tx_hash_set: Set[str] = {
            "0x21b4d0e956241a497cf50d9c5dcefea4ec9fb225a1d11f80477ca434caab30ff",  # noqa: mock
            "0x7ac85d5a77f28e9317127218c06eb3d70f4c68924a4b5b743fe8faef6d011d11",  # noqa: mock
        }

        try:
            async with self.run_clock():
                self._http_player.replay_timestamp_ms = 1648503333290
                tracked_order_1: GatewayInFlightOrder = await connector.approve_token(
                    "DAI",
                    max_fee_per_gas=MAX_FEE_PER_GAS,
                    max_priority_fee_per_gas=MAX_PRIORITY_FEE_PER_GAS)
                self._http_player.replay_timestamp_ms = 1648503337964
                tracked_order_2: GatewayInFlightOrder = await connector.approve_token(
                    "WETH",
                    max_fee_per_gas=MAX_FEE_PER_GAS,
                    max_priority_fee_per_gas=MAX_PRIORITY_FEE_PER_GAS)
                self.assertEqual(2, len(connector._in_flight_orders))
                self.assertEqual(
                    expected_evm_approve_tx_hash_set,
                    set(o.exchange_order_id
                        for o in connector._in_flight_orders.values()))

                self._http_player.replay_timestamp_ms = 1648503342513
                tracked_order_1._creation_timestamp = connector.current_timestamp - 86400
                tracked_order_2._creation_timestamp = connector.current_timestamp - 86400
                await connector.cancel_outdated_orders(600)
                self.assertEqual(2, len(connector._in_flight_orders))
                self.assertEqual(
                    expected_cancel_tx_hash_set,
                    set(o.cancel_tx_hash
                        for o in connector._in_flight_orders.values()))

                self._http_player.replay_timestamp_ms = 1648503385484
                async with timeout(10):
                    while len(event_logger.event_log) < 2:
                        await event_logger.wait_for(TokenApprovalCancelledEvent
                                                    )
                self.assertEqual(0, len(connector._in_flight_orders))
        finally:
            connector.remove_listener(TokenApprovalEvent.ApprovalCancelled,
                                      event_logger)
 def setUp(self) -> None:
     super().setUp()
     self.mocking_assistant = NetworkMockingAssistant()
     self.event_listener = EventLogger()
     not_a_real_secret = "kQH5HW/8p1uGOVjbgWA7FunAmGO8lsSUXNsu3eow76sz84Q18fWxnyRzBHCd3pd5nE9qa99HAZtuZuj6F1huXg=="
     self.exchange = KrakenExchange(
         kraken_api_key="someKey",
         kraken_secret_key=not_a_real_secret,
         trading_pairs=[self.trading_pair],
     )
     self.start_time = 1
     self.clock = Clock(clock_mode=ClockMode.BACKTEST,
                        start_time=self.start_time)
    def setUp(self):
        self.db_path: str = realpath(join(__file__, "../binance_test.sqlite"))
        try:
            os.unlink(self.db_path)
        except FileNotFoundError:
            pass

        self.market_logger = EventLogger()
        for event_tag in self.events:
            self.market.add_listener(event_tag, self.market_logger)

        for trading_pair, orderbook in self.market.order_books.items():
            orderbook.clear_traded_order_book()