Пример #1
0
    def sell_signals(self):
        existing_orders = StockOrder.objects.filter(status=StockOrder.BOUGHT).values_list('stock_history_id', flat=True)
        stocks = StockHistory.objects.select_related('stock').filter(stock_id__in=existing_orders).order_by(
            'stock__symbol')
        stocks_count = stocks.count()
        if stocks_count == 0:
            logger.info("No data exists")
            return

        total_sell_signals = 0
        text = 'SELL @ {}\n\n'.format(self.today + timedelta(days=1))

        for stock in stocks:
            macd_result = Macd(stock_id=stock.stock_id, last_trade_date=self.today).get_histogram(days=1)
            if not bool(macd_result) or self.today not in macd_result:
                continue

            cur_histogram = macd_result.pop(self.today)['histogram']
            stock_history_obj = StockHistory.objects.get(stock_id=stock.stock_id, trade_date=self.today)

            if cur_histogram <= 0:
                total_sell_signals += 1
                profit = (100 / stock.close) * (stock_history_obj.close - stock.close)
                text += '{0}.\t{1}\t{2}\tRs.{3}\t{4:.2f}%\n'.format(total_sell_signals, stock.trade_date,
                                                                    stock.stock.symbol, stock_history_obj.close,
                                                                    profit)
                stock_order = StockOrder.objects.get(stock_history_id=stock.id)
                stock_order.sold_at = self.today
                stock_order.sold_price = stock_history_obj.close
                stock_order.save()
        if total_sell_signals > 0:
            send_via_telegram(text)
        logger.info("Sell signals updated in watch list: %d/%d" % (total_sell_signals, stocks_count))
Пример #2
0
    def buy_signals(self):
        existing_orders = StockOrder.objects.filter(
            status=StockOrder.BOUGHT).values_list('stock_history_id',
                                                  flat=True)
        stocks = StockHistory.objects.select_related('stock').filter(trade_date=self.today, total_traded_qty__gt=300000,
                                                                     close__gte=21). \
            annotate(day_change_percent=(100 / F('open') * (F('close') - F('open')))).filter(day_change_percent__lt=5,
                                                                                             day_change_percent__gt=0). \
            exclude(stock__symbol='LIQUIDBEES', id__in=existing_orders)
        stocks_count = stocks.count()

        if stocks_count == 0:
            logger.info("No data exists")
            return
        logger.info('Total eligible stocks: %d' % stocks_count)
        tot_buy_signals = 0
        text = 'BUY @ {}\n\n'.format(self.today + timedelta(days=1))

        for stock in stocks:
            cci_result = CommodityChannelIndex(
                stock_id=stock.stock_id,
                last_trade_date=self.today).get_data()

            if not bool(cci_result) or self.today not in cci_result:
                # If cci data is Null continue with next available stock
                logging.info("`{}` no CCI data available".format(
                    stock.stock.symbol))
                continue

            cci_result = list(cci_result.values())

            if len(cci_result) < 2:
                # To prevent the IPO stocks started traded on self.today
                logging.info("`{}` might be a IPO stock".format(
                    stock.stock.symbol))
                continue

            if self.is_valid_buy(stock_obj=stock, cci_data=cci_result):
                stock_history_obj = stocks.get(stock_id=stock.stock_id,
                                               trade_date=self.today)

                # Create a record in StockOrder table, default status would be BOUGHT
                StockOrder.objects.create(
                    stock_history_id=stock_history_obj.id)

                # Generate the text for the filtered buy signal stock to send via telegram
                tot_buy_signals += 1
                text += '{0}.\t{1}\tRs.{2}\n'.format(tot_buy_signals,
                                                     stock.stock.symbol,
                                                     stock.close)

        if tot_buy_signals > 0:
            send_via_telegram(text)
        logger.info("Buy signals updated in watch list: %d/%d" %
                    (tot_buy_signals, stocks_count))
