def test_update_on_single_exchange_with_multiple_orders(mock_exchange_class): exchange = mock_exchange_class.return_value exchange.id = "fake_exchange_id" exchange.name = "coinbase" wallets = [Wallet(exchange, 10000 * USD), Wallet(exchange, 0 * BTC)] portfolio = Portfolio(USD, wallets) broker = Broker(exchange) # Submit order 1 o1 = Order(step=0, exchange_name="coinbase", side=TradeSide.BUY, trade_type=TradeType.MARKET, pair=USD / BTC, quantity=5200.00 * USD, portfolio=portfolio, price=7000.00) o1.is_executable_on = mock.MagicMock(side_effect=[False, True]) broker.submit(o1) # Submit order 2 o2 = Order(step=0, exchange_name="coinbase", side=TradeSide.BUY, trade_type=TradeType.MARKET, pair=USD / BTC, quantity=230.00 * USD, portfolio=portfolio, price=7300.00) o2.is_executable_on = mock.MagicMock(side_effect=[True, False]) broker.submit(o2) # No updates have been made yet assert o1 in broker.unexecuted and o1 not in broker.executed assert o2 in broker.unexecuted and o2 not in broker.executed # First update broker.update() assert o1 in broker.unexecuted and o1.id not in broker.executed assert o2 not in broker.unexecuted and o2.id in broker.executed # Second update broker.update() assert o1 not in broker.unexecuted and o1.id in broker.executed assert o2 not in broker.unexecuted and o2.id in broker.executed
def test_is_executable_on(mock_portfolio_class, mock_exchange_class): exchange = mock_exchange_class.return_value exchange.name = "coinbase" portfolio = mock_portfolio_class.return_value # Market order order = Order(step=0, exchange_name="coinbase", side=TradeSide.BUY, trade_type=TradeType.MARKET, pair=USD/BTC, quantity=5000.00 * USD, portfolio=portfolio, price=7000.00) exchange.quote_price = mock.Mock(return_value=6800.00) assert order.is_executable_on(exchange) exchange.quote_price = mock.Mock(return_value=7200.00) assert order.is_executable_on(exchange) # Limit order order = Order(step=0, exchange_name="coinbase", side=TradeSide.BUY, trade_type=TradeType.LIMIT, pair=USD/BTC, quantity=5000.00 * USD, portfolio=portfolio, price=7000.00) exchange.quote_price = mock.Mock(return_value=6800.00) assert order.is_executable_on(exchange) exchange.quote_price = mock.Mock(return_value=7200.00) assert order.is_executable_on(exchange) # Stop Order order = Order(step=0, exchange_name="coinbase", side=TradeSide.SELL, trade_type=TradeType.LIMIT, pair=USD/BTC, quantity=5000.00 * USD, portfolio=portfolio, price=7000.00, criteria=Stop("down", 0.03)) exchange.quote_price = mock.Mock(return_value=(1 - 0.031)*order.price) assert order.is_executable_on(exchange) exchange.quote_price = mock.Mock(return_value=(1 - 0.02) * order.price) assert not order.is_executable_on(exchange)