# Buggy code
def process(self) -> None:
    """
    Queries the persistence layer for open trades and handles them,
    otherwise a new trade is created.
    :return: True if one or more trades has been created or closed, False otherwise
    """

    # Check whether markets have to be reloaded
    self.exchange._reload_markets()

    # Query trades from persistence layer
    trades = Trade.get_open_trades()

    self.active_pair_whitelist = self._refresh_whitelist(trades)

    # Refreshing candles
    self.dataprovider.refresh(
        self._create_pair_whitelist(self.active_pair_whitelist),
        self.strategy.informative_pairs(),
    )

    # Protect from collisions with forcesell.
    # Without this, freqtrade my try to recreate stoploss_on_exchange orders
    # while selling is in process, since telegram messages arrive in an different thread.
    with self._sell_lock:
        # First process current opened trades (positions)
        self.exit_positions(trades)

    # Then looking for buy opportunities
    if self.get_free_open_trades():
        self.enter_positions()

    # Check and handle any timed out open orders
    self.check_handle_timedout()
    Trade.session.flush()

    if self.heartbeat_interval and (
        arrow.utcnow().timestamp - self._heartbeat_msg > self.heartbeat_interval
    ):
        logger.info(f"Bot heartbeat. PID={getpid()}")
        self._heartbeat_msg = arrow.utcnow().timestamp


# 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 process(self) -> None:
    """
    Queries the persistence layer for open trades and handles them,
    otherwise a new trade is created.
    :return: True if one or more trades has been created or closed, False otherwise
    """

    # Check whether markets have to be reloaded
    self.exchange._reload_markets()

    # Query trades from persistence layer
    trades = Trade.get_open_trades()

    self.active_pair_whitelist = self._refresh_whitelist(trades)

    # Refreshing candles
    self.dataprovider.refresh(
        self._create_pair_whitelist(self.active_pair_whitelist),
        self.strategy.informative_pairs(),
    )

    # Protect from collisions with forcesell.
    # Without this, freqtrade my try to recreate stoploss_on_exchange orders
    # while selling is in process, since telegram messages arrive in an different thread.
    with self._sell_lock:
        # First process current opened trades (positions)
        self.exit_positions(trades)

    # Then looking for buy opportunities
    if self.get_free_open_trades():
        self.enter_positions()

    # Check and handle any timed out open orders
    self.check_handle_timedout()
    Trade.session.flush()