Beispiel #1
0
def test_is_backtesting_enabled():
    assert api.is_backtesting_enabled({}) is False
    assert api.is_backtesting_enabled({"backtesting": {}}) is False
    assert api.is_backtesting_enabled({"backtesting": {
        "enabled": False
    }}) is False
    assert api.is_backtesting_enabled({"backtesting": {
        "enabled": True
    }}) is True
 async def start(self):
     self.matrix_id = await evaluator_api.initialize_evaluators(
         self.octobot.config, self.tentacles_setup_config)
     await evaluator_api.create_evaluator_channels(
         self.matrix_id,
         is_backtesting=backtesting_api.is_backtesting_enabled(
             self.octobot.config))
     await logger.init_evaluator_chan_logger(self.matrix_id)
Beispiel #3
0
def update_global_config(new_config, delete=False):
    current_edited_config = interfaces_util.get_edited_config(dict_only=False)
    if not delete:
        _handle_special_fields(current_edited_config.config, new_config)
    current_edited_config.update_config_fields(new_config,
                                               backtesting_api.is_backtesting_enabled(current_edited_config.config),
                                               constants.UPDATED_CONFIG_SEPARATOR,
                                               delete=delete)
    return True
Beispiel #4
0
 async def start(self):
     in_backtesting = backtesting_api.is_backtesting_enabled(
         self.octobot.config)
     service_feed_factory = service_api.create_service_feed_factory(
         self.octobot.config, self.octobot.async_loop, self.octobot.bot_id)
     for feed in service_feed_factory.get_available_service_feeds(
             in_backtesting):
         if tentacles_manager_api.is_tentacle_activated_in_tentacles_setup_config(
                 self.octobot.tentacles_setup_config, feed.get_name()):
             await self.create_feed(service_feed_factory, feed,
                                    in_backtesting)
Beispiel #5
0
def profile():
    selected_profile = flask.request.args.get("select", None)
    if selected_profile is not None and selected_profile != models.get_current_profile(
    ).profile_id:
        models.select_profile(selected_profile)
        current_profile = models.get_current_profile()
        flask.flash(f"Switched to {current_profile.name} profile.", "success")
    else:
        current_profile = models.get_current_profile()
    media_url = flask.url_for("tentacle_media", _external=True)
    display_config = interfaces_util.get_edited_config()

    missing_tentacles = set()
    profiles = models.get_profiles()
    config_exchanges = display_config[commons_constants.CONFIG_EXCHANGES]

    return flask.render_template(
        'profile.html',
        current_profile=current_profile,
        profiles=profiles,
        profiles_activated_tentacles=models.get_profiles_activated_tentacles(
            profiles),
        config_exchanges=config_exchanges,
        config_trading=display_config[commons_constants.CONFIG_TRADING],
        config_trader=display_config[commons_constants.CONFIG_TRADER],
        config_trader_simulator=display_config[
            commons_constants.CONFIG_SIMULATOR],
        config_symbols=models.format_config_symbols(display_config),
        config_reference_market=display_config[
            commons_constants.CONFIG_TRADING][
                commons_constants.CONFIG_TRADER_REFERENCE_MARKET],
        real_trader_activated=interfaces_util.
        has_real_and_or_simulated_traders()[0],
        symbol_list=sorted(
            models.get_symbol_list([
                exchange for exchange in display_config[
                    commons_constants.CONFIG_EXCHANGES]
            ])),
        full_symbol_list=models.get_all_symbols_dict(),
        evaluator_config=models.get_evaluator_detailed_config(
            media_url, missing_tentacles),
        strategy_config=models.get_strategy_config(media_url,
                                                   missing_tentacles),
        evaluator_startup_config=models.
        get_evaluators_tentacles_startup_activation(),
        trading_startup_config=models.get_trading_tentacles_startup_activation(
        ),
        missing_tentacles=missing_tentacles,
        in_backtesting=backtesting_api.is_backtesting_enabled(display_config),
        config_tentacles_by_group=models.
        get_tentacles_activation_desc_by_group(media_url, missing_tentacles),
        exchanges_details=models.get_exchanges_details(config_exchanges))
def update_global_config(new_config, delete=False):
    current_edited_config = interfaces_util.get_edited_config()
    if not delete:
        _handle_special_fields(new_config)
    config_manager.update_global_config(
        new_config,
        current_edited_config,
        octobot_constants.CONFIG_FILE_SCHEMA,
        backtesting_api.is_backtesting_enabled(current_edited_config),
        constants.UPDATED_CONFIG_SEPARATOR,
        update_input=True,
        delete=delete)
    return True
Beispiel #7
0
def get_currency_price_graph_update(exchange_id,
                                    symbol,
                                    time_frame,
                                    list_arrays=True,
                                    backtesting=False,
                                    minimal_candles=False,
                                    ignore_trades=False):
    bot_api = interfaces_util.get_bot_api()
    # TODO: handle on the fly backtesting price graph
    # if backtesting and WebInterface and WebInterface.tools[BOT_TOOLS_BACKTESTING]:
    #     bot = WebInterface.tools[BOT_TOOLS_BACKTESTING].get_bot()
    symbol = parse_get_symbol(symbol)
    in_backtesting = backtesting_api.is_backtesting_enabled(
        interfaces_util.get_global_config()) or backtesting
    exchange_manager = trading_api.get_exchange_manager_from_exchange_id(
        exchange_id)
    if time_frame is not None:
        try:
            symbol_data = trading_api.get_symbol_data(exchange_manager,
                                                      symbol,
                                                      allow_creation=False)
            limit = 1 if minimal_candles else -1
            historical_candles = trading_api.get_symbol_historical_candles(
                symbol_data, time_frame, limit=limit)
            kline = [math.nan]
            if trading_api.has_symbol_klines(symbol_data, time_frame):
                kline = trading_api.get_symbol_klines(symbol_data, time_frame)
            if historical_candles is not None:
                return _create_candles_data(symbol, time_frame,
                                            historical_candles, kline, bot_api,
                                            list_arrays, in_backtesting,
                                            ignore_trades)
        except KeyError:
            traded_pairs = trading_api.get_trading_pairs(exchange_manager)
            if not traded_pairs or symbol in traded_pairs:
                # not started yet
                return None
            else:
                return {"error": f"no data for {symbol}"}
    return None
