# Buggy code
def start_download_data(args: Dict[str, Any]) -> None:
    """
    Download data (former download_backtest_data.py script)
    """
    config = setup_utils_configuration(args, RunMode.UTIL_EXCHANGE)

    timerange = TimeRange()
    if "days" in config:
        time_since = arrow.utcnow().shift(days=-config["days"]).strftime("%Y%m%d")
        timerange = TimeRange.parse_timerange(f"{time_since}-")

    if "pairs" not in config:
        raise OperationalException(
            "Downloading data requires a list of pairs. "
            "Please check the documentation on how to configure this."
        )

    logger.info(
        f"About to download pairs: {config['pairs']}, "
        f"intervals: {config['timeframes']} to {config['datadir']}"
    )

    pairs_not_available: List[str] = []

    # Init exchange
    exchange = ExchangeResolver.load_exchange(config["exchange"]["name"], config)
    try:
        if config.get("download_trades"):
            pairs_not_available = refresh_backtest_trades_data(
                exchange,
                pairs=config["pairs"],
                datadir=config["datadir"],
                timerange=timerange,
                erase=config.get("erase"),
            )

            # Convert downloaded trade data to different timeframes
            convert_trades_to_ohlcv(
                pairs=config["pairs"],
                timeframes=config["timeframes"],
                datadir=config["datadir"],
                timerange=timerange,
                erase=config.get("erase"),
            )
        else:
            pairs_not_available = refresh_backtest_ohlcv_data(
                exchange,
                pairs=config["pairs"],
                timeframes=config["timeframes"],
                datadir=config["datadir"],
                timerange=timerange,
                erase=config.get("erase"),
            )

    except KeyboardInterrupt:
        sys.exit("SIGINT received, aborting ...")

    finally:
        if pairs_not_available:
            logger.info(
                f"Pairs [{','.join(pairs_not_available)}] not available "
                f"on exchange {exchange.name}."
            )


# 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 start_download_data(args: Dict[str, Any]) -> None:
    """
    Download data (former download_backtest_data.py script)
    """
    config = setup_utils_configuration(args, RunMode.UTIL_EXCHANGE)

    timerange = TimeRange()
    if "days" in config:
        time_since = arrow.utcnow().shift(days=-config["days"]).strftime("%Y%m%d")
        timerange = TimeRange.parse_timerange(f"{time_since}-")

    if "pairs" not in config:
        raise OperationalException(
            "Downloading data requires a list of pairs. "
            "Please check the documentation on how to configure this."
        )

    logger.info(
        f"About to download pairs: {config['pairs']}, "
        f"intervals: {config['timeframes']} to {config['datadir']}"
    )

    pairs_not_available: List[str] = []

    # Init exchange
    exchange = ExchangeResolver.load_exchange(
        config["exchange"]["name"], config, validate=False
    )
    # Manual validations of relevant settings
    exchange.validate_pairs(config["pairs"])
    for timeframe in config["timeframes"]:
        exchange.validate_timeframes(timeframe)

    try:
        if config.get("download_trades"):
            pairs_not_available = refresh_backtest_trades_data(
                exchange,
                pairs=config["pairs"],
                datadir=config["datadir"],
                timerange=timerange,
                erase=bool(config.get("erase")),
                data_format=config["dataformat_trades"],
            )

            # Convert downloaded trade data to different timeframes
            convert_trades_to_ohlcv(
                pairs=config["pairs"],
                timeframes=config["timeframes"],
                datadir=config["datadir"],
                timerange=timerange,
                erase=bool(config.get("erase")),
                data_format_ohlcv=config["dataformat_ohlcv"],
                data_format_trades=config["dataformat_trades"],
            )
        else:
            pairs_not_available = refresh_backtest_ohlcv_data(
                exchange,
                pairs=config["pairs"],
                timeframes=config["timeframes"],
                datadir=config["datadir"],
                timerange=timerange,
                erase=bool(config.get("erase")),
                data_format=config["dataformat_ohlcv"],
            )

    except KeyboardInterrupt:
        sys.exit("SIGINT received, aborting ...")

    finally:
        if pairs_not_available:
            logger.info(
                f"Pairs [{','.join(pairs_not_available)}] not available "
                f"on exchange {exchange.name}."
            )