Exemple #1
0
    def execute(self, epoch_s: float, register: SymbolDayRegister) -> None:

        for _ in range(self.N_ACTIONS):
            action = random.randint(0, 1)

            # buy
            if action == 0:
                symbols = list(register.keys())
                symbol = random.choice(symbols)
                price_per_share = register.get_close(symbol, epoch_s)
                if price_per_share is None:
                    continue
                if self.cash >= self.TRADE_SIZE:
                    shares = self.TRADE_SIZE / price_per_share
                    self.buy(symbol, price_per_share, shares)

            # sell
            if action == 1:
                symbols = list(self.holdings.keys())
                if len(symbols) == 0:
                    continue
                symbol = random.choice(symbols)
                price_per_share = register.get_close(symbol, epoch_s)
                if price_per_share is None:
                    continue
                shares = self.holdings[symbol]
                self.sell(symbol, price_per_share, shares)
Exemple #2
0
    def determine_buys(self, epoch_s: float,
                       register: SymbolDayRegister) -> List[str]:
        """
        Apply rules that trigger buy order
        """
        stocks = list(register.keys())
        random.shuffle(stocks)
        to_buy = list()
        for stock in stocks:

            buy_flag = True
            prices = [None] * (self.n_crash + 1)

            for i in range(self.n_crash):

                close_today = register.get_close(stock, epoch_s, -i)
                if close_today is None:
                    buy_flag = False
                    break

                close_yesterday = register.get_close(stock, epoch_s, -i - 1)
                if close_yesterday is None:
                    buy_flag = False
                    break

                gain = 100 * (close_today / close_yesterday - 1)
                if gain > self.gain_crash:
                    buy_flag = False
                    break

                prices[i] = close_today
                prices[i + 1] = close_yesterday

            if buy_flag:
                to_buy.append(stock)
                date = IntuitiveDateConverter.to_day_str(epoch_s)
                print(
                    f'Identified BUY flag: {date} : {stock.to_str()} : {prices}'
                )
                if self.logger is not None:
                    message = f'Identified BUY flag: {date} : {stock.to_str()} : {prices}'
                    self.logger.log_message(message)

            if len(to_buy) >= self.n_buy_per_day:
                break

        return to_buy