pkscreener 0.46.20250219.724__cp312-cp312-manylinux2014_x86_64.whl → 0.46.20250220.726__cp312-cp312-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/README.txt +6 -6
  2. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/AssetsManager.py +9 -7
  3. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/Fetcher.py +38 -8
  4. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/ScreeningStatistics.py +12 -2
  5. pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/__init__.py +1 -0
  6. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/pkscreenercli.py +0 -1
  7. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/requirements.txt +1 -1
  8. {pkscreener-0.46.20250219.724.dist-info → pkscreener-0.46.20250220.726.dist-info}/METADATA +9 -9
  9. pkscreener-0.46.20250220.726.dist-info/RECORD +58 -0
  10. pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/__init__.py +0 -1
  11. pkscreener-0.46.20250219.724.dist-info/RECORD +0 -58
  12. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/Disclaimer.txt +0 -0
  13. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/LICENSE-Others.txt +0 -0
  14. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/LICENSE.txt +0 -0
  15. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/LogoWM.txt +0 -0
  16. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/__init__.py +0 -0
  17. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/ArtTexts.py +0 -0
  18. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/Backtest.py +0 -0
  19. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/Barometer.py +0 -0
  20. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/BaseScreeningStatistics.py +0 -0
  21. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/CandlePatterns.py +0 -0
  22. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/Changelog.py +0 -0
  23. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/ConfigManager.py +0 -0
  24. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/ConsoleMenuUtility.py +0 -0
  25. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/ConsoleUtility.py +0 -0
  26. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/GlobalStore.py +0 -0
  27. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/ImageUtility.py +0 -0
  28. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/MarketMonitor.py +0 -0
  29. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/MarketStatus.py +0 -0
  30. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/MenuOptions.py +0 -0
  31. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/Messenger.py +0 -0
  32. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/OtaUpdater.py +0 -0
  33. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/PKAnalytics.py +0 -0
  34. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/PKDataService.py +0 -0
  35. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/PKDemoHandler.py +0 -0
  36. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py +0 -0
  37. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/PKPremiumHandler.py +0 -0
  38. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/PKScanRunner.py +0 -0
  39. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/PKScheduledTaskProgress.py +0 -0
  40. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/PKScheduler.py +0 -0
  41. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/PKSpreadsheets.py +0 -0
  42. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/PKTask.py +0 -0
  43. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/PKUserRegistration.py +0 -0
  44. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/Pktalib.py +0 -0
  45. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/Portfolio.py +0 -0
  46. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/PortfolioXRay.py +0 -0
  47. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/StockScreener.py +0 -0
  48. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/StockSentiment.py +0 -0
  49. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/UserMenuChoicesHandler.py +0 -0
  50. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/Utility.py +0 -0
  51. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/WorkflowManager.py +0 -0
  52. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/classes/keys.py +0 -0
  53. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/courbd.ttf +0 -0
  54. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/globals.py +0 -0
  55. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/pkscreener.ini +0 -0
  56. {pkscreener-0.46.20250219.724.data → pkscreener-0.46.20250220.726.data}/purelib/pkscreener/pkscreenerbot.py +0 -0
  57. {pkscreener-0.46.20250219.724.dist-info → pkscreener-0.46.20250220.726.dist-info}/LICENSE +0 -0
  58. {pkscreener-0.46.20250219.724.dist-info → pkscreener-0.46.20250220.726.dist-info}/WHEEL +0 -0
  59. {pkscreener-0.46.20250219.724.dist-info → pkscreener-0.46.20250220.726.dist-info}/entry_points.txt +0 -0
  60. {pkscreener-0.46.20250219.724.dist-info → pkscreener-0.46.20250220.726.dist-info}/top_level.txt +0 -0
@@ -5,7 +5,7 @@
5
5
  | :-------------: | :-----------------: | :-----------------: | :-----------------: | :-----------------: |
6
6
  | Platforms | [![Windows][Windows-badge]][Windows] | [![Linux(x64)][Linux-badge_x64]][Linux_x64] [![Linux(arm64)][Linux-badge_arm64]][Linux_arm64] | [![Mac OS(x64)][Mac OS-badge_x64]][Mac OS_x64] [![Mac OS(arm64)][Mac OS-badge_arm64]][Mac OS_arm64] | [![Docker Status][Docker Status-badge]][Docker Status] |
7
7
  | Package / Docs | [![Documentation][Documentation-badge]][Documentation] [![OpenSSF Best Practices][OpenSSF-Badge]][OpenSSF-pkscreener] | [![PyPI][pypi-badge]][pypi] | [![is wheel][wheel-badge]][pypi] | ![github license][github-license] |
8
- | Tests/Code-Quality | [![CodeFactor][Codefactor-badge]][Codefactor] | [![Coverage Status][Coverage-Status-badge]][Coverage-Status] | [![codecov][codecov-badge]][codecov] | [![After Market][After Market-badge]][After Market] |
8
+ | Tests/Code-Quality | [![CodeFactor][Codefactor-badge]][Codefactor] | <a href="https://coveralls.io/github/pkjmesra/PKScreener?branch=main"><img src="https://coveralls.io/repos/github/pkjmesra/PKScreener/badge.svg?branch=main"></a> | [![codecov][codecov-badge]][codecov] | [![After Market][After Market-badge]][After Market] |
9
9
 
