Ejemplo n.º 1
0
    def __init__(self, name: str = None, stream: Stream = None, socket_ip: str = None, socket_port: int = None) -> None:
        """
        Init the api server, and init the super class RPC
        """
        if name is None:
            raise Exception("WebSocketServer needs distinguishable name for logging purposes")
        
        self.name = '{}.{}'.format(__name__, name)
        self.logger = setup_logger(name=self.name)
        self.logger.info('Initializing %s component.', self.name)

        if stream is None:
            raise Exception("WebSocketServer needs distinguishable stream for operating purposes")
        self.stream = stream
        
        if socket_ip is None:
            self.logger.info("WebSocketServer got no `socket_ip` defaulting to {}".format(self._socket_ip))
        else:
            self._socket_ip = socket_ip

        if socket_port is None:
            self.logger.info("WebSocketServer got no `socket_port` defaulting to {}".format(self._socket_port))
        else:
            self._socket_port = socket_port

        self._socket_base_url = '{}:{}'.format(self._socket_ip, self._socket_port)

        self.logger.info("Will serve WebSocket at %s", self._socket_base_url)

        self.connections = []
        self.read_queue = Queue()
        self.write_queue = Queue()
        self.connections = set()
        self.connection_handler = ThreadPoolExecutor(4)
Ejemplo n.º 2
0
    def __init__(self, name: str = None, rest_ip: str = None, rest_port: int = None) -> None:
        """
        Init the api server, and init the super class RPC
        """
        if name is None:
            raise Exception("APIServer needs distinguishable name for logging purposes")
        
        self.name = '{}.{}'.format(__name__, name)
        self.logger = setup_logger(name=self.name)
        self.logger.info('Initializing %s component.', self.name)

        self.app = Flask(__name__)
        CORS(self.app)

        self.app.config['SECRET_KEY'] = "s!"#$123%!%&!&e!"123424#34534$%!5345%&!&c345!"#234$%!1342334224%&!&et!242!"#$%342!%&!&"

        if rest_ip is None:
            self.logger.info('APIServer got no `rest_ip` defaulting to {}'.format(self._rest_ip))
        else:
            self._rest_ip = rest_ip

        if rest_port is None:
            self.logger.info('APIServer got no `rest_port` defaulting to {}'.format(self._rest_port))
        else:
            self._rest_port = rest_port

        self._rest_base_url = '{}:{}'.format(self._rest_ip, self._rest_port)

        self.logger.info("Will serve API at %s", self._rest_base_url)

        # Register base application handling
        self.register_base_rest_rpc_urls()
Ejemplo n.º 3
0
    def __init__(self, data: pd.DataFrame) -> None:

        if not isinstance(data, pd.DataFrame):
            raise ValueError("Data must be a pandas dataframe")

        self.logger = setup_logger(name=self._name)
        # rd stands for relativedelta
        rd_call: Callable = None
        rd_args: dict = None
        rd_call, rd_args = get_delta_callable_for_tf(tf=self.tf)
        self.__verbosity = settings.FORWARDTESTING_VERBOSITY
        self.__analysis_throttle = rd_call(**rd_args)
        self.__next_candle = (dt.fromtimestamp(self.yesterday.time) +
                              self.__analysis_throttle)
        self.__next_analysis = (self.__next_candle + self.__analysis_throttle)
        self.__start_time = dt.now()
        self.logger.info(
            'Forward testing session started for: {}-{} using {} at {} '.
            format(
                self.pair,
                self.tf,
                self.logic.__name__,
                self.__start_time,
            ), )
        self.logger.info('next analysis {}'.format(self.__next_analysis))
Ejemplo n.º 4
0
def main(sysargv: List[str] = None) -> None:
    """
    This function will initiate the bridge.
    :return: None
    """
    return_code: Any = 1

    logger = setup_logger(name='{}.v{}'.format(__title__, __version__))
    logger.info('Launching the bridge environment..\n' +
                '    __         _     __         ' + '\n' +
                '   / /_  _____(_)___/ /___ ____ ' + '\n' +
                '  / __ \/ ___/ / __  / __ `/ _ \\' + '\n' +
                ' / /_/ / /  / / /_/ / /_/ /  __/' + '\n' +
                '/_.___/_/  /_/\__,_/\__, /\___/ ' + '\n' +
                '                /____/   ₀.₀.₁' + '\n')

    bridge_config: BridgeConfig = None
    bridge: BridgeIntegrator = None

    bridge_config: BridgeConfig = parse_arguments(logger=logger,
                                                  sysargv=sysargv)

    if bridge_config is not None:
        bridge = BridgeIntegrator(config=bridge_config)
    else:
        logger.warning('WARNING: No bridge config set, exiting.')
        return 0
    try:
        bridge.run()
    except KeyboardInterrupt:
        logger.info('SIGINT received, aborting ...')
        return_code = 0

    return return_code
