예제 #1
0
 def get_trading_mode(self):
     try:
         first_exchange_manager = trading_api.get_exchange_manager_from_exchange_id(
             next(iter(self.exchange_producer.exchange_manager_ids)))
         return trading_api.get_trading_modes(first_exchange_manager)[0]
     except StopIteration:
         return None
예제 #2
0
 async def _register_on_channels(self, exchange_id):
     try:
         if trading_api.is_exchange_trading(trading_api.get_exchange_manager_from_exchange_id(exchange_id)):
             await trading_api.subscribe_to_trades_channel(self._web_trades_callback, exchange_id)
             await trading_api.subscribe_to_ohlcv_channel(self._web_ohlcv_empty_callback, exchange_id)
     except ImportError:
         self.logger.error("Watching trade channels requires OctoBot-Trading package installed")
예제 #3
0
def get_exchange_time_frames(exchange_id):
    try:
        exchange_manager = trading_api.get_exchange_manager_from_exchange_id(
            exchange_id)
        return trading_api.get_watched_timeframes(
            exchange_manager), trading_api.get_exchange_name(exchange_manager)
    except KeyError:
        return [], ""
예제 #4
0
    def _get_exchanges_report(self, reference_market, trading_mode):
        SYMBOL_REPORT = "symbol_report"
        BOT_REPORT = "bot_report"
        CHART_IDENTIFIERS = "chart_identifiers"
        ERRORS_COUNT = "errors_count"
        report = {
            SYMBOL_REPORT: [],
            BOT_REPORT: {},
            CHART_IDENTIFIERS: [],
            ERRORS_COUNT: logging.get_backtesting_errors_count()
        }
        profitabilities = {}
        market_average_profitabilities = {}
        starting_portfolios = {}
        end_portfolios = {}
        for exchange_id in self.octobot_backtesting.exchange_manager_ids:
            exchange_manager = trading_api.get_exchange_manager_from_exchange_id(
                exchange_id)
            _, profitability, _, market_average_profitability, _ = trading_api.get_profitability_stats(
                exchange_manager)
            min_timeframe = time_frame_manager.find_min_time_frame(
                trading_api.get_watched_timeframes(exchange_manager))
            exchange_name = trading_api.get_exchange_name(exchange_manager)
            for symbol in self.symbols_to_create_exchange_classes[
                    exchange_name]:
                market_delta = self._get_market_delta(symbol, exchange_manager,
                                                      min_timeframe)
                report[SYMBOL_REPORT].append({symbol: market_delta * 100})
                report[CHART_IDENTIFIERS].append({
                    "symbol":
                    symbol,
                    "exchange_id":
                    exchange_id,
                    "exchange_name":
                    exchange_name,
                    "time_frame":
                    min_timeframe.value
                })
            profitabilities[exchange_name] = profitability
            market_average_profitabilities[
                exchange_name] = market_average_profitability
            starting_portfolios[
                exchange_name] = trading_api.get_origin_portfolio(
                    exchange_manager)
            end_portfolios[exchange_name] = trading_api.get_portfolio(
                exchange_manager)

        report[BOT_REPORT] = {
            "profitability": profitabilities,
            "market_average_profitability": market_average_profitabilities,
            "reference_market": reference_market,
            "end_portfolio": end_portfolios,
            "starting_portfolio": starting_portfolios,
            "trading_mode": trading_mode
        }
        return report
 async def _subscribe_exchange_id_mark_price(self, exchange_id):
     await exchanges_channel.get_chan(trading_constants.MARK_PRICE_CHANNEL,
                                      exchange_id).new_consumer(
                                          self._mark_price_callback,
                                          symbol=self.trading_mode.symbol)
     registered_exchange_name = trading_api.get_exchange_name(
         trading_api.get_exchange_manager_from_exchange_id(exchange_id))
     self.logger.info(
         f"Arbitrage trading for {self.trading_mode.symbol} on {self.exchange_name}: registered "
         f"{registered_exchange_name} exchange as price data feed reference to identify arbitrage opportunities."
     )
예제 #6
0
 async def _order_notification_callback(self, exchange, exchange_id, cryptocurrency, symbol, order,
                                        is_new, is_from_bot):
     exchange_manager = trading_api.get_exchange_manager_from_exchange_id(exchange_id)
     # Do not notify on existing pre-start orders
     if is_from_bot and not trading_api.get_is_backtesting(exchange_manager):
         order_identifier = f"{exchange}_{order[trading_enums.ExchangeConstantsOrderColumns.ID.value]}"
         # find the last notification for this order if any
         linked_notification = self.previous_notifications_by_identifier[order_identifier] \
             if order_identifier in self.previous_notifications_by_identifier else None
         await self._handle_order_notification(order, linked_notification, order_identifier,
                                               exchange_manager, exchange)
예제 #7
0
    def log_report(self):
        self.logger.info(" **** Backtesting report ****")
        for exchange_id in self.octobot_backtesting.exchange_manager_ids:
            exchange_manager = trading_api.get_exchange_manager_from_exchange_id(exchange_id)
            exchange_name = trading_api.get_exchange_name(exchange_manager)
            self.logger.info(f" ========= Trades on {exchange_name} =========")
            self._log_trades_history(exchange_manager, exchange_name)

            self.logger.info(f" ========= Prices evolution on {exchange_name} =========")
            min_timeframe = time_frame_manager.find_min_time_frame(trading_api.get_watched_timeframes(exchange_manager))
            for symbol in self.symbols_to_create_exchange_classes[exchange_name]:
                self._log_symbol_report(symbol, exchange_manager, min_timeframe)

            self.logger.info(" ========= Octobot end state =========")
            self._log_global_report(exchange_manager)
예제 #8
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