10
10
  ## What is PKScreener?
11
11
  | Telegram Alerts | Nifty AI Prediction | Scheduling Cron Jobs | On-Demand Telegram Bot | Backtesting / Growth of 10k|
@@ -328,15 +328,15 @@ After you have finished the run, go to that copied path, zip the contents of the
328
328
  [MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
329
329
  [MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
330
330
  [Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
331
- [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250218.722/pkscreenercli.exe
331
+ [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli.exe
332
332
  [Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
333
- [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250218.722/pkscreenercli_x64.bin
333
+ [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_x64.bin
334
334
  [Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
335
- [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250218.722/pkscreenercli_arm64.bin
335
+ [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_arm64.bin
336
336
  [Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
337
- [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250218.722/pkscreenercli_x64.run
337
+ [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_x64.run
338
338
  [Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
339
- [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250218.722/pkscreenercli_arm64.run
339
+ [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_arm64.run
340
340
  [GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
341
341
  [GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
342
342
  [pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
@@ -265,8 +265,10 @@ class PKAssetsManager:
265
265
  return cache_file
266
266
 
267
267
  @Halo(text=' [+] Downloading fresh data from Data Providers...', spinner='dots')
268
- def downloadLatestData(stockDict,configManager,stockCodes=[],exchangeSuffix=".NS",downloadOnly=False):
269
- numStocksPerIteration = (int(len(stockCodes)/int(len(stockCodes)/10)) if len(stockCodes) >= 10 else len(stockCodes)) + 1
268
+ def downloadLatestData(stockDict,configManager,stockCodes=[],exchangeSuffix=".NS",downloadOnly=False,numStocksPerIteration=0):
269
+ # if numStocksPerIteration == 0:
270
+ maxParallelProcesses = 17
271
+ numStocksPerIteration = (int(len(stockCodes)/int(len(stockCodes)/maxParallelProcesses)) if len(stockCodes) >= maxParallelProcesses else len(stockCodes)) + 1
270
272
  queueCounter = 0
271
273
  iterations = int(len(stockCodes)/numStocksPerIteration) + 1
272
274
  tasksList = []
@@ -293,10 +295,10 @@ class PKAssetsManager:
293
295
  minAcceptableCompletionPercentage=(100 if downloadOnly else 100),
294
296
  showProgressBars=configManager.logsEnabled)
295
297
  for task in tasksList:
296
- if task.result is not None:
298
+ if task.result is not None and isinstance(task.result,pd.DataFrame) and not task.result.empty:
297
299
  for stock in task.userData:
298
300
  taskResult = task.result.get(f"{stock}{exchangeSuffix}")
299
- if taskResult is not None:
301
+ if taskResult is not None and isinstance(taskResult,pd.DataFrame) and not taskResult.empty:
300
302
  stockDict[stock] = taskResult.to_dict("split")
301
303
  processedStocks.append(stock)
302
304
  leftOutStocks = list(set(stockCodes)-set(processedStocks))
@@ -332,10 +334,10 @@ class PKAssetsManager:
332
334
  # stockCodes is not None mandates that we start our work based on the downloaded data from yesterday
333
335
  if (stockCodes is not None and len(stockCodes) > 0) and (isTrading or downloadOnly):
334
336
  recentDownloadFromOriginAttempted = True
335
- stockDict, leftOutStocks = PKAssetsManager.downloadLatestData(stockDict,configManager,stockCodes,exchangeSuffix=exchangeSuffix,downloadOnly=downloadOnly)
337
+ stockDict, leftOutStocks = PKAssetsManager.downloadLatestData(stockDict,configManager,stockCodes,exchangeSuffix=exchangeSuffix,downloadOnly=downloadOnly,numStocksPerIteration=len(stockCodes) if stockCodes is not None else 0)
336
338
  if len(leftOutStocks) > int(len(stockCodes)*0.05):
337
339
  # More than 5 % of stocks are still remaining
338
- stockDict, _ = PKAssetsManager.downloadLatestData(stockDict,configManager,leftOutStocks,exchangeSuffix=exchangeSuffix,downloadOnly=downloadOnly)
340
+ stockDict, _ = PKAssetsManager.downloadLatestData(stockDict,configManager,leftOutStocks,exchangeSuffix=exchangeSuffix,downloadOnly=downloadOnly,numStocksPerIteration=len(leftOutStocks) if leftOutStocks is not None else 0)
339
341
  # return stockDict
340
342
  if downloadOnly or isTrading:
341
343
  # We don't want to download from local stale pkl file or stale file at server
@@ -366,7 +368,7 @@ class PKAssetsManager:
366
368
  + colorText.END
367
369
  )
368
370
  if not stockDataLoaded and not recentDownloadFromOriginAttempted:
369
- stockDict, _ = PKAssetsManager.downloadLatestData(stockDict,configManager,stockCodes,exchangeSuffix=exchangeSuffix,downloadOnly=downloadOnly)
371
+ stockDict, _ = PKAssetsManager.downloadLatestData(stockDict,configManager,stockCodes,exchangeSuffix=exchangeSuffix,downloadOnly=downloadOnly,numStocksPerIteration=len(stockCodes) if stockCodes is not None else 0)
370
372
  # See if we need to save stock data
371
373
  stockDataLoaded = stockDataLoaded or (len(stockDict) > 0 and (len(stockDict) != initialLoadCount))
372
374
  if stockDataLoaded:
@@ -27,16 +27,21 @@ import os
27
27
  import sys
28
28
  import warnings
29
29
 
30
+ from time import sleep
30
31
  warnings.simplefilter("ignore", DeprecationWarning)
31
32
  warnings.simplefilter("ignore", FutureWarning)
32
33
  import pandas as pd
33
34
  import yfinance as yf
34
35
  from yfinance import shared
35
- # from yfinance.exceptions import YFPricesMissingError, YFInvalidPeriodError
36
- class YFPricesMissingError(Exception):
37
- pass
38
- class YFInvalidPeriodError(Exception):
39
- pass
36
+ # from yfinance.const import USER_AGENTS
37
+ from PKDevTools.classes.Utils import USER_AGENTS
38
+ from yfinance.data import YfData
39
+ import random
40
+ from yfinance.exceptions import YFPricesMissingError, YFInvalidPeriodError, YFRateLimitError
41
+ # class YFPricesMissingError(Exception):
42
+ # pass
43
+ # class YFInvalidPeriodError(Exception):
44
+ # pass
40
45
  from concurrent.futures import ThreadPoolExecutor
41
46
  from PKDevTools.classes.PKDateUtilities import PKDateUtilities
42
47
  from PKDevTools.classes.ColorText import colorText
@@ -94,7 +99,8 @@ class screenerStockDataFetcher(nseStockDataFetcher):
94
99
  printCounter=False,
95
100
  start=None,
96
101
  end=None,
97
- exchangeSuffix=".NS"
102
+ exchangeSuffix=".NS",
103
+ attempt = 0
98
104
  ):
99
105
  if isinstance(stockCode,list):
100
106
  if len(exchangeSuffix) > 0:
@@ -117,6 +123,8 @@ class screenerStockDataFetcher(nseStockDataFetcher):
117
123
  data = None
118
124
  with SuppressOutput(suppress_stdout=(not printCounter), suppress_stderr=(not printCounter)):
119
125
  try:
126
+ # YfData.user_agent_headers = {
127
+ # 'User-Agent': random.choice(USER_AGENTS)}
120
128
  data = yf.download(
121
129
  tickers=stockCode,
122
130
  period=period,
@@ -127,7 +135,8 @@ class screenerStockDataFetcher(nseStockDataFetcher):
127
135
  group_by='ticker',
128
136
  timeout=self.configManager.generalTimeout/4,
129
137
  start=start,
130
- end=end
138
+ end=end,
139
+ auto_adjust=True
131
140
  )
132
141
  if isinstance(stockCode,str):
133
142
  if (data is None or data.empty):
@@ -142,8 +151,13 @@ class screenerStockDataFetcher(nseStockDataFetcher):
142
151
  recommendedPeriod = str(err).split("[")[1].split("]")[0].split(",")[-1].strip()
143
152
  recommendedPeriod = recommendedPeriod.replace("'","").replace("\"","")
144
153
  # default_logger().debug(f"Sending request again for {ticker} with period:{recommendedPeriod}")
145
- data = self.fetchStockData(stockCode=ticker,period=recommendedPeriod,duration=duration,printCounter=printCounter, start=start,end=end)
154
+ data = self.fetchStockData(stockCode=ticker,period=period,duration=duration,printCounter=printCounter, start=start,end=end,proxyServer=proxyServer,)
146
155
  return data
156
+ elif "YFRateLimitError" in err:
157
+ if attempt <= 2:
158
+ default_logger().debug(f"YFRateLimitError Hit! Going for attempt : {attempt+1}")
159
+ # sleep(attempt*1) # Exponential backoff
160
+ # return self.fetchStockData(stockCode=stockCode,period=period,duration=duration,printCounter=printCounter, start=start,end=end,screenResultsCounter=screenResultsCounter,screenCounter=screenCounter,totalSymbols=totalSymbols,exchangeSuffix=exchangeSuffix,attempt=attempt+1)
147
161
  else:
148
162
  multiIndex = data.keys()
149
163
  if isinstance(multiIndex, pd.MultiIndex):
@@ -151,9 +165,25 @@ class screenerStockDataFetcher(nseStockDataFetcher):
151
165
  # we'd have received a multiindex dataframe
152
166
  listStockCodes = multiIndex.get_level_values(0)
153
167
  data = data.get(listStockCodes[0])
168
+ else:
169
+ if (data is None or data.empty):
170
+ if len(shared._ERRORS) > 0:
171
+ default_logger().debug(shared._ERRORS)
172
+ for ticker in shared._ERRORS:
173
+ err = shared._ERRORS.get(ticker)
174
+ if "YFRateLimitError" in err:
175
+ if attempt <= 2:
176
+ default_logger().debug(f"YFRateLimitError Hit! Going for attempt : {attempt+1}")
177
+ # sleep(attempt*2) # Exponential backoff
178
+ # return self.fetchStockData(stockCode=stockCode,period=period,duration=duration,printCounter=printCounter, start=start,end=end,screenResultsCounter=screenResultsCounter,screenCounter=screenCounter,totalSymbols=totalSymbols,exchangeSuffix=exchangeSuffix,attempt=attempt+1)
154
179
  except (KeyError,YFPricesMissingError) as e: # pragma: no cover
155
180
  default_logger().debug(e,exc_info=True)
156
181
  pass
182
+ except YFRateLimitError as e:
183
+ if attempt <= 2:
184
+ default_logger().debug(f"YFRateLimitError Hit! Going for attempt : {attempt+1}")
185
+ # sleep(attempt*2) # Exponential backoff
186
+ # return self.fetchStockData(stockCode=stockCode,period=period,duration=duration,printCounter=printCounter, start=start,end=end,screenResultsCounter=screenResultsCounter,screenCounter=screenCounter,totalSymbols=totalSymbols,exchangeSuffix=exchangeSuffix,attempt=attempt+1)
157
187
  except (YFInvalidPeriodError,Exception) as e: # pragma: no cover
158
188
  default_logger().debug(e,exc_info=True)
159
189
  if printCounter and type(screenCounter) != int:
@@ -114,6 +114,8 @@ class ScreeningStatistics:
114
114
  #Calculating signals
115
115
  def computeBuySellSignals(self,df,ema_period=200,retry=True):
116
116
  try:
117
+ df["Above"] = False
118
+ df["Below"] = False
117
119
  if Imports["vectorbt"]:
118
120
  from vectorbt.indicators import MA as vbt
119
121
  if df is not None:
@@ -127,7 +129,11 @@ class ScreeningStatistics:
127
129
  df["Above"] = ema > df["ATRTrailingStop"]
128
130
  df["Below"] = ema < df["ATRTrailingStop"]
129
131
  except (OSError,FileNotFoundError) as e: # pragma: no cover
130
- OutputControls().printOutput(f"{colorText.FAIL}Some dependencies are missing. Try and run this option again.{colorText.END}")
132
+ msg = f"{colorText.FAIL}Some dependencies are missing. Try and run this option again.{colorText.END}"
133
+ if 'unittest' in sys.modules or any("pytest" in arg for arg in sys.argv):
134
+ print(msg)
135
+ else:
136
+ OutputControls().printOutput(msg)
131
137
  # OSError:RALLIS: [Errno 2] No such file or directory: '/tmp/_MEIzoTV6A/vectorbt/templates/light.json'
132
138
  # if "No such file or directory" in str(e):
133
139
  try:
@@ -148,7 +154,11 @@ class ScreeningStatistics:
148
154
  return self.computeBuySellSignals(df,ema_period=ema_period,retry=False)
149
155
  return None
150
156
  except ImportError as e: # pragma: no cover
151
- OutputControls().printOutput(f"{colorText.FAIL}The main module needed for best Buy/Sell result calculation is missing. Falling back on an alternative, but it is not very reliable.{colorText.END}")
157
+ msg = f"{colorText.FAIL}The main module needed for best Buy/Sell result calculation is missing. Falling back on an alternative, but it is not very reliable.{colorText.END}"
158
+ if 'unittest' in sys.modules or any("pytest" in arg for arg in sys.argv):
159
+ print(msg)
160
+ else:
161
+ OutputControls().printOutput(msg)
152
162
  if df is not None:
153
163
  ema = pktalib.EMA(df["Close"], ema_period) if ema_period > 1 else df["Close"]#short_name='EMA', ewm=True)
154
164
  df["Above"] = ema > df["ATRTrailingStop"]
@@ -0,0 +1 @@
1
+ VERSION='0.46.20250220.726'
@@ -89,7 +89,6 @@ def decorator(func):
89
89
 
90
90
  return new_func
91
91
 
92
-
93
92
  # print = decorator(print) # current file
94
93
  def disableSysOut(input=True, disable=True):
95
94
  global printenabled,originalStdOut, original__stdout
@@ -37,7 +37,7 @@ tensorflow==2.16.1 # https://github.com/tensorflow/tensorflow/issues/62075
37
37
  urllib3 #>=1.26.20
38
38
  vectorbt #>=0.26.2
39
39
  xlsxwriter #>=3.2.0
40
- yfinance==0.2.28 #>=0.2.44 #==0.1.87
40
+ yfinance==0.2.54 #>=0.2.44 #==0.1.87
41
41
  # windows-curses; "windows" in sys.platform
42
42
  # https://github.com/pkjmesra/PKScreener/blob/main/.github/dependencies/TA_Lib-0.4.28-cp311-cp311-win_amd64.whl; "windows" in sys.platform
43
43
 
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pkscreener
3
- Version: 0.46.20250219.724
3
+ Version: 0.46.20250220.726
4
4
  Summary: A Python-based stock screener for NSE, India with alerts to Telegram Channel (pkscreener)
5
5
  Home-page: https://github.com/pkjmesra/pkscreener
6
- Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250219.724.zip
6
+ Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250220.726.zip
7
7
  Author: pkjmesra
8
8
  Author-email: pkjmesra@gmail.com
9
9
  License: OSI Approved (MIT)
@@ -48,7 +48,7 @@ Requires-Dist: tensorflow==2.16.1
48
48
  Requires-Dist: urllib3
49
49
  Requires-Dist: vectorbt
50
50
  Requires-Dist: xlsxwriter
51
- Requires-Dist: yfinance==0.2.28
51
+ Requires-Dist: yfinance==0.2.54
52
52
  Requires-Dist: advanced_ta
53
53
  Dynamic: author
54
54
  Dynamic: author-email
@@ -69,7 +69,7 @@ Dynamic: summary
69
69
  | :-------------: | :-----------------: | :-----------------: | :-----------------: | :-----------------: |
70
70
  | Platforms | [![Windows][Windows-badge]][Windows] | [![Linux(x64)][Linux-badge_x64]][Linux_x64] [![Linux(arm64)][Linux-badge_arm64]][Linux_arm64] | [![Mac OS(x64)][Mac OS-badge_x64]][Mac OS_x64] [![Mac OS(arm64)][Mac OS-badge_arm64]][Mac OS_arm64] | [![Docker Status][Docker Status-badge]][Docker Status] |
71
71
  | Package / Docs | [![Documentation][Documentation-badge]][Documentation] [![OpenSSF Best Practices][OpenSSF-Badge]][OpenSSF-pkscreener] | [![PyPI][pypi-badge]][pypi] | [![is wheel][wheel-badge]][pypi] | ![github license][github-license] |
72
- | Tests/Code-Quality | [![CodeFactor][Codefactor-badge]][Codefactor] | [![Coverage Status][Coverage-Status-badge]][Coverage-Status] | [![codecov][codecov-badge]][codecov] | [![After Market][After Market-badge]][After Market] |
72
+ | Tests/Code-Quality | [![CodeFactor][Codefactor-badge]][Codefactor] | <a href="https://coveralls.io/github/pkjmesra/PKScreener?branch=main"><img src="https://coveralls.io/repos/github/pkjmesra/PKScreener/badge.svg?branch=main"></a> | [![codecov][codecov-badge]][codecov] | [![After Market][After Market-badge]][After Market] |
73
73
 
74
74
  ## What is PKScreener?
75
75
  | Telegram Alerts | Nifty AI Prediction | Scheduling Cron Jobs | On-Demand Telegram Bot | Backtesting / Growth of 10k|
@@ -392,15 +392,15 @@ After you have finished the run, go to that copied path, zip the contents of the
392
392
  [MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
393
393
  [MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
394
394
  [Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
395
- [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250218.722/pkscreenercli.exe
395
+ [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli.exe
396
396
  [Linux-badge_x64]: https://img.shields.io/badge/Linux(x64)-FCC624?logo=linux&logoColor=black
397
- [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250218.722/pkscreenercli_x64.bin
397
+ [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_x64.bin
398
398
  [Linux-badge_arm64]: https://img.shields.io/badge/Linux(arm64)-FCC624?logo=linux&logoColor=black
399
- [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250218.722/pkscreenercli_arm64.bin
399
+ [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_arm64.bin
400
400
  [Mac OS-badge_x64]: https://img.shields.io/badge/mac%20os(x64)-D3D3D3?logo=apple&logoColor=000000
401
- [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250218.722/pkscreenercli_x64.run
401
+ [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_x64.run
402
402
  [Mac OS-badge_arm64]: https://img.shields.io/badge/mac%20os(arm64)-D3D3D3?logo=apple&logoColor=000000
403
- [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250218.722/pkscreenercli_arm64.run
403
+ [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250219.725/pkscreenercli_arm64.run
404
404
  [GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
405
405
  [GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
406
406
  [pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
@@ -0,0 +1,58 @@
1
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/Disclaimer.txt,sha256=kBZQSQCFfL2kc1bijXWndZzkjMTtnpH_B7XtDPPMcuw,1396
2
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/LICENSE-Others.txt,sha256=WBslRYLBoqYg-vr25sS1c_UI7cuUnsGk0nIQLBzTWEE,271830
3
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/LICENSE.txt,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
4
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/LogoWM.txt,sha256=7Njnavpy_FKY4Iwbzv1JqsYMcOdkDSKAKXP3SAItKV0,14868
5
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/README.txt,sha256=PYtfYMNmI78Ix0DNT3qZo0URJTXb_Q0-ChsA6a7XzwU,32802
6
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/__init__.py,sha256=aZ62qYACxsU8m8_5JkzNzos1lVFNcMGPRMgeddnUUiQ,1633
7
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/courbd.ttf,sha256=SKpnp-BRs7AZcdI83nencS3Q7xe0anbbP1YMOxLlEhU,791436
8
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/globals.py,sha256=q1FCCPcnJ-IethQk-V-cCRCIW6PtZuvKSCNmSrgfA_Y,241097
9
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/pkscreener.ini,sha256=QKs6j4qhyH37L_MdG3ztAIwgqs4c3qihuqDIoex-V2g,2391
10
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/pkscreenerbot.py,sha256=hi1qvI2yb9aNkTP4BAZyuVzpLf-_gR0JBaozGUIm32o,117163
11
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/pkscreenercli.py,sha256=-2cgfdCUJhp4xeZfcbj2ntUp_MvsrVJvz1dnsOBQMZA,57826
12
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/requirements.txt,sha256=M7ZEXe8o9-6N67lHzel4HsEFYma_JfRUP93y3OavkDs,1457
13
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/ArtTexts.py,sha256=LZ8ynyS8woliv8bM9Nq4aU0VCoJDJU0FgZk8V5zYPmg,19504
14
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/AssetsManager.py,sha256=rnWt8Vyzrdm1pwp5XLH7if6yOHKD36wnYCHpZsQHBho,34192
15
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/Backtest.py,sha256=wobBQgqVQhFNZlyJ2hgMXQqofrICc_3F0I5D66DUvGI,10530
16
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/Barometer.py,sha256=WPrgtIXb1nIbb-FnuRs-yvOQ5baNQRBgUR_zWg1moxk,9464
17
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/BaseScreeningStatistics.py,sha256=u5t1wf-HsZ8xEtprON55ehIR3F2LNNq8LvwgIrhYRmU,3000
18
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/CandlePatterns.py,sha256=gaswU2OeDa3JXjEafR2clUpKW5v8_1_tJuNPuTWsAss,17066
19
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/Changelog.py,sha256=vUOpca28OACNhavAmjBm4xco3u6fcHqWlnlmCJqO5Lk,1469
20
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/ConfigManager.py,sha256=THcfBgua5hr1Pv7AwEDBu2yurCNteGM04jY3Fr_MeBg,53565
21
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/ConsoleMenuUtility.py,sha256=fyR7dEsAaEWEe5SyaVgwLPdU4h4pI8SozUhsPZXShpg,10037
22
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/ConsoleUtility.py,sha256=TrEnTT4pmsBpEYdwD2oAtNqNG_drPe1LVkhthP2540I,12096
23
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/Fetcher.py,sha256=3-6x_XoHDzMk5HV40oMS-8hYXRSJ-BaDdfB0KIDnb4c,14766
24
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/GlobalStore.py,sha256=IzoYMybXpVVf6YwZi7j34rP-hNd7sMened8TAMu_-A8,3709
25
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/ImageUtility.py,sha256=mgJUzjrOKQ1mYV5P_ylhBnaF7ZgOO6ogjy22Rt49TNI,37032
26
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/MarketMonitor.py,sha256=GQOPLuUhgcrnVa0mI8ZvXqQ4vPFW00FHW_vMfICnko8,22079
27
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/MarketStatus.py,sha256=dNg8znbRpt7ID3U_1nmclD4zSLtveJeYeRbS0l6HLtE,3737
28
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/MenuOptions.py,sha256=iZb0zBs7lcP60cmuP7Z5xmXfNtTFcFH6ZWOuoileErE,64552
29
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/Messenger.py,sha256=peyY-YiqdC1bp-3DlJXILRa9HGYbqGVzf1wil0fYv98,8396
30
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/OtaUpdater.py,sha256=_7-nFAC-vAcmZ1Nwi5g5tfp7hKQQPuLUnBCOzrwC39g,13491
31
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/PKAnalytics.py,sha256=_X-2OFw2yQVmXlEIRsnBVNy9fhYyxqt0BOqADD4v08U,5246
32
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/PKDataService.py,sha256=BipM8Z4rS6h12cF6VWv_u4Z8ee7psMFd1yUojejW1Ag,3393
33
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/PKDemoHandler.py,sha256=r4KrZF8TaOu1J0nu8sUsgWEvnbndboWQQvz69GOy1Fk,2207
34
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py,sha256=T7S0DRv4Tqg77S5CyTWQUgpIAtx0NEtSVAplkynS2YM,33833
35
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/PKPremiumHandler.py,sha256=r16-u9fyc0ftgnSnZnz-JusTfEzyQIyKkvgbPuSd7W4,5611
36
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/PKScanRunner.py,sha256=EPLo2euBMfA9omnqrr5pXv2h9KzTcPZM-PXRFI26LSo,26791
37
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/PKScheduledTaskProgress.py,sha256=h19ZuxoalB50pnZjntFh12b9mBozvMqhKYq6TL18vo4,1657
38
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/PKScheduler.py,sha256=qThoz0yXLmHEWAiD_TdkIrzJb37b_m830JJFrkN1Tio,8814
39
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/PKSpreadsheets.py,sha256=1I7YGGPPY879K5JeTZ_d1FNCpjloh6TZrx91JlwT20o,8298
40
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/PKTask.py,sha256=4q87uD2cXvp0AbP6I73xPP39F0mfnpHQutsxxqpnxJM,1867
41
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/PKUserRegistration.py,sha256=ZbnPzgvT5Je9X0Dm6bewSp8u7Fj_szNucaYnit_AtCg,11465
42
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/Pktalib.py,sha256=xketnpMVDGHOFg47LFavaU-agWy370VanYWyzzuLY8c,33386
43
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/Portfolio.py,sha256=JZ93n3Zk9nkSFaX-lHyQiFnavHVmHPFoy-L_4gugj54,13895
44
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/PortfolioXRay.py,sha256=4MjXqBAVUlfN4w5tTmgEnQGMoy0hFu_uaVgrmai1fN4,48339
45
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/ScreeningStatistics.py,sha256=YSg4cynnDcn7cUK6VUBRpMmcNsKG3_CCzTSyobiCk2k,221479
46
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/StockScreener.py,sha256=F0SWa1DSTgYdSWnkPTR9kmOKgHLtaqNMCtJP8yZkDnE,67252
47
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/StockSentiment.py,sha256=WL7TBAHDSIN5cgZ9uTbbEFnUPo4G-YIzEv16RpPGaro,3546
48
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/UserMenuChoicesHandler.py,sha256=_fTCscTLEjoU-n12V9237uDN6Jf8nGCvGdBVkpD3Ap4,4947
49
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/Utility.py,sha256=Cn_QrVH40rQWkHW2e2NolE0b18qszvGXfVLdwAqD7sM,13562
50
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/WorkflowManager.py,sha256=YRUiZSq83SEx2qB0wTBDE4KFaYqEz1Qu4FSCAzl6xzU,5663
51
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/__init__.py,sha256=SWKun2AE-t74nmPIr69l-XnPMRnt9dV5P9jHquf2G2w,28
52
+ pkscreener-0.46.20250220.726.data/purelib/pkscreener/classes/keys.py,sha256=LQq_t1lSh0x4TbRCIDhoCil3xctgLLeVk5f2vgrl1tk,6789
53
+ pkscreener-0.46.20250220.726.dist-info/LICENSE,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
54
+ pkscreener-0.46.20250220.726.dist-info/METADATA,sha256=Dqk1oXmnHT_UsAGOxQfhAhr0F1A6I4iRQOCY8vtyJPA,34740
55
+ pkscreener-0.46.20250220.726.dist-info/WHEEL,sha256=aDUArjEbIuDQzblE24IvdIsBzRhJEjiXmuNUYQ-gpaA,104
56
+ pkscreener-0.46.20250220.726.dist-info/entry_points.txt,sha256=Pm30xm4sU7YFtFJUC-Te8VlqOvYAvWKFFA5AfQE0xGY,120
57
+ pkscreener-0.46.20250220.726.dist-info/top_level.txt,sha256=oIfcPPw58Q4KU-GDqp25dXbrtvxYXJBCo_em6i5aVvY,11
58
+ pkscreener-0.46.20250220.726.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- VERSION='0.46.20250219.724'
@@ -1,58 +0,0 @@
1
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/Disclaimer.txt,sha256=kBZQSQCFfL2kc1bijXWndZzkjMTtnpH_B7XtDPPMcuw,1396
2
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/LICENSE-Others.txt,sha256=WBslRYLBoqYg-vr25sS1c_UI7cuUnsGk0nIQLBzTWEE,271830
3
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/LICENSE.txt,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
4
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/LogoWM.txt,sha256=7Njnavpy_FKY4Iwbzv1JqsYMcOdkDSKAKXP3SAItKV0,14868
5
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/README.txt,sha256=j7IdFOIOKKgNT9AuYFsk6AbpxNku5JDLuqDaYPGwB5E,32701
6
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/__init__.py,sha256=aZ62qYACxsU8m8_5JkzNzos1lVFNcMGPRMgeddnUUiQ,1633
7
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/courbd.ttf,sha256=SKpnp-BRs7AZcdI83nencS3Q7xe0anbbP1YMOxLlEhU,791436
8
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/globals.py,sha256=q1FCCPcnJ-IethQk-V-cCRCIW6PtZuvKSCNmSrgfA_Y,241097
9
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/pkscreener.ini,sha256=QKs6j4qhyH37L_MdG3ztAIwgqs4c3qihuqDIoex-V2g,2391
10
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/pkscreenerbot.py,sha256=hi1qvI2yb9aNkTP4BAZyuVzpLf-_gR0JBaozGUIm32o,117163
11
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/pkscreenercli.py,sha256=GTF1zRdtYHwot3hW6CyF23nRl335MGwZalh5smM3xl0,57827
12
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/requirements.txt,sha256=dQ-B6I7-ueXFLeOmUgBNt99O8UaeNOFvW8-VRvxlx4M,1457
13
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/ArtTexts.py,sha256=LZ8ynyS8woliv8bM9Nq4aU0VCoJDJU0FgZk8V5zYPmg,19504
14
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/AssetsManager.py,sha256=SutbAZ4JiGhzN0tzfa9vNpHdW6alSL67Jz-knPPcqBw,33706
15
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/Backtest.py,sha256=wobBQgqVQhFNZlyJ2hgMXQqofrICc_3F0I5D66DUvGI,10530
16
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/Barometer.py,sha256=WPrgtIXb1nIbb-FnuRs-yvOQ5baNQRBgUR_zWg1moxk,9464
17
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/BaseScreeningStatistics.py,sha256=u5t1wf-HsZ8xEtprON55ehIR3F2LNNq8LvwgIrhYRmU,3000
18
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/CandlePatterns.py,sha256=gaswU2OeDa3JXjEafR2clUpKW5v8_1_tJuNPuTWsAss,17066
19
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/Changelog.py,sha256=vUOpca28OACNhavAmjBm4xco3u6fcHqWlnlmCJqO5Lk,1469
20
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/ConfigManager.py,sha256=THcfBgua5hr1Pv7AwEDBu2yurCNteGM04jY3Fr_MeBg,53565
21
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/ConsoleMenuUtility.py,sha256=fyR7dEsAaEWEe5SyaVgwLPdU4h4pI8SozUhsPZXShpg,10037
22
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/ConsoleUtility.py,sha256=TrEnTT4pmsBpEYdwD2oAtNqNG_drPe1LVkhthP2540I,12096
23
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/Fetcher.py,sha256=WWX9_NO3JTw6_1Z9SqPm4Nj-4Uy_4PPYEMVyD5FLnVo,12336
24
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/GlobalStore.py,sha256=IzoYMybXpVVf6YwZi7j34rP-hNd7sMened8TAMu_-A8,3709
25
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/ImageUtility.py,sha256=mgJUzjrOKQ1mYV5P_ylhBnaF7ZgOO6ogjy22Rt49TNI,37032
26
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/MarketMonitor.py,sha256=GQOPLuUhgcrnVa0mI8ZvXqQ4vPFW00FHW_vMfICnko8,22079
27
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/MarketStatus.py,sha256=dNg8znbRpt7ID3U_1nmclD4zSLtveJeYeRbS0l6HLtE,3737
28
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/MenuOptions.py,sha256=iZb0zBs7lcP60cmuP7Z5xmXfNtTFcFH6ZWOuoileErE,64552
29
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/Messenger.py,sha256=peyY-YiqdC1bp-3DlJXILRa9HGYbqGVzf1wil0fYv98,8396
30
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/OtaUpdater.py,sha256=_7-nFAC-vAcmZ1Nwi5g5tfp7hKQQPuLUnBCOzrwC39g,13491
31
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/PKAnalytics.py,sha256=_X-2OFw2yQVmXlEIRsnBVNy9fhYyxqt0BOqADD4v08U,5246
32
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/PKDataService.py,sha256=BipM8Z4rS6h12cF6VWv_u4Z8ee7psMFd1yUojejW1Ag,3393
33
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/PKDemoHandler.py,sha256=r4KrZF8TaOu1J0nu8sUsgWEvnbndboWQQvz69GOy1Fk,2207
34
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py,sha256=T7S0DRv4Tqg77S5CyTWQUgpIAtx0NEtSVAplkynS2YM,33833
35
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/PKPremiumHandler.py,sha256=r16-u9fyc0ftgnSnZnz-JusTfEzyQIyKkvgbPuSd7W4,5611
36
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/PKScanRunner.py,sha256=EPLo2euBMfA9omnqrr5pXv2h9KzTcPZM-PXRFI26LSo,26791
37
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/PKScheduledTaskProgress.py,sha256=h19ZuxoalB50pnZjntFh12b9mBozvMqhKYq6TL18vo4,1657
38
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/PKScheduler.py,sha256=qThoz0yXLmHEWAiD_TdkIrzJb37b_m830JJFrkN1Tio,8814
39
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/PKSpreadsheets.py,sha256=1I7YGGPPY879K5JeTZ_d1FNCpjloh6TZrx91JlwT20o,8298
40
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/PKTask.py,sha256=4q87uD2cXvp0AbP6I73xPP39F0mfnpHQutsxxqpnxJM,1867
41
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/PKUserRegistration.py,sha256=ZbnPzgvT5Je9X0Dm6bewSp8u7Fj_szNucaYnit_AtCg,11465
42
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/Pktalib.py,sha256=xketnpMVDGHOFg47LFavaU-agWy370VanYWyzzuLY8c,33386
43
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/Portfolio.py,sha256=JZ93n3Zk9nkSFaX-lHyQiFnavHVmHPFoy-L_4gugj54,13895
44
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/PortfolioXRay.py,sha256=4MjXqBAVUlfN4w5tTmgEnQGMoy0hFu_uaVgrmai1fN4,48339
45
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/ScreeningStatistics.py,sha256=LteoSl8r4mI2GMvVKAmdmzMe-Axy3jeyNAaIsgp48s4,221101
46
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/StockScreener.py,sha256=F0SWa1DSTgYdSWnkPTR9kmOKgHLtaqNMCtJP8yZkDnE,67252
47
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/StockSentiment.py,sha256=WL7TBAHDSIN5cgZ9uTbbEFnUPo4G-YIzEv16RpPGaro,3546
48
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/UserMenuChoicesHandler.py,sha256=_fTCscTLEjoU-n12V9237uDN6Jf8nGCvGdBVkpD3Ap4,4947
49
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/Utility.py,sha256=Cn_QrVH40rQWkHW2e2NolE0b18qszvGXfVLdwAqD7sM,13562
50
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/WorkflowManager.py,sha256=YRUiZSq83SEx2qB0wTBDE4KFaYqEz1Qu4FSCAzl6xzU,5663
51
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/__init__.py,sha256=npnd5GHevI-lDGnKuTnIRgZwkze4Fheuxyktq6oQ0Uw,28
52
- pkscreener-0.46.20250219.724.data/purelib/pkscreener/classes/keys.py,sha256=LQq_t1lSh0x4TbRCIDhoCil3xctgLLeVk5f2vgrl1tk,6789
53
- pkscreener-0.46.20250219.724.dist-info/LICENSE,sha256=CdnyGrl-xRYX67ZkdERZWHr6BlTxOyg8Z8sK1XQ5Xsg,1078
54
- pkscreener-0.46.20250219.724.dist-info/METADATA,sha256=gfhEqVWX7UFi8hHsYP7tTilYqB5YGZPFD3bOoUhSwsI,34639
55
- pkscreener-0.46.20250219.724.dist-info/WHEEL,sha256=aDUArjEbIuDQzblE24IvdIsBzRhJEjiXmuNUYQ-gpaA,104
56
- pkscreener-0.46.20250219.724.dist-info/entry_points.txt,sha256=Pm30xm4sU7YFtFJUC-Te8VlqOvYAvWKFFA5AfQE0xGY,120
57
- pkscreener-0.46.20250219.724.dist-info/top_level.txt,sha256=oIfcPPw58Q4KU-GDqp25dXbrtvxYXJBCo_em6i5aVvY,11
58
- pkscreener-0.46.20250219.724.dist-info/RECORD,,