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))
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))
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))
def _trigger_monitor(self): stock_quotes = self._get_stock_quotes() for stock in stock_quotes: stock_symbol = stock['symbol'].replace('&', '&') 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)
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))