Beispiel #8
0
def get_in_backtesting_mode():
    return backtesting_api.is_backtesting_enabled(
        interfaces_util.get_global_config())
 async def start(self):
     in_backtesting = backtesting_api.is_backtesting_enabled(
         self.octobot.config)
     await self._create_interfaces(in_backtesting)
     await self._create_notifiers(in_backtesting)
     await self.start_interfaces()
Beispiel #10
0
def config():
    if flask.request.method == 'POST':
        request_data = flask.request.get_json()
        success = True
        response = ""

        if request_data:

            # update trading config if required
            if constants.TRADING_CONFIG_KEY in request_data and request_data[
                    constants.TRADING_CONFIG_KEY]:
                success = success and models.update_tentacles_activation_config(
                    request_data[constants.TRADING_CONFIG_KEY])
            else:
                request_data[constants.TRADING_CONFIG_KEY] = ""

            # update tentacles config if required
            if constants.TENTACLES_CONFIG_KEY in request_data and request_data[
                    constants.TENTACLES_CONFIG_KEY]:
                success = success and models.update_tentacles_activation_config(
                    request_data[constants.TENTACLES_CONFIG_KEY])
            else:
                request_data[constants.TENTACLES_CONFIG_KEY] = ""

            # update evaluator config if required
            if constants.EVALUATOR_CONFIG_KEY in request_data and request_data[
                    constants.EVALUATOR_CONFIG_KEY]:
                deactivate_others = False
                if constants.DEACTIVATE_OTHERS in request_data:
                    deactivate_others = request_data[
                        constants.DEACTIVATE_OTHERS]
                success = success and models.update_tentacles_activation_config(
                    request_data[constants.EVALUATOR_CONFIG_KEY],
                    deactivate_others)
            else:
                request_data[constants.EVALUATOR_CONFIG_KEY] = ""

            # remove elements from global config if any to remove
            removed_elements_key = "removed_elements"
            if removed_elements_key in request_data and request_data[
                    removed_elements_key]:
                success = success and models.update_global_config(
                    request_data[removed_elements_key], delete=True)
            else:
                request_data[removed_elements_key] = ""

            # update global config if required
            if constants.GLOBAL_CONFIG_KEY in request_data and request_data[
                    constants.GLOBAL_CONFIG_KEY]:
                success = models.update_global_config(
                    request_data[constants.GLOBAL_CONFIG_KEY])
            else:
                request_data[constants.GLOBAL_CONFIG_KEY] = ""

            response = {
                "evaluator_updated_config":
                request_data[constants.EVALUATOR_CONFIG_KEY],
                "trading_updated_config":
                request_data[constants.TRADING_CONFIG_KEY],
                "tentacle_updated_config":
                request_data[constants.TENTACLES_CONFIG_KEY],
                "global_updated_config":
                request_data[constants.GLOBAL_CONFIG_KEY],
                removed_elements_key:
                request_data[removed_elements_key]
            }

        if success:
            if request_data.get("restart_after_save", False):
                models.schedule_delayed_command(models.restart_bot)
            return util.get_rest_reply(flask.jsonify(response))
        else:
            return util.get_rest_reply('{"update": "ko"}', 500)
    else:
        media_url = flask.url_for("tentacle_media", _external=True)
        display_config = interfaces_util.get_edited_config()

        # service lists
        service_list = models.get_services_list()
        notifiers_list = models.get_notifiers_list()

        return flask.render_template(
            'config.html',
            config_exchanges=display_config[
                commons_constants.CONFIG_EXCHANGES],
            config_trading=display_config[commons_constants.CONFIG_TRADING],
            config_trader=display_config[commons_constants.CONFIG_TRADER],
            config_trader_simulator=display_config[
                commons_constants.CONFIG_SIMULATOR],
            config_notifications=display_config[
                services_constants.CONFIG_CATEGORY_NOTIFICATION],
            config_services=display_config[
                services_constants.CONFIG_CATEGORY_SERVICES],
            config_symbols=models.format_config_symbols(display_config),
            config_reference_market=display_config[
                commons_constants.CONFIG_TRADING][
                    commons_constants.CONFIG_TRADER_REFERENCE_MARKET],
            real_trader_activated=interfaces_util.
            has_real_and_or_simulated_traders()[0],
            ccxt_tested_exchanges=models.get_tested_exchange_list(),
            ccxt_simulated_tested_exchanges=models.get_simulated_exchange_list(
            ),
            ccxt_other_exchanges=sorted(models.get_other_exchange_list()),
            services_list=service_list,
            notifiers_list=notifiers_list,
            symbol_list=sorted(
                models.get_symbol_list([
                    exchange for exchange in display_config[
                        commons_constants.CONFIG_EXCHANGES]
                ])),
            full_symbol_list=models.get_all_symbols_dict(),
            strategy_config=models.get_strategy_config(media_url),
            evaluator_startup_config=models.
            get_evaluators_tentacles_startup_activation(),
            trading_startup_config=models.
            get_trading_tentacles_startup_activation(),
            in_backtesting=backtesting_api.is_backtesting_enabled(
                display_config),
            config_tentacles_by_group=models.
            get_tentacles_activation_desc_by_group(media_url))