From e607c83a00a4cab47d4b2083f968d980261de5e9 Mon Sep 17 00:00:00 2001 From: Justin Date: Thu, 16 Mar 2023 17:20:07 +0800 Subject: [PATCH] portfolio tracking --- stockTicker.py | 125 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 98 insertions(+), 27 deletions(-) diff --git a/stockTicker.py b/stockTicker.py index 06bdd6b..6e6591b 100755 --- a/stockTicker.py +++ b/stockTicker.py @@ -1661,6 +1661,7 @@ class StockTicker(): self.blank = Image.new('RGB', (10, 32)) return finalDisplayImage + def getStockImage(self): f = open('csv/stocks_settings.json', 'r') @@ -1673,10 +1674,15 @@ class StockTicker(): image_list.append(self.blank) else: image_list = [] - - - - + + if all_stocks_settings['chart']: + try: + f = open('csv/portfolio_settings.json', 'r') + portfolio_settings = json.load(f)['symbols'] + f.close() + except: + pass + stock_info = all_stocks_settings['symbols'] symbols = list(stock_info.keys()) @@ -1687,27 +1693,19 @@ class StockTicker(): change = float(info['change']) #TEXT ticker = symbol #TEXT - arrow, change = self.getArrow(change) percent_change = '%.2f' % abs(float(info['percent_change'])) + '%' point_change = '%.2f' % abs(change) - - current = '%.2f' % float(info['current']) #TEXT - - if not all_stocks_settings['percent']: percent_change = False if not all_stocks_settings['point']: point_change = False - - - midFrame = self.textToImage(ticker, current, arrow, percent_change, point_change) #IMAGE THE TEXT if all_stocks_settings['logos']: @@ -1722,29 +1720,102 @@ class StockTicker(): else: stitchedStock = midFrame + + if all_stocks_settings['chart'] and (symbol in portfolio_settings): #IF USER INPUTTED PORTFOLIO SETTINGS, DISPLAY PORTFOLIO INFO + try: + cost = portfolio_settings[symbol]['cost'] + day = portfolio_settings[symbol]['day'] + shares = portfolio_settings[symbol]['shares'] + + original_value = float(cost) * float(shares) + new_value = float(info['current']) * float(shares) + value_day_change_percent = ((float(info['percent_change'])/100) * new_value) + + font = ImageFont.load("./fonts/5x8.pil") + cost_img = self.textImage('Cost', font, r = 255, g = 255 , b = 255) + cost2_img = self.textImage(cost, font, r = 0, g = 255, b = 0) + shares_img = self.textImage('Shares', font, r = 255, g = 255 , b = 255) + shares2_img = self.textImage(shares, font, r = 0, g = 255, b = 0) + + pnlchange = new_value - original_value + pnlpercent = ((new_value - original_value) / original_value) * 100 + + pnlpercent_img = self.textImage('P/L%', font, r = 255, g = 255 , b = 255) + if pnlpercent >= 0: + pnlpercent2_img = self.textImage(str('%.2f' % abs(pnlpercent)) + '%', font, r = 0, g = 255, b = 0) + else: + pnlpercent2_img = self.textImage(str('%.2f' % abs(pnlpercent)) + '%', font, r = 255, g = 0, b = 0) + + + daypercent_img = self.textImage('Day%', font, r = 255, g = 255 , b = 255) + if float(info['percent_change']) >= 0: + daypercent2_img = self.textImage(str('%.2f' % abs(float(info['percent_change']))) +'%', font, r = 0, g = 255, b = 0) + else: + daypercent2_img = self.textImage(str('%.2f' % abs(float(info['percent_change'])))+'%', font, r = 255, g = 0, b = 0) + + days_img = self.textImage('Days', font, r = 255, g = 255 , b = 255) + days2_img = self.textImage(day, font, r = 0, g = 255, b = 0) + value_img = self.textImage('Value', font, r = 255, g = 255 , b = 255) + value2_img = self.textImage(str('%.2f' % abs(original_value)), font, r = 0, g = 255, b = 0) + + pnlchange_img = self.textImage('P/L$', font, r = 255, g = 255 , b = 255) + if pnlchange >= 0: + pnlchange2_img = self.textImage(str('%.2f' % abs(pnlchange)), font, r = 0, g = 255, b = 0) + else: + pnlchange2_img = self.textImage(str('%.2f' % abs(pnlchange)), font, r = 255, g = 0, b = 0) + + daychange_img = self.textImage('Day$', font, r = 255, g = 255 , b = 255) + if value_day_change_percent >= 0: + daychange2_img = self.textImage(str('%.2f' % abs(value_day_change_percent)), font, r = 0, g = 255, b = 0) + else: + daychange2_img = self.textImage(str('%.2f' % abs(value_day_change_percent)), font, r = 255, g = 0, b = 0) + + x_offset = 0 + + img = Image.new('RGB', (max(cost_img.size[0], cost2_img.size[0], days_img.size[0], days2_img.size[0]) + 7 + + max(shares_img.size[0], shares2_img.size[0], value2_img.size[0], value_img.size[0]) + 7 + + max(pnlpercent_img.size[0], pnlpercent2_img.size[0], pnlchange_img.size[0], pnlchange2_img.size[0]) + 7 + + max(daypercent_img.size[0], daypercent2_img.size[0], daychange_img.size[0], daychange2_img.size[0]) + 15, 32)) + + img.paste(cost_img, (x_offset, 0)) + img.paste(cost2_img, (x_offset, 8)) + img.paste(days_img, (x_offset, 16)) + img.paste(days2_img, (x_offset, 24)) + x_offset += max(cost_img.size[0], cost2_img.size[0], days_img.size[0], days2_img.size[0]) + 7 + + img.paste(shares_img, (x_offset, 0)) + img.paste(shares2_img, (x_offset, 8)) + img.paste(value_img, (x_offset, 16)) + img.paste(value2_img, (x_offset, 24)) + x_offset += max(shares_img.size[0], shares2_img.size[0], value2_img.size[0], value_img.size[0]) + 7 + + img.paste(pnlpercent_img, (x_offset, 0)) + img.paste(pnlpercent2_img, (x_offset, 8)) + img.paste(pnlchange_img, (x_offset, 16)) + img.paste(pnlchange2_img, (x_offset, 24)) + x_offset += max(pnlpercent_img.size[0], pnlpercent2_img.size[0], pnlchange_img.size[0], pnlchange2_img.size[0]) + 7 + + img.paste(daypercent_img, (x_offset, 0)) + img.paste(daypercent2_img, (x_offset, 8)) + img.paste(daychange_img, (x_offset,16)) + img.paste(daychange2_img, (x_offset, 24)) + except: + pass + image_list.append(stitchedStock) - - + if all_stocks_settings['chart'] and (symbol in portfolio_settings): + try: + image_list.append(img) + except: + pass image_list.append(self.blank) except Exception as e: pass -# logf = open('log.txt', "a") -# exc_type, exc_obj, exc_tb = sys.exc_info() -# fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] -# logf.write(str(e)) -# logf.write('. file: ' + fname) -# logf.write('. line: ' + str(exc_tb.tb_lineno)) -# logf.write('. type: ' + str(exc_type)) -# logf.write('\n ' + "".join(traceback.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]))) -# logf.close() - - finalDisplayImage = self.stitchImage(image_list) - - return finalDisplayImage + def getStockProfessional(self): self.blank = Image.new('RGB', (0, 16))