def start(self, in_background: bool = False, **kwargs) -> None: """Start the bot. `**kwargs` are passed to `telegram.ext.updater.Updater.start_polling` and override settings under `messaging.telegram` in `vectorbt._settings.settings`.""" from vectorbt._settings import settings telegram_cfg = settings['messaging']['telegram'] # Resolve kwargs default_kwargs = dict() passed_kwargs = dict() for k in get_func_kwargs(self.updater.start_polling): if k in telegram_cfg: default_kwargs[k] = telegram_cfg[k] if k in kwargs: passed_kwargs[k] = kwargs.pop(k) polling_kwargs = merge_dicts(default_kwargs, passed_kwargs) # Start the Bot logger.info("Running bot %s", str(self.updater.bot.get_me().username)) self.updater.start_polling(**polling_kwargs) self.started_callback() if not in_background: # Run the bot until you press Ctrl-C or the process receives SIGINT, # SIGTERM or SIGABRT. This should be used most of the time, since # start_polling() is non-blocking and will stop the bot gracefully. self.updater.idle()
def __init__(self, giphy_kwargs: tp.KwargsLike = None, **kwargs) -> None: from vectorbt._settings import settings telegram_cfg = settings['messaging']['telegram'] giphy_cfg = settings['messaging']['giphy'] Configured.__init__(self, giphy_kwargs=giphy_kwargs, **kwargs) # Resolve kwargs giphy_kwargs = merge_dicts(giphy_cfg, giphy_kwargs) self.giphy_kwargs = giphy_kwargs default_kwargs = dict() passed_kwargs = dict() for k in get_func_kwargs(Updater): if k in telegram_cfg: default_kwargs[k] = telegram_cfg[k] if k in kwargs: passed_kwargs[k] = kwargs.pop(k) updater_kwargs = merge_dicts(default_kwargs, passed_kwargs) persistence = updater_kwargs.pop('persistence', None) if isinstance(persistence, str): persistence = PicklePersistence(persistence) defaults = updater_kwargs.pop('defaults', None) if isinstance(defaults, dict): defaults = Defaults(**defaults) # Create the (persistent) Updater and pass it your bot's token. logger.info("Initializing bot") self._updater = Updater(persistence=persistence, defaults=defaults, **updater_kwargs) # Get the dispatcher to register handlers self._dispatcher = self.updater.dispatcher # Register handlers self.dispatcher.add_handler(self.log_handler) self.dispatcher.add_handler( CommandHandler('start', self.start_callback)) self.dispatcher.add_handler(CommandHandler("help", self.help_callback)) for handler in self.custom_handlers: self.dispatcher.add_handler(handler) self.dispatcher.add_handler( MessageHandler(Filters.status_update.migrate, self.chat_migration_callback)) self.dispatcher.add_handler( MessageHandler(Filters.command, self.unknown_callback)) self.dispatcher.add_error_handler( self_decorator(self, self.__class__.error_callback)) # Set up data if 'chat_ids' not in self.dispatcher.bot_data: self.dispatcher.bot_data['chat_ids'] = [] else: logger.info("Loaded chat ids %s", str(self.dispatcher.bot_data['chat_ids']))
def download(cls, symbols, client=None, **kwargs): """Override `vectorbt.data.base.Data.download` to instantiate a Binance client.""" from binance.client import Client from vectorbt import settings client_kwargs = dict() for k in get_func_kwargs(Client): if k in kwargs: client_kwargs[k] = kwargs.pop(k) client_kwargs = merge_dicts(settings.data['binance'], client_kwargs) if client is None: client = Client(**client_kwargs) return super(BinanceData, cls).download(symbols, client=client, **kwargs)
def download(cls: tp.Type[BinanceDataT], symbols: tp.Labels, client: tp.Optional["ClientT"] = None, **kwargs) -> BinanceDataT: """Override `vectorbt.data.base.Data.download` to instantiate a Binance client.""" from binance.client import Client from vectorbt._settings import settings binance_cfg = settings['data']['binance'] client_kwargs = dict() for k in get_func_kwargs(Client): if k in kwargs: client_kwargs[k] = kwargs.pop(k) client_kwargs = merge_dicts(binance_cfg, client_kwargs) if client is None: client = Client(**client_kwargs) return super(BinanceData, cls).download(symbols, client=client, **kwargs)
def download_symbol(cls, symbol: str, timeframe: str = '1d', start: tp.DatetimeLike = 0, end: tp.DatetimeLike = 'now UTC', adjustment: tp.Optional[str] = 'all', limit: int = 500, exchange: tp.Optional[str] = 'CBSE', **kwargs) -> tp.Frame: """Download the symbol. Args: symbol (str): Symbol. timeframe (str): Timeframe of data. Must be integer multiple of 'm' (minute), 'h' (hour) or 'd' (day). i.e. '15m'. See https://alpaca.markets/data. !!! note Data from the latest 15 minutes is not available with a free data plan. start (any): Start datetime. See `vectorbt.utils.datetime_.to_tzaware_datetime`. end (any): End datetime. See `vectorbt.utils.datetime_.to_tzaware_datetime`. adjustment (str): Specifies the corporate action adjustment for the stocks. Allowed are `raw`, `split`, `dividend` or `all`. limit (int): The maximum number of returned items. exchange (str): For crypto symbols. Which exchange you wish to retrieve data from. Allowed are `FTX`, `ERSX`, `CBSE` For defaults, see `data.alpaca` in `vectorbt._settings.settings`. """ from vectorbt._settings import settings from alpaca_trade_api.rest import TimeFrameUnit, TimeFrame, REST alpaca_cfg = settings['data']['alpaca'] client_kwargs = dict() for k in get_func_kwargs(REST): if k in kwargs: client_kwargs[k] = kwargs.pop(k) client_kwargs = merge_dicts(alpaca_cfg, client_kwargs) client = REST(**client_kwargs) _timeframe_units = {'d': TimeFrameUnit.Day, 'h': TimeFrameUnit.Hour, 'm': TimeFrameUnit.Minute} if len(timeframe) < 2: raise ValueError("invalid timeframe") amount_str = timeframe[:-1] unit_str = timeframe[-1] if not amount_str.isnumeric() or unit_str not in _timeframe_units: raise ValueError("invalid timeframe") amount = int(amount_str) unit = _timeframe_units[unit_str] _timeframe = TimeFrame(amount, unit) start_ts = to_tzaware_datetime(start, tz=get_utc_tz()).isoformat() end_ts = to_tzaware_datetime(end, tz=get_utc_tz()).isoformat() def _is_crypto_symbol(symbol): return len(symbol) == 6 and "USD" in symbol if _is_crypto_symbol(symbol): df = client.get_crypto_bars( symbol=symbol, timeframe=_timeframe, start=start_ts, end=end_ts, limit=limit, exchanges=exchange ).df else: df = client.get_bars( symbol=symbol, timeframe=_timeframe, start=start_ts, end=end_ts, adjustment=adjustment, limit=limit ).df # filter for OHLCV # remove extra columns df.drop(['trade_count', 'vwap'], axis=1, errors='ignore', inplace=True) # capitalize df.rename(columns={ 'open': 'Open', 'high': 'High', 'low': 'Low', 'close': 'Close', 'volume': 'Volume', 'exchange': 'Exchange' }, inplace=True) df['Open'] = df['Open'].astype(float) df['High'] = df['High'].astype(float) df['Low'] = df['Low'].astype(float) df['Close'] = df['Close'].astype(float) df['Volume'] = df['Volume'].astype(float) return df