def place_order(self, side: Side, order_type: OrderType, amount: Number, price: Number=None) -> Order:
        """Place an order."""
        order_repr = f'side={side} type={order_type} amount={amount} price={price}'
        order_err = f'Failed to place order on {self.name}!: {order_repr}'

        self.log.debug(f'Placing order on {self.name}: {order_repr}')
        amount = self._parse_base(amount)
        price = self._parse_quote(price)

        min_amount = self.min_order_amount.amount  # Don´t place order if the amount < min allowed
        if min_amount and amount < min_amount:
            msg = f'{order_err}\n> Reason: amount={amount} < min_amount={min_amount}'
            raise self.exception(OrderTooSmall, msg)

        if self.dry_run:  # Don't place order if dry run
            order = Order.create_default(self.market, order_type, side, amount, price)
            self.log.warning(f'DRY RUN: Order placed: {order}')
            return order

        try:  # Place order
            order = self._place_order(side, order_type, amount, price)
        except Exception as e:
            raise self.exception(OrderNotPlaced, order_err, e) from e

        self.log.info(f'Order placed on {self.name}: {order}')
        return order