def test_path_order_runs_though_broker():

    wallets = [Wallet(exchange, 10000 * USD), Wallet(exchange, 0 * BTC)]
    portfolio = Portfolio(base_instrument=USD, wallets=wallets)
    exchange.reset()
    portfolio.reset()
    broker.reset()

    base_wallet = portfolio.get_wallet(exchange.id, USD)

    quantity = (1 / 10) * base_wallet.balance
    order = Order(side=TradeSide.BUY,
                  trade_type=TradeType.MARKET,
                  pair=USD / BTC,
                  quantity=quantity,
                  portfolio=portfolio)

    order = order.add_recipe(
        Recipe(side=TradeSide.SELL,
               trade_type=TradeType.MARKET,
               pair=USD / BTC,
               criteria=StopLoss(direction=StopDirection.EITHER,
                                 up_percent=0.02,
                                 down_percent=0.10)))

    broker.submit(order)

    while len(broker.unexecuted) > 0:
        broker.update()
        portfolio.update()
        obs = exchange.next_observation(1)

    pytest.fail("Failed.")
Beispiel #2
0
    def get_order(self, action: int, exchange: 'Exchange',
                  portfolio: 'Portfolio') -> Order:
        if action == 0:
            return None

        (pair, stop_loss, take_profit, size) = self._actions[action]

        base_instrument = pair.base if self._trade_side == TradeSide.BUY else pair.quote
        base_wallet = portfolio.get_wallet(exchange.id,
                                           instrument=base_instrument)

        price = exchange.quote_price(pair)
        size = min(base_wallet.balance.size, (base_wallet.balance.size * size))

        if size < 10**-base_instrument.precision:
            return None

        buy_quantity = size * base_instrument

        order = Order(side=self._trade_side,
                      trade_type=self._trade_type,
                      pair=pair,
                      price=price,
                      quantity=buy_quantity,
                      portfolio=portfolio)

        risk_criteria = StopLoss(direction='either',
                                 up_percent=take_profit,
                                 down_percent=stop_loss)

        risk_management = Recipe(side=TradeSide.SELL if self._trade_side
                                 == TradeSide.BUY else TradeSide.BUY,
                                 trade_type=TradeType.MARKET,
                                 pair=pair,
                                 criteria=risk_criteria)

        order.add_recipe(risk_management)

        if self._order_listener is not None:
            order.attach(self._order_listener)

        return order