Пример #3
0
    def buy_signals(self):
        """Filter stocks which are eligible for buy and send the signal via telegram"""
        existing_orders = StockOrder.objects.filter(
            status=StockOrder.BOUGHT).values_list('stock_history_id',
                                                  flat=True)
        stocks = StockHistory.objects.select_related('stock').filter(trade_date=self.today, total_traded_qty__gt=300000,
                                                                     close__gte=21). \
            annotate(day_change_percent=(100 / F('open') * (F('close') - F('open')))).filter(day_change_percent__lt=5,
                                                                                             day_change_percent__gt=0). \
            exclude(stock__symbol='LIQUIDBEES', id__in=existing_orders)
        stocks_count = stocks.count()

        if stocks_count == 0:
            logger.info("No data exists")
            return

        logger.info('Total eligible stocks: %d' % stocks_count)
        tot_buy_signals = 0
        text = 'BUY @ {}\n\n'.format(self.today + timedelta(days=1))

        for stock in stocks:
            macd_result = Macd(stock_id=stock.stock_id,
                               last_trade_date=self.today).get_histogram()
            if not bool(macd_result) or self.today not in macd_result:
                continue
            histograms = list(
                map(lambda x: x['histogram'], macd_result.values()))

            if len(histograms) < 2:
                # To prevent the IPO stocks started traded on self.today
                continue

            if self.is_valid_buy(stock_obj=stock, histograms=histograms):
                stock_history_obj = stocks.get(stock_id=stock.stock_id,
                                               trade_date=self.today)

                # Create a record in StockOrder table, default status would be BOUGHT
                StockOrder.objects.create(
                    stock_history_id=stock_history_obj.id)

                # Generate the text for the filtered buy signal stock to send via telegram
                tot_buy_signals += 1
                text += '{0}.\t{1}\tRs.{2}\n'.format(tot_buy_signals,
                                                     stock.stock.symbol,
                                                     stock.close)

        if tot_buy_signals > 0:
            send_via_telegram(text)

        logger.info("Buy signals updated in watch list: %d/%d" %
                    (tot_buy_signals, stocks_count))
Пример #4
0
    def _trigger_monitor(self):
        stock_quotes = self._get_stock_quotes()
        for stock in stock_quotes:
            stock_symbol = stock['symbol'].replace('&amp;', '&')
            stock_order = StockOrder.objects.select_related('stock_history__stock', 'stock_history'). \
                filter(stock_history__stock__symbol=stock_symbol).last()

            avg_price = float(stock['averagePrice'].replace(',', ''))
            bought_price = stock_order.stock_history.close
            price_change, is_sell = self._stock_target(bought_price, avg_price)

            if is_sell:
                stock_order.status = StockOrder.SOLD
                stock_order.save(update_fields=['status'])
                text = 'Sell {} @ Rs. {} \n Bought @ {} Rs. {} \n Profit: {}%'.format(stock_symbol, avg_price,
                                                                                      stock_order.stock_history.trade_date,
                                                                                      bought_price,
                                                                                      price_change)
                send_via_telegram(text)
Пример #5
0
    def buy_signals(self):
        """Filter stocks which are eligible for buy and send the signal via telegram"""

        stocks = self.pre_filter_buy_stocks()

        stocks_count = stocks.count()

        if stocks_count == 0:
            logger.info("No data exists")
            return

        logger.info('Total eligible stocks: %d' % stocks_count)
        tot_buy_signals = 0
        text = 'BUY @ {}\n\n'.format(self.today + timedelta(days=1))

        for stock in stocks:
            macd_result = Macd(stock_id=stock.stock_id, last_trade_date=self.today).get_histogram()
            if not bool(macd_result) or self.today not in macd_result:
                continue
            histograms = list(map(lambda x: x['histogram'], macd_result.values()))

            if len(histograms) < 2:
                # To prevent the IPO stocks started traded on self.today
                continue

            if self.is_valid_buy(stock_obj=stock, histograms=histograms):
                stock_history_obj = stocks.get(stock_id=stock.stock_id, trade_date=self.today)

                # Create a record in StockOrder table, default status would be BOUGHT
                StockOrder.objects.create(stock_history_id=stock_history_obj.id)

                # Generate the text for the filtered buy signal stock to send via telegram
                tot_buy_signals += 1
                text += '{0}.\t{1}\tRs.{2}\n'.format(tot_buy_signals, stock.stock.symbol, stock.close)

        if tot_buy_signals > 0:
            send_via_telegram(text)

        logger.info("Buy signals updated in watch list: %d/%d" % (tot_buy_signals, stocks_count))