From c9cf6a2aac246b6b9b24f8f3192e6bc4b8c36f28 Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Sat, 8 Feb 2025 00:50:41 +0100 Subject: [PATCH] add new list --- app/cron_list.py | 71 ++++++++++++++++++++++++++++++++++++++++-------- app/main.py | 2 +- 2 files changed, 60 insertions(+), 13 deletions(-) diff --git a/app/cron_list.py b/app/cron_list.py index a8b90fb..bef67b7 100644 --- a/app/cron_list.py +++ b/app/cron_list.py @@ -810,6 +810,52 @@ async def get_most_shorted_stocks(): file.write(orjson.dumps(res_list)) +async def get_most_buybacks(): + with sqlite3.connect('stocks.db') as con: + cursor = con.cursor() + cursor.execute("PRAGMA journal_mode = wal") + cursor.execute("SELECT DISTINCT symbol FROM stocks WHERE symbol NOT LIKE '%.%' AND symbol NOT LIKE '%-%'") + symbols = [row[0] for row in cursor.fetchall()] + + res_list = [] + for symbol in symbols: + try: + stock_buybacks = stock_screener_data_dict[symbol].get('commonStockRepurchased',None) + country = stock_screener_data_dict[symbol].get('country',None) + if country == 'United States' and stock_buybacks < -1E6: + quote_data = await get_quote_data(symbol) + # Assign price and volume, and check if they meet the penny stock criteria + if quote_data: + price = round(quote_data.get('price',None), 2) + changesPercentage = round(quote_data.get('changesPercentage'), 2) + marketCap = quote_data.get('marketCap') + name = quote_data.get('name') + + if abs(stock_buybacks/marketCap) < 1: + res_list.append({ + 'symbol': symbol, + 'name': name, + 'price': price, + 'changesPercentage': changesPercentage, + 'marketCap': marketCap, + 'commonStockRepurchased': stock_buybacks + }) + except: + pass + + if res_list: + # Sort by market cap in descending order + res_list = sorted(res_list, key=lambda x: x['commonStockRepurchased'])[:100] + + # Assign rank to each stock + for rank, item in enumerate(res_list, start=1): + item['rank'] = rank + + # Write the filtered and ranked penny stocks to a JSON file + with open("json/stocks-list/list/most-buybacks.json", 'wb') as file: + file.write(orjson.dumps(res_list)) + + async def get_highest_oi_change(): with sqlite3.connect('stocks.db') as con: cursor = con.cursor() @@ -1020,8 +1066,8 @@ async def etf_bitcoin_list(): 'price': price, 'changesPercentage': changesPercentage }) - except Exception as e: - print(f"Error processing symbol {symbol}: {e}") + except: + pass if res_list: res_list = sorted(res_list, key=lambda x: x['totalAssets'], reverse=True) @@ -1031,8 +1077,8 @@ async def etf_bitcoin_list(): with open("json/etf-bitcoin-list/data.json", 'wb') as file: file.write(orjson.dumps(res_list)) - except Exception as e: - print(f"Database error: {e}") + except: + pass async def get_all_reits_list(cursor): base_query = """ @@ -1185,8 +1231,8 @@ async def get_all_stock_tickers(): res_list.append(item) - except Exception as e: - print(f"Error processing symbol {symbol}: {e}") + except: + pass if res_list: res_list = sorted(res_list, key=lambda x: x['symbol'], reverse=False) @@ -1194,8 +1240,8 @@ async def get_all_stock_tickers(): with open("json/stocks-list/list/all-stock-tickers.json", 'wb') as file: file.write(orjson.dumps(res_list)) - except Exception as e: - print(f"Database error: {e}") + except: + pass async def get_all_etf_tickers(): try: @@ -1235,8 +1281,8 @@ async def get_all_etf_tickers(): res_list.append(item) - except Exception as e: - print(f"Error processing symbol {symbol}: {e}") + except: + pass if res_list: res_list = sorted(res_list, key=lambda x: x['symbol'], reverse=False) @@ -1244,8 +1290,8 @@ async def get_all_etf_tickers(): with open("json/stocks-list/list/all-etf-tickers.json", 'wb') as file: file.write(orjson.dumps(res_list)) - except Exception as e: - print(f"Database error: {e}") + except: + pass async def run(): @@ -1285,6 +1331,7 @@ async def run(): get_highest_option_premium(), get_etf_holding(), get_etf_provider(), + get_most_buybacks(), ) diff --git a/app/main.py b/app/main.py index c7cb7fa..010f941 100755 --- a/app/main.py +++ b/app/main.py @@ -4172,7 +4172,7 @@ async def get_statistics(data: FilterStockList, api_key: str = Security(get_api_ category_type = 'sector' elif filter_list == 'reits': category_type = 'industry' - elif filter_list in ['online-gambling','metaverse','sports-betting','virtual-reality','online-dating','pharmaceutical-stocks','gaming-stocks','augmented-reality','electric-vehicles','car-company-stocks','esports','clean-energy','mobile-games','social-media-stocks','ai-stocks','highest-option-premium','highest-option-iv-rank','highest-open-interest','highest-open-interest-change','most-shorted-stocks','most-ftd-shares','highest-income-tax','most-employees','highest-revenue','top-rated-dividend-stocks','penny-stocks','overbought-stocks','oversold-stocks','faang','magnificent-seven','ca','cn','de','gb','il','in','jp','nyse','nasdaq','amex','dowjones','sp500','nasdaq100','all-etf-tickers','all-stock-tickers']: + elif filter_list in ['most-buybacks','online-gambling','metaverse','sports-betting','virtual-reality','online-dating','pharmaceutical-stocks','gaming-stocks','augmented-reality','electric-vehicles','car-company-stocks','esports','clean-energy','mobile-games','social-media-stocks','ai-stocks','highest-option-premium','highest-option-iv-rank','highest-open-interest','highest-open-interest-change','most-shorted-stocks','most-ftd-shares','highest-income-tax','most-employees','highest-revenue','top-rated-dividend-stocks','penny-stocks','overbought-stocks','oversold-stocks','faang','magnificent-seven','ca','cn','de','gb','il','in','jp','nyse','nasdaq','amex','dowjones','sp500','nasdaq100','all-etf-tickers','all-stock-tickers']: category_type = 'stocks-list' elif filter_list in ['dividend-kings','dividend-aristocrats']: category_type = 'dividends'