Ejemplo n.º 1
0
    def initialize_lower_interval_trading(self, caller, interval: str):
        """
        Initializes lower interval trading data object.
        :param caller: Caller that determines whether lower interval is for simulation or live bot.
        :param interval: Current interval for simulation or live bot.
        """
        sortedIntervals = ('1m', '3m', '5m', '15m', '30m', '1h', '2h', '12h', '4h', '6h', '8h', '1d', '3d')
        gui = self.gui
        symbol = self.trader.symbol

        if interval != '1m':
            lowerInterval = sortedIntervals[sortedIntervals.index(interval) - 1]
            intervalString = helpers.convert_small_interval(lowerInterval)
            self.lowerIntervalNotification = True
            self.signals.activity.emit(caller, f'Retrieving {symbol} data for {intervalString.lower()} intervals...')

            if caller == LIVE:
                gui.lowerIntervalData = Data(interval=lowerInterval, symbol=symbol, updateData=False)
                gui.lowerIntervalData.custom_get_new_data(progress_callback=self.signals.progress, removeFirst=True,
                                                          caller=LIVE)
            elif caller == SIMULATION:
                gui.simulationLowerIntervalData = Data(interval=lowerInterval, symbol=symbol, updateData=False)
                gui.simulationLowerIntervalData.custom_get_new_data(progress_callback=self.signals.progress,
                                                                    removeFirst=True, caller=SIMULATION)
            else:
                raise TypeError("Invalid type of caller specified.")

            lowerData = gui.lowerIntervalData if caller == LIVE else gui.simulationLowerIntervalData
            if not lowerData or not lowerData.downloadCompleted:
                raise RuntimeError("Lower interval download failed.")
            self.signals.activity.emit(caller, "Retrieved lower interval data successfully.")
        else:
            self.signals.activity.emit(caller, "There is no lower interval than 1 minute intervals.")
Ejemplo n.º 2
0
def test_convert_small_interval(interval: str, expected: str):
    """
    Test conversions from small interval to big interval.
    :param interval: Small interval.
    :param expected: Converted big interval.
    """
    assert convert_small_interval(
        interval
    ) == expected, f"Expected converted interval to be: {expected}."
Ejemplo n.º 3
0
    def __init__(self,
                 startingBalance: float,
                 data: list,
                 strategies: list,
                 strategyInterval: Union[str, None] = None,
                 symbol: str = None,
                 marginEnabled: bool = True,
                 startDate: datetime = None,
                 endDate: datetime = None,
                 precision: int = 4,
                 outputTrades: bool = True):
        super().__init__(symbol=symbol,
                         precision=precision,
                         startingBalance=startingBalance)
        self.commissionsPaid = 0
        self.marginEnabled = marginEnabled
        self.outputTrades: bool = outputTrades  # Boolean that'll determine whether trades are outputted to file or not.

        convert_all_dates_to_datetime(data)
        self.data = data
        self.check_data()
        self.interval = self.get_interval()
        self.intervalMinutes = get_interval_minutes(self.interval)
        self.profit = 0

        self.startTime = None
        self.endTime = None
        self.inLongPosition = False
        self.inShortPosition = False
        self.currentPeriod = None
        self.minPeriod = 0
        self.pastActivity = [
        ]  # We'll add previous data here when hovering through graph in GUI.

        if len(strategyInterval.split()) == 1:
            strategyInterval = convert_small_interval(strategyInterval)

        self.strategyInterval = self.interval if strategyInterval is None else strategyInterval
        self.strategyIntervalMinutes = get_interval_minutes(
            self.strategyInterval)
        self.intervalGapMinutes = self.strategyIntervalMinutes - self.intervalMinutes
        self.intervalGapMultiplier = self.strategyIntervalMinutes // self.intervalMinutes
        if self.intervalMinutes > self.strategyIntervalMinutes:
            raise RuntimeError(
                "Your strategy interval can't be smaller than the data interval."
            )

        self.ema_dict = {}
        self.rsi_dictionary = {}
        set_up_strategies(self, strategies)

        self.startDateIndex = self.get_start_index(startDate)
        self.endDateIndex = self.get_end_index(endDate)
Ejemplo n.º 4
0
    def __init__(self,
                 startingBalance: float,
                 data: list,
                 strategies: list,
                 strategyInterval: Union[str, None] = None,
                 symbol: str = None,
                 marginEnabled: bool = True,
                 startDate: datetime = None,
                 endDate: datetime = None,
                 drawdownPercentage: int = 100,
                 precision: int = 4,
                 outputTrades: bool = True,
                 logger: Logger = None):
        super().__init__(symbol=symbol,
                         precision=precision,
                         startingBalance=startingBalance,
                         marginEnabled=marginEnabled)
        convert_all_dates_to_datetime(data)
        self.data = data
        self.check_data()
        self.outputTrades: bool = outputTrades  # Boolean that'll determine whether trades are outputted to file or not.
        self.interval = self.get_interval()
        self.intervalMinutes = get_interval_minutes(self.interval)
        self.pastActivity = [
        ]  # We'll add previous data here when hovering through graph in GUI.
        self.drawdownPercentageDecimal = drawdownPercentage / 100  # Percentage of loss at which bot exits backtest.
        self.optimizerRows = []
        self.logger = logger

        if len(strategyInterval.split()) == 1:
            strategyInterval = convert_small_interval(strategyInterval)

        self.allStrategies = get_strategies_dictionary(
            Strategy.__subclasses__())
        self.strategyInterval = self.interval if strategyInterval is None else strategyInterval
        self.strategyIntervalMinutes = get_interval_minutes(
            self.strategyInterval)
        self.intervalGapMinutes = self.strategyIntervalMinutes - self.intervalMinutes
        self.intervalGapMultiplier = self.strategyIntervalMinutes // self.intervalMinutes
        if self.intervalMinutes > self.strategyIntervalMinutes:
            raise RuntimeError(
                f"Your strategy interval ({self.strategyIntervalMinutes} minute(s)) can't be smaller "
                f"than the data interval ({self.intervalMinutes} minute(s)).")

        self.ema_dict = {}
        self.rsi_dictionary = {}
        self.setup_strategies(strategies)
        self.startDateIndex = self.get_start_index(startDate)
        self.endDateIndex = self.get_end_index(endDate)
Ejemplo n.º 5
0
    def change_strategy_interval(self, interval: str):
        """
        Changes strategy interval to the one provided.
        :param interval: Interval to update strategy interval with.
        """
        if len(interval.split()) == 1:
            interval = convert_small_interval(interval)

        self.strategyInterval = self.interval if interval is None else interval
        self.strategyIntervalMinutes = get_interval_minutes(
            self.strategyInterval)
        self.intervalGapMinutes = self.strategyIntervalMinutes - self.intervalMinutes
        self.intervalGapMultiplier = self.strategyIntervalMinutes // self.intervalMinutes
        if self.intervalMinutes > self.strategyIntervalMinutes:
            raise RuntimeError(
                "Your strategy interval can't be smaller than the data interval."
            )
Ejemplo n.º 6
0
def test_convert_small_interval(interval: str, expected: str):
    assert convert_small_interval(
        interval
    ) == expected, f"Expected converted interval to be: {expected}."