Ejemplo n.º 5
0
    def __init__(self,
                 config: Dict[str, Any] = {},
                 logger: logging.Logger = None,
                 verbose: bool = False):
        """
        Initialize the CryptoCompare API object with a Config dict.
        """

        if not logger:
            self.logger = setup_logger(name=__name__)
        else:
            self.logger = logger

        _api_key: str = config.get('apikey', None)
        self.comparison_symbol = config.get('comparison_symbol', 'USD')
        self.exchange = config.get('exchange', None)
        self._verbose = verbose

        if _api_key:
            self._header = {
                'Authorization': 'Apikey ' + _api_key,
            }
        elif s.CCAPI_KEY:
            self._header = {
                'Authorization': 'Apikey ' + s.CCAPI_KEY,
            }

        if self._verbose:
            self.logger.info(
                'Initializing CryptoCompareAPI module with key {}.'.format(
                    _api_key))
Ejemplo n.º 6
0
    def __init__(self, name: str = None, socket_ip: str = None, socket_port: int = None) -> None:
        """
        Init the api server, and init the super class RPC
        """
        if name is None:
            raise Exception("SocketServer needs distinguishable name for logging purposes")
        
        self.name = '{}.{}'.format(__name__, name)
        self.logger = setup_logger(name=self.name)
        self.logger.info('Initializing %s component.', self.name)

        self.app = Flask(__name__)
        CORS(self.app)

        self.app.config['SECRET_KEY'] = "s!"#$123%!%&!&e!"123424#34534$%!5345%&!&c345!"#234$%!1342334224%&!&et!242!"#$%342!%&!&"
        self.socket = SocketIO(self.app)

        if socket_ip is None:
            self.logger.info("SocketServer got no `socket_ip` defaulting to {}".format(self._socket_ip))
        else:
            self._socket_ip = socket_ip

        if socket_port is None:
            self.logger.info("SocketServer got no `socket_port` defaulting to {}".format(self._socket_port))
        else:
            self._socket_port = socket_port

        self._socket_base_url = '{}:{}'.format(self._socket_ip, self._socket_port)

        self.logger.info("Will serve Socket at %s", self._socket_base_url)
Ejemplo n.º 7
0
    def __init__(self, item: dict = None) -> None:
        """ Initialize. """

        self.logger = setup_logger(name=__name__)

        self.read_queue = Queue()

        if item is not None:
            self.logger.info('Starting analysis of {} - {}'.format(
                item.get('pair'), item.get('timeframe')))
            self.run(item=item)
Ejemplo n.º 8
0
    def __init__(self):
        """Initialize the wallet module."""
        self.logger = setup_logger(name=__name__)
        self.logger.info('Initializing %s module.', __name__)

        self.wallet_balances = self._setup_wallet()

        for item in self.wallet_balances:
            currency = item.get('currency')
            if currency and str(currency) == 'BTC':
                self.logger.info('Initial wallet balance for %s: %.8g', currency, item.get('value'))
            else:
                self.logger.info('Initial wallet balance for %s: %d', currency, item.get('value'))
Ejemplo n.º 9
0
    def __init__(self, name: str = None, module_name: str = None) -> None:
        """Initialize the playground's simulation integrator."""

        if name is None:
            raise Exception("Integrator class needs `name` param")

        if module_name is None:
            raise Exception("Integrator class needs `module_name` param")

        self.name = '{}.{}'.format(__name__, name)
        self.logger = setup_logger(name=self.name)
        self.logger.info('Initializing %s component.', self.name)

        self.module_name = module_name
Ejemplo n.º 10
0
    def __init__(self, name: str = None):
        """
        Simply initiate the BridgeConfig.
        """

        if name is None:
            raise Exception(
                "Metrics class needs `name` param to designate itself")

        self.name = '{}.{}'.format(__name__, name)
        logger = setup_logger(name=self.name)

        logger.info('Initializing %s component.', self.name)

        # Set all metrics to 0
        self.messages_read = 0
        self.messages_delivered = 0
