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.")
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}."
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)
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)
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." )
def test_convert_small_interval(interval: str, expected: str): assert convert_small_interval( interval ) == expected, f"Expected converted interval to be: {expected}."