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.")
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