Ejemplo n.º 11
0
    def __init__(self) -> None:
        """
        Initialize the Warehouse object with the settings.
        """
        self.logger = setup_logger(name=__name__)
        self.logger.info('Initializing %s module.', __name__)

        self.___read_lock = threading.RLock()
        self.___update_lock = threading.RLock()

        self._parse_settings()
        self._parse_running_pairs()

        self.missing_sets = self._check_missing_datasets()

        if self.missing_sets:
            self._build_missing_datasets()

        self.outdated_sets = self._check_outdated_datasets()

        if len(self.outdated_sets) == 0:
            self.logger.info('Warehouse updated.')
            self.set_updated()
        else:
            self.logger.info('Datasets outdated: {}'.format(
                self.outdated_sets))
            self.update_datasets()

        if s.FORCE_STARTUP_ANALYSIS:
            self.logger.info('Forcing startup analysis.')
            self.analyse_datasets()

        self.missing_analysed_sets = self._check_missing_datasets(
            analysed=True)

        if len(self.missing_analysed_sets) == 0:
            self.logger.info('Warehouse analysed.')
            self.set_analysed()
        else:
            self.logger.info('Datasets outdated: {}'.format(
                self.outdated_sets))
            self.analyse_datasets(datasets=self.missing_analysed_sets)
            # Only analyse the ones we detected earlier for less startup time

        self.set_ready()
Ejemplo n.º 12
0
    def __init__(self,
                 on_message_func: Callable = None,
                 on_connected_func: Callable = None,
                 get_data_func: Callable = None,
                 name: str = None,
                 url: str = None,
                 timeout: int = None) -> None:

        self.name = '{}.{}'.format(__name__, name)
        self.logger = setup_logger(name=self.name)
        self.logger.info('Initializing %s component.', self.name)
        self.url = url
        self.on_connected_func = on_connected_func
        self.on_message_func = on_message_func
        self.get_data_func = get_data_func
        PeriodicCallback(self.keep_alive, 20000).start()
        self.timeout = timeout
        self.ioloop = IOLoop.instance()
        self.ws = None
Ejemplo n.º 13
0
def main(sysargv: List[str] = None) -> None:
    """
    This function will initiate the playground.
    :return: None
    """
    return_code: Any = 1

    logger = setup_logger(name='{}.v{}'.format(__title__, __version__))
    logger.info('Launching playground environment..\n'  +
        '           __                                             __\n' +
        '    ____  / /___ ___  ______ __________  __  ______  ____/ /\n' +
        '   / __ \/ / __ `/ / / / __ `/ ___/ __ \/ / / / __ \/ __  / \n' +
        '  / /_/ / / /_/ / /_/ / /_/ / /  / /_/ / /_/ / / / / /_/ /  \n' +
        ' / .___/_/\__,_/\__, /\__, /_/   \____/\__,_/_/ /_/\__,_/   \n' +
        '/_/            /____//____/                         ₀.₁.₁   \n'
    )

    pg_config: PlaygroundConfig = None
    pg: PlaygroundIntegrator = None
    pg_config: PlaygroundConfig = parse_arguments(logger=logger, sysargv=sysargv)

    if pg_config is not None:
        pg = PlaygroundIntegrator(config=pg_config)
    else:
        logger.warning('WARNING: No playground config set, running with deprecated default settings.')
        pg = PlaygroundIntegrator()
    try:
        pg.run()
    except KeyboardInterrupt:
        logger.info('SIGINT received, aborting ...')
        return_code = 0
        """
        for ft in worker.forwardtests:
            if len(ft.data) != 0:
                ft.print_results()
                #ft.chart()
        """
        # TODO: stuff related with livetrading
    
    return return_code
