Exemplo n.º 1
0
    def adjust_trade(self, trade: Trade) -> Trade:
        price_slippage = np.random.uniform(0, self.max_slippage_percent / 100)

        initial_price = trade.price

        if trade.type == TradeType.MARKET:
            if trade.side == TradeSide.BUY:
                trade.price = max(initial_price * (1 + price_slippage), 1e-3)
            else:
                trade.price = max(initial_price * (1 - price_slippage), 1e-3)
        else:
            if trade.side == TradeSide.BUY:
                trade.price = max(initial_price * (1 + price_slippage), 1e-3)

                if trade.price > initial_price:
                    trade.size *= min(initial_price / trade.price, 1)
            else:
                trade.price = max(initial_price * (1 - price_slippage), 1e-3)

                if trade.price < initial_price:
                    trade.size *= min(trade.price / initial_price, 1)

        return trade
Exemplo n.º 2
0
    def execute_trade(self, trade: Trade) -> Trade:
        current_price = self.current_price(symbol=trade.symbol)

        commission = self._commission_percent / 100

        is_trade_valid = self._is_valid_trade(trade)

        if trade.is_buy and is_trade_valid:
            price_adjustment = price_adjustment = (1 + commission)
            trade.price = round(current_price * price_adjustment,
                                self._base_precision)
            trade.amount = round((trade.price * trade.amount) / trade.price,
                                 self._asset_precision)
        elif trade.is_sell and is_trade_valid:
            price_adjustment = (1 - commission)
            trade.price = round(current_price * price_adjustment,
                                self._base_precision)
            trade.amount = round(trade.amount, self._asset_precision)

        filled_trade = self._slippage_model.fill_order(trade)

        self._update_account(filled_trade)

        return filled_trade