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)
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
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)
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
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
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()
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))