Ejemplo n.º 14
0
    def __init__(
        self,
        name: str = None,
        market_pair: MarketPair = None,
        timeframe: str = None,
        desired_start: dt.datetime = None,
        desired_finish: dt.datetime = None,
        work_func: Callable = None,
        throttle_func: Callable = None,
    ) -> None:
        """
        Initialize the worker.
        """
        if name is None:
            raise Exception(
                "Operation class needs `name` param to designate itself")

        if market_pair is None:
            raise Exception(
                "Operation class needs `market_pair` param to work on")

        if timeframe is None:
            raise Exception(
                "Operation class needs `timeframe` param to work on")

        self.name = '{}.{}-{}-{}'.format(__name__, name, market_pair,
                                         timeframe)
        self.logger = setup_logger(name=self.name)
        self.logger.info('Initializing %s operation.', self.name)

        if desired_start is None:
            raise Exception(
                "Operation class needs `desired_start` param to work on")

        if desired_finish is None:
            raise Exception(
                "Operation class needs `desired_finish` param to work on")

        self.pair = market_pair
Ejemplo n.º 15
0
    def __init__(self,
                 name: str = None,
                 work_func: Callable = None,
                 throttle_func: Callable = None,
                 daemon: bool = None) -> None:
        """
        Initialize the worker.
        """
        self.state = State.STARTING

        if name is None:
            raise Exception("Worker class needs `name` param")

        self.name = '{}.{}'.format(__name__, name)
        self.logger = setup_logger(name=self.name)
        self.logger.info('Initializing %s component.', self.name)

        if throttle_func is None:
            self.logger.info(
                'Worker class got no `throttle_func` param, worker will not sleep between work cycles.'
            )
        else:
            self._throttlefunc = throttle_func

        if work_func is None:
            raise Exception("Worker class needs `work_func` param to work")

        self._workfunc = work_func

        self.logger.info('Worker is ready.')
        self.state = State.READY

        if daemon != None:
            self._daemon = daemon

        if self._daemon == True:
            self.logger.info('Worker is starting as daemon.')
            self.Start()
Ejemplo n.º 16
0
    def __init__(self, config: BridgeConfig = None) -> None:
        """Initialize the bridge."""

        self.name = '{}.{}-{}.{}'.format(__name__, config.name, config.mode,
                                         __version__)
        self.logger = setup_logger(name=self.name)
        self.logger.info('Initializing %s component.', self.name)

        if config is None:
            raise Exception('Bridge needs param `config` to setup')

        super().__init__(
            name=self.name,
            socket_ip=config.socket_ip,
            socket_port=config.socket_port,
            open_func=lambda: self.client_connected,
            on_close_func=lambda: self.on_client_disconnected,
            on_message_func=lambda: self.on_message_received,
            check_origin_func=lambda: self.check_origin_headers,
            url_func=lambda: Bridge.bridge_urls(),
        )

        self.flows = config.flows
        self.metrics = BridgeMetrics()
Ejemplo n.º 17
0
    def __init__(self, config: Dict = None) -> None:
        """Initialize the playground's simulation integrator."""

        self.logger = setup_logger(name='{}.{}'.format(__title__, __name__))
        self.logger.info("Creating the SimulationIntegrator...")
Ejemplo n.º 18
0
__title__ = "playground"
__author__ = "murlux"
__copyright__ = "Copyright 2019, " + __author__
__credits__ = (__author__, )
__license__ = "MIT"
__email__ = "*****@*****.**"

from typing import Dict, Any, Optional
from playground.util import setup_logger

logger = setup_logger(name=__name__)


