# Buggy code
def handle_stoploss_on_exchange(self, trade: Trade) -> bool:
    """
    Check if trade is fulfilled in which case the stoploss
    on exchange should be added immediately if stoploss on exchange
    is enabled.
    """

    logger.debug("Handling stoploss on exchange %s ...", trade)

    stoploss_order = None

    try:
        # First we check if there is already a stoploss on exchange
        stoploss_order = (
            self.exchange.get_order(trade.stoploss_order_id, trade.pair)
            if trade.stoploss_order_id
            else None
        )
    except InvalidOrderException as exception:
        logger.warning("Unable to fetch stoploss order: %s", exception)

    # If buy order is fulfilled but there is no stoploss, we add a stoploss on exchange
    if not trade.open_order_id and not stoploss_order:
        stoploss = (
            self.edge.stoploss(pair=trade.pair) if self.edge else self.strategy.stoploss
        )

        stop_price = trade.open_rate * (1 + stoploss)

        if self.create_stoploss_order(
            trade=trade, stop_price=stop_price, rate=stop_price
        ):
            trade.stoploss_last_update = datetime.now()
            return False

    # If stoploss order is canceled for some reason we add it
    if stoploss_order and stoploss_order["status"] == "canceled":
        if self.create_stoploss_order(
            trade=trade, stop_price=trade.stop_loss, rate=trade.stop_loss
        ):
            return False
        else:
            trade.stoploss_order_id = None
            logger.warning("Stoploss order was cancelled, but unable to recreate one.")

    # We check if stoploss order is fulfilled
    if stoploss_order and stoploss_order["status"] == "closed":
        trade.sell_reason = SellType.STOPLOSS_ON_EXCHANGE.value
        trade.update(stoploss_order)
        # Lock pair for one candle to prevent immediate rebuys
        self.strategy.lock_pair(
            trade.pair, timeframe_to_next_date(self.config["ticker_interval"])
        )
        self._notify_sell(trade, "stoploss")
        return True

    # Finally we check if stoploss on exchange should be moved up because of trailing.
    if stoploss_order and self.config.get("trailing_stop", False):
        # if trailing stoploss is enabled we check if stoploss value has changed
        # in which case we cancel stoploss order and put another one with new
        # value immediately
        self.handle_trailing_stoploss_on_exchange(trade, stoploss_order)

    return False


# Traceback (Exception)
2020-02-20 22:47:28,025 - freqtrade - ERROR - Fatal exception!
Traceback (most recent call last):
File "/opt/tradebot/freqtrade/.env/lib/python3.7/site-packages/talib/__init__.py", line 20, in wrapper
for arg in chain(args, kwargs.values())
StopIteration

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/freqtrade/freqtrade/main.py", line 36, in main
return_code = args['func'](args)
File "/freqtrade/freqtrade/commands/optimize_commands.py", line 76, in start_hyperopt
hyperopt.start()
File "/freqtrade/freqtrade/optimize/hyperopt.py", line 488, in start
preprocessed = self.backtesting.strategy.tickerdata_to_dataframe(data)
File "/freqtrade/freqtrade/strategy/interface.py", line 448, in tickerdata_to_dataframe
for pair, pair_data in tickerdata.items()}
File "/freqtrade/freqtrade/strategy/interface.py", line 448, in <dictcomp>
for pair, pair_data in tickerdata.items()}
File "/freqtrade/freqtrade/strategy/interface.py", line 464, in advise_indicators
return self.populate_indicators(dataframe, metadata)
File "/freqtrade/user_data/strategies/MyDev.py", line 205, in populate_indicators
dataframe['mfi'] = ta.MFI(dataframe)
File "talib/_abstract.pxi", line 352, in talib._ta_lib.Function.__call__
File "talib/_abstract.pxi", line 383, in talib._ta_lib.Function.__call_function
File "/opt/tradebot/freqtrade/.env/lib/python3.7/site-packages/talib/__init__.py", line 24, in wrapper
return func(*args, **kwargs)
File "talib/_func.pxi", line 8454, in talib._ta_lib.MFI
Exception: volume is not double

# Fixed code
def handle_stoploss_on_exchange(self, trade: Trade) -> bool:
    """
    Check if trade is fulfilled in which case the stoploss
    on exchange should be added immediately if stoploss on exchange
    is enabled.
    """

    logger.debug("Handling stoploss on exchange %s ...", trade)

    stoploss_order = None

    try:
        # First we check if there is already a stoploss on exchange
        stoploss_order = (
            self.exchange.get_order(trade.stoploss_order_id, trade.pair)
            if trade.stoploss_order_id
            else None
        )
    except InvalidOrderException as exception:
        logger.warning("Unable to fetch stoploss order: %s", exception)

    # We check if stoploss order is fulfilled
    if stoploss_order and stoploss_order["status"] == "closed":
        trade.sell_reason = SellType.STOPLOSS_ON_EXCHANGE.value
        trade.update(stoploss_order)
        # Lock pair for one candle to prevent immediate rebuys
        self.strategy.lock_pair(
            trade.pair, timeframe_to_next_date(self.config["ticker_interval"])
        )
        self._notify_sell(trade, "stoploss")
        return True

    if trade.open_order_id or not trade.is_open:
        # Trade has an open Buy or Sell order, Stoploss-handling can't happen in this case
        # as the Amount on the exchange is tied up in another trade.
        # The trade can be closed already (sell-order fill confirmation came in this iteration)
        return False

    # If buy order is fulfilled but there is no stoploss, we add a stoploss on exchange
    if not stoploss_order:
        stoploss = (
            self.edge.stoploss(pair=trade.pair) if self.edge else self.strategy.stoploss
        )

        stop_price = trade.open_rate * (1 + stoploss)

        if self.create_stoploss_order(
            trade=trade, stop_price=stop_price, rate=stop_price
        ):
            trade.stoploss_last_update = datetime.now()
            return False

    # If stoploss order is canceled for some reason we add it
    if stoploss_order and stoploss_order["status"] == "canceled":
        if self.create_stoploss_order(
            trade=trade, stop_price=trade.stop_loss, rate=trade.stop_loss
        ):
            return False
        else:
            trade.stoploss_order_id = None
            logger.warning("Stoploss order was cancelled, but unable to recreate one.")

    # Finally we check if stoploss on exchange should be moved up because of trailing.
    if stoploss_order and self.config.get("trailing_stop", False):
        # if trailing stoploss is enabled we check if stoploss value has changed
        # in which case we cancel stoploss order and put another one with new
        # value immediately
        self.handle_trailing_stoploss_on_exchange(trade, stoploss_order)

    return False