class Stream:
    """
    This class represents a Stream of data within the system
    """

    # This is the name of the stream
    module_name: str = None
    name: str = None
    extra: Dict[str, Any] = None

    def __init__(self,
                 name: str = None,
                 module_name: str = None,
                 extra: Dict[str, Any] = None) -> None:
        """
        Init from json

        :param config: json dict of the class
Ejemplo n.º 19
0
    def __init__(
        self,
        open_func: Callable = None,
        on_close_func: Callable = None,
        on_message_func: Callable = None,
        check_origin_func: Callable = None,
        url_func: Callable = None,
        name: str = None,
        stream: Stream = None,
        socket_ip: str = None,
        socket_port: int = None,
    ) -> None:
        """
        Init the socket server and it's internals. Server provided by Tornado.
        """
        if name is None:
            raise Exception(
                "WebSocketServer needs distinguishable name for logging purposes"
            )

        self.name = '{}.{}'.format(__name__, name)
        self.logger = setup_logger(name=self.name)
        self.logger.info('Initializing %s component.', self.name)

        if stream is not None:
            self.stream = stream

        if open_func is None:
            self.logger.error(
                "WebSocketServer got no `open_func` defaulting to internal {}".
                format(self.__open_func))
        else:
            self.open_func = open_func

        if on_close_func is None:
            self.logger.error(
                "WebSocketServer got no `on_close_func` defaulting to internal {}"
                .format(self.__on_close_func))
        else:
            self.on_close_func = on_close_func

        if on_message_func is None:
            self.logger.error(
                "WebSocketServer got no `on_message_func` defaulting to internal {}"
                .format(self.__on_message_func))
        else:
            self.on_message_func = on_message_func

        if check_origin_func is None:
            self.logger.error(
                "WebSocketServer got no `check_origin_func` defaulting to internal {}"
                .format(self.__check_origin_func))
        else:
            self.check_origin_func = check_origin_func

        if url_func is None:
            self.logger.error(
                "WebSocketServer got no `url_func` defaulting to internal {}".
                format(self.__url_func))
        else:
            self.url_func = url_func

        if socket_ip is None:
            self.logger.info(
                "WebSocketServer got no `socket_ip` defaulting to {}".format(
                    self._socket_ip))
        else:
            self._socket_ip = socket_ip

        if socket_port is None:
            self.logger.info(
                "WebSocketServer got no `socket_port` defaulting to {}".format(
                    self._socket_port))
        else:
            self._socket_port = socket_port

        self._socket_base_url = '{}:{}'.format(self._socket_ip,
                                               self._socket_port)

        self.logger.info("Will serve WebSocket at %s", self._socket_base_url)

        self.read_queue = Queue()
        self.write_queue = Queue()
        self.connections = set()
Ejemplo n.º 20
0
    def __init__(
        self,
        data,
        yesterday,
        initial_capital,
        pair,
        tf,
        logic,
    ):
        """Initate the ForwardTestSession.
        :param data: An HLOCV+ pandas dataframe with a datetime index
        :type data: pandas.DataFrame
        :param yesterday: An HLOCV+ pandas dataframe with a datetime index
        :type yesterday: pandas.DataFrame
        :param initial_capital: Starting capital to fund account
        :type initial_capital: float
        :param pair: Operating market pair
        :type pair: MarketPair obj
        :param tf: Operating timeframe
        :type tf: str
        :param logic: A function that will be applied to each lookback period of the data
        :type logic: function
        :return: A forwardtesting simulation
        :rtype: ForwardTestSession
        """
        if not isinstance(data, pd.DataFrame):
            raise ValueError("Data must be a pandas dataframe")

        missing = set(['high', 'low', 'open', 'close', 'volume']) - set(
            data.columns)
        if len(missing) > 0:
            msg = "Missing {0} column(s), dataframe must be HLOCV+".format(
                list(missing))
            warnings.warn(msg)

        self.tracker = []
        self.backdata = data.copy()
        self.yesterday = yesterday
        self.today = None
        self.backdata = self.backdata.set_index('datetime').sort_index(
            inplace=True, ascending=False)
        self.account = Account(initial_capital=initial_capital,
                               pair=pair,
                               tf=tf)
        self.logic = logic
        self.pair = pair
        self.tf = tf
        self._simple_tts = '{} - {}\n\n'.format(
            self.pair,
            self.tf,
            logic.__name__,
        )
        self._tts = __name__ + '\n\n{} - {}\n :: {}\n\n'.format(
            self.pair,
            self.tf,
            logic.__name__,
        )
        self._name = __name__ + '. {} - {} :: {} :: {}'.format(
            self.pair,
            self.tf,
            logic.__name__,
            str(dt.now().date()),
        ).replace(' ', '')
        self.logger = setup_logger(name=self._name)
        # rd stands for relativedelta
        rd_call: Callable = None
        rd_args: dict = None
        rd_call, rd_args = get_delta_callable_for_tf(tf=self.tf)
        self.__verbosity = settings.FORWARDTESTING_VERBOSITY
        self.__analysis_throttle = rd_call(**rd_args)
        self.__next_candle = (dt.fromtimestamp(self.yesterday.time) +
                              self.__analysis_throttle)
        self.__next_analysis = (self.__next_candle + self.__analysis_throttle)
        self.__start_time = dt.now()
        self.logger.info(
            'Forwardtesting session started for: {}-{} using {} at {} '.format(
                self.pair,
                self.tf,
                self.logic.__name__,
                self.__start_time,
            ), )
        self.logger.info('next analysis {}'.format(self.__next_analysis))