pkscreener 0.46.20250224.738__tar.gz → 0.46.20250225.741__tar.gz

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 (65) hide show
  1. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/PKG-INFO +10 -8
  2. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/README.md +5 -5
  3. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/README.txt +5 -5
  4. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/AssetsManager.py +1 -1
  5. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/ConfigManager.py +1 -1
  6. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/Fetcher.py +27 -2
  7. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/PKMarketOpenCloseAnalyser.py +6 -2
  8. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/Utility.py +6 -1
  9. pkscreener-0.46.20250225.741/pkscreener/classes/__init__.py +1 -0
  10. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/globals.py +3 -2
  11. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/pkscreenerbot.py +9 -1
  12. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/requirements.txt +3 -1
  13. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener.egg-info/PKG-INFO +10 -8
  14. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener.egg-info/requires.txt +3 -1
  15. pkscreener-0.46.20250224.738/pkscreener/classes/__init__.py +0 -1
  16. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/LICENSE +0 -0
  17. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/Disclaimer.txt +0 -0
  18. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/LICENSE-Others.txt +0 -0
  19. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/LICENSE.txt +0 -0
  20. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/LogoWM.txt +0 -0
  21. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/__init__.py +0 -0
  22. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/ArtTexts.py +0 -0
  23. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/Backtest.py +0 -0
  24. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/Barometer.py +0 -0
  25. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/BaseScreeningStatistics.py +0 -0
  26. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/CandlePatterns.py +0 -0
  27. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/Changelog.py +0 -0
  28. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/ConsoleMenuUtility.py +0 -0
  29. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/ConsoleUtility.py +0 -0
  30. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/GlobalStore.py +0 -0
  31. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/ImageUtility.py +0 -0
  32. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/MarketMonitor.py +0 -0
  33. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/MarketStatus.py +0 -0
  34. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/MenuOptions.py +0 -0
  35. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/Messenger.py +0 -0
  36. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/OtaUpdater.py +0 -0
  37. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/PKAnalytics.py +0 -0
  38. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/PKDataService.py +0 -0
  39. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/PKDemoHandler.py +0 -0
  40. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/PKPremiumHandler.py +0 -0
  41. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/PKScanRunner.py +0 -0
  42. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/PKScheduledTaskProgress.py +0 -0
  43. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/PKScheduler.py +0 -0
  44. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/PKSpreadsheets.py +0 -0
  45. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/PKTask.py +0 -0
  46. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/PKUserRegistration.py +0 -0
  47. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/Pktalib.py +0 -0
  48. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/Portfolio.py +0 -0
  49. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/PortfolioXRay.py +0 -0
  50. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/ScreeningStatistics.py +0 -0
  51. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/StockScreener.py +0 -0
  52. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/StockSentiment.py +0 -0
  53. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/UserMenuChoicesHandler.py +0 -0
  54. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/WorkflowManager.py +0 -0
  55. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/classes/keys.py +0 -0
  56. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/courbd.ttf +0 -0
  57. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/pkscreener.ini +0 -0
  58. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener/pkscreenercli.py +0 -0
  59. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener.egg-info/SOURCES.txt +0 -0
  60. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener.egg-info/dependency_links.txt +0 -0
  61. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener.egg-info/entry_points.txt +0 -0
  62. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener.egg-info/not-zip-safe +0 -0
  63. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/pkscreener.egg-info/top_level.txt +0 -0
  64. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/setup.cfg +0 -0
  65. {pkscreener-0.46.20250224.738 → pkscreener-0.46.20250225.741}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pkscreener
3
- Version: 0.46.20250224.738
3
+ Version: 0.46.20250225.741
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.20250224.738.zip
6
+ Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250225.741.zip
7
7
  Author: pkjmesra
8
8
  Author-email: pkjmesra@gmail.com
9
9
  License: OSI Approved (MIT)
@@ -33,13 +33,15 @@ Requires-Dist: pandas
33
33
  Requires-Dist: pandas_ta
34
34
  Requires-Dist: pefile<2024.8.26,>=2023.2.7
35
35
  Requires-Dist: Pillow
36
- Requires-Dist: PKDevTools>=0.13.20250126.243
36
+ Requires-Dist: PKDevTools>=0.13.20250126.245
37
37
  Requires-Dist: PKNSETools>=0.1.20250122.139
38
38
  Requires-Dist: Pyarrow
39
39
  Requires-Dist: pyppeteer
40
40
  Requires-Dist: pytz
41
41
  Requires-Dist: python-telegram-bot<20.0,>=13.4
42
42
  Requires-Dist: requests_cache
43
+ Requires-Dist: requests_ratelimiter
44
+ Requires-Dist: pyrate_limiter
43
45
  Requires-Dist: rich
44
46
  Requires-Dist: scikit-learn
45
47
  Requires-Dist: scipy
@@ -392,15 +394,15 @@ After you have finished the run, go to that copied path, zip the contents of the
392
394
  [MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
393
395
  [MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
394
396
  [Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
395
- [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250224.737/pkscreenercli.exe
397
+ [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/pkscreenercli.exe
396
398
  [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.20250224.737/pkscreenercli_x64.bin
399
+ [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/pkscreenercli_x64.bin
398
400
  [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.20250224.737/pkscreenercli_arm64.bin
401
+ [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/pkscreenercli_arm64.bin
400
402
  [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.20250224.737/pkscreenercli_x64.run
403
+ [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/pkscreenercli_x64.run
402
404
  [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.20250224.737/pkscreenercli_arm64.run
405
+ [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/pkscreenercli_arm64.run
404
406
  [GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
405
407
  [GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
406
408
  [pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
@@ -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.20250224.737/pkscreenercli.exe
331
+ [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/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.20250224.737/pkscreenercli_x64.bin
333
+ [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/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.20250224.737/pkscreenercli_arm64.bin
335
+ [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/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.20250224.737/pkscreenercli_x64.run
337
+ [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/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.20250224.737/pkscreenercli_arm64.run
339
+ [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/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
@@ -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.20250224.737/pkscreenercli.exe
331
+ [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/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.20250224.737/pkscreenercli_x64.bin
333
+ [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/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.20250224.737/pkscreenercli_arm64.bin
335
+ [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/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.20250224.737/pkscreenercli_x64.run
337
+ [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/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.20250224.737/pkscreenercli_arm64.run
339
+ [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/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
@@ -562,7 +562,7 @@ class PKAssetsManager:
562
562
  f"Stock data cache file:{cache_file} on server has length ->{filesize} {'Mb' if chunksize >= MB else ('Kb' if chunksize >= KB else 'bytes')}"
563
563
  )
564
564
  if not retrial and not stockDataLoaded:
565
- # Don't try for more than once.
565
+ # Don't try for more than once.
566
566
  stockDict = PKAssetsManager.loadStockData(
567
567
  stockDict,
568
568
  configManager,
@@ -105,7 +105,7 @@ class tools(SingletonMixin, metaclass=SingletonType):
105
105
  self.vcpLegsToCheckForConsolidation = 3
106
106
  self.enableAdditionalVCPFilters = True
107
107
  self.enableAdditionalVCPEMAFilters = False
108
- self.enableUsageAnalytics = False
108
+ self.enableUsageAnalytics = True
109
109
  # This determines how many days apart the backtest calculations are run.
110
110
  # For example, for weekly backtest calculations, set this to 5 (5 days = 1 week)
111
111
  # For fortnightly, set this to 10 and so on (10 trading sessions = 2 weeks)
@@ -26,7 +26,7 @@
26
26
  import os
27
27
  import sys
28
28
  import warnings
29
-
29
+ import logging
30
30
  from time import sleep
31
31
  warnings.simplefilter("ignore", DeprecationWarning)
32
32
  warnings.simplefilter("ignore", FutureWarning)
@@ -59,7 +59,26 @@ from pkscreener.classes.PKTask import PKTask
59
59
  from PKDevTools.classes.OutputControls import OutputControls
60
60
  # This Class Handles Fetching of Stock Data over the internet
61
61
 
62
+ from requests import Session
63
+ from requests_cache import CacheMixin, SQLiteCache
64
+ from requests_ratelimiter import LimiterMixin, MemoryQueueBucket
65
+ from pyrate_limiter import Duration, RequestRate, Limiter
66
+ class CachedLimiterSession(CacheMixin, LimiterMixin, Session):
67
+ pass
62
68
 
69
+ # https://help.yahooinc.com/dsp-api/docs/rate-limits
70
+ # Define multiple rate limits
71
+ TRY_FACTOR = 50
72
+ yf_limiter = Limiter(
73
+ RequestRate(60*TRY_FACTOR, Duration.MINUTE), # Max 60 requests per minute
74
+ RequestRate(360*TRY_FACTOR, Duration.HOUR), # Max 360 requests per hour
75
+ RequestRate(8000*TRY_FACTOR, Duration.DAY) # Max 8000 requests per day
76
+ )
77
+ yf_session = CachedLimiterSession(
78
+ limiter=yf_limiter,
79
+ bucket_class=MemoryQueueBucket,
80
+ backend=SQLiteCache("yfinance.cache"),
81
+ )
63
82
  class screenerStockDataFetcher(nseStockDataFetcher):
64
83
  _tickersInfoDict={}
65
84
  def fetchStockDataWithArgs(self, *args):
@@ -132,6 +151,10 @@ class screenerStockDataFetcher(nseStockDataFetcher):
132
151
  if yfVersion == "0.2.28":
133
152
  YfData.user_agent_headers = {
134
153
  'User-Agent': random.choice(USER_AGENTS)}
154
+ if "PKDevTools_Default_Log_Level" in os.environ.keys():
155
+ from yfinance import utils
156
+ yflogger = utils.get_yf_logger()
157
+ yflogger.setLevel(int(os.environ.get("PKDevTools_Default_Log_Level"),logging.DEBUG))
135
158
  data = yf.download(
136
159
  tickers=stockCode,
137
160
  period=period,
@@ -144,7 +167,8 @@ class screenerStockDataFetcher(nseStockDataFetcher):
144
167
  start=start,
145
168
  end=end,
146
169
  auto_adjust=True,
147
- threads=len(stockCode) if not isinstance(stockCode,str) else True
170
+ threads=len(stockCode) if not isinstance(stockCode,str) else True,
171
+ session=yf_session
148
172
  )
149
173
  if isinstance(stockCode,str):
150
174
  if (data is None or data.empty):
@@ -188,6 +212,7 @@ class screenerStockDataFetcher(nseStockDataFetcher):
188
212
  default_logger().debug(e,exc_info=True)
189
213
  pass
190
214
  except YFRateLimitError as e:
215
+ default_logger().debug(f"YFRateLimitError Hit! \n{e}")
191
216
  # if attempt <= 2:
192
217
  # default_logger().debug(f"YFRateLimitError Hit! Going for attempt : {attempt+1}")
193
218
  # sleep(attempt*2) # Exponential backoff
@@ -87,12 +87,16 @@ class PKMarketOpenCloseAnalyser:
87
87
  daily_exists, daily_cache_file, stockDict = PKMarketOpenCloseAnalyser.ensureDailyStockDataExists(listStockCodes=listStockCodes)
88
88
  updatedCandleData = PKMarketOpenCloseAnalyser.updatedCandleData
89
89
  allDailyCandles = PKMarketOpenCloseAnalyser.allDailyCandles
90
+ if updatedCandleData is not None and len(updatedCandleData) < 1:
91
+ updatedCandleData = None
92
+ if allDailyCandles is not None and len(allDailyCandles) < 1:
93
+ allDailyCandles = None
90
94
  if ((int_exists or len(stockDictInt) > 0) and (daily_exists or len(stockDict) > 0)) and (updatedCandleData is None or allDailyCandles is None):
91
95
  allDailyCandles = PKMarketOpenCloseAnalyser.getLatestDailyCandleData(daily_cache_file,stockDict)
92
96
  morningIntradayCandle = PKMarketOpenCloseAnalyser.getIntradayCandleFromMorning(int_cache_file,sliceWindowDatetime=sliceWindowDatetime,stockDictInt=stockDictInt)
93
97
  updatedCandleData = PKMarketOpenCloseAnalyser.combineDailyStockDataWithMorningSimulation(allDailyCandles,morningIntradayCandle)
94
- # PKMarketOpenCloseAnalyser.updatedCandleData = updatedCandleData
95
- # PKMarketOpenCloseAnalyser.allDailyCandles = allDailyCandles
98
+ PKMarketOpenCloseAnalyser.updatedCandleData = updatedCandleData
99
+ PKMarketOpenCloseAnalyser.allDailyCandles = allDailyCandles
96
100
  AssetsManager.PKAssetsManager.saveStockData(updatedCandleData,PKMarketOpenCloseAnalyser.configManager,1,False,False, True)
97
101
  return updatedCandleData, allDailyCandles
98
102
 
@@ -173,7 +173,12 @@ class tools:
173
173
  #'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
174
174
  }
175
175
  resp = fetcher.fetchURL(cache_url, headers=headers, stream=True)
176
- if (resp is None or (resp is not None and resp.status_code != 200)) and (repoOwner=="pkjmesra" and directory=="actions-data-download"):
176
+ filesize = 0
177
+ if resp is not None and resp.status_code == 200:
178
+ contentLength = resp.headers.get("content-length")
179
+ filesize = int(contentLength) if contentLength is not None else 0
180
+ # File size should be more than at least 10 MB
181
+ if (resp is None or (resp is not None and resp.status_code != 200) or filesize <= 10*1024*1024) and (repoOwner=="pkjmesra" and directory=="actions-data-download"):
177
182
  return tools.tryFetchFromServer(cache_file,repoOwner=repoName)
178
183
  return resp
179
184
 
@@ -0,0 +1 @@
1
+ VERSION='0.46.20250225.741'
@@ -1874,7 +1874,7 @@ def main(userArgs=None,optionalFinalOutcome_df=None):
1874
1874
 
1875
1875
  if str(menuOption).upper() == "C":
1876
1876
  stockDictPrimary,endOfdayCandles = PKMarketOpenCloseAnalyser.getStockDataForSimulation()
1877
- if stockDictPrimary is None or endOfdayCandles is None:
1877
+ if stockDictPrimary is None or endOfdayCandles is None or len(stockDictPrimary) < 1 or len(endOfdayCandles) < 1:
1878
1878
  OutputControls().printOutput(f"Cannot proceed! Stock data is unavailable. Please check the error logs/messages !")
1879
1879
  return None, None
1880
1880
  if indexOption > 0:
@@ -1897,7 +1897,8 @@ def main(userArgs=None,optionalFinalOutcome_df=None):
1897
1897
  userPassedArgs.options = (f"{userPassedArgs.options}:" if len(userPassedArgs.options) > 0 else '') + f"{selectedChoice[choice]}"
1898
1898
  if userPassedArgs.pipedmenus is not None:
1899
1899
  return addOrRunPipedMenus()
1900
-
1900
+
1901
+ loadedStockData = loadedStockData and stockDictPrimary is not None and len(stockDictPrimary) > 0
1901
1902
  if (menuOption in ["X", "B", "G", "S", "F"] and not loadedStockData) or (
1902
1903
  # not downloadOnly
1903
1904
  # and not PKDateUtilities.isTradingTime()
@@ -1361,7 +1361,8 @@ def default_markup(user=None,monitorIndex=0):
1361
1361
  inlineMenus = []
1362
1362
  lastRowMenus = []
1363
1363
  rowIndex = 0
1364
- iconDict = {"X":"🕵️‍♂️ 🔍 ","B":"📈 🎯 ","P":"🧨 💥 ","MI":"","DV":"","VS":"🔔 📣 ","start":"🟢 🏁 ", "HS":"🕵️‍♂️ "}
1364
+ # https://emojidb.org/otp-emojis
1365
+ iconDict = {"X":"🕵️‍♂️ 🔍 ","B":"📈 🎯 ","P":"🧨 💥 ","MI":"","DV":"","VS":"🔔 📣 ","start":"🟢 🏁 ", "HS":"🕵️‍♂️ ","otp":"🔐 "}
1365
1366
  for mnu in mns:
1366
1367
  if mnu.menuKey[0:2] in TOP_LEVEL_SCANNER_MENUS:
1367
1368
  rowIndex +=1
@@ -1386,6 +1387,12 @@ def default_markup(user=None,monitorIndex=0):
1386
1387
  callback_data="start",
1387
1388
  )
1388
1389
  )
1390
+ lastRowMenus.append(
1391
+ InlineKeyboardButton(
1392
+ iconDict.get("otp") + "Get OTP",
1393
+ callback_data="OTP",
1394
+ )
1395
+ )
1389
1396
  if len(inlineMenus) > 0:
1390
1397
  keyboard.append(inlineMenus)
1391
1398
  keyboard.append(lastRowMenus)
@@ -2284,6 +2291,7 @@ def runpkscreenerbot(availability=True) -> None:
2284
2291
  states={
2285
2292
  START_ROUTES: [
2286
2293
  CallbackQueryHandler(XScanners, pattern="^" + str("CX") + "$"),
2294
+ CallbackQueryHandler(otp, pattern="^" + str("OTP") + "$"),
2287
2295
  CallbackQueryHandler(XScanners, pattern="^" + str("CB") + "$"),
2288
2296
  CallbackQueryHandler(PScanners, pattern="^" + str("CP") + "$"),
2289
2297
  CallbackQueryHandler(XScanners, pattern="^" + str("CMI_")),
@@ -19,13 +19,15 @@ pandas_ta #>=0.3.14b0
19
19
  # and https://github.com/pyinstaller/pyinstaller/issues/7269
20
20
  pefile>=2023.2.7,<2024.8.26
21
21
  Pillow #>=9.5.0,<=9.5.0 # Keep at this version because getsize_multiline is deprecated/removed in higher versions
22
- PKDevTools>=0.13.20250126.243
22
+ PKDevTools>=0.13.20250126.245
23
23
  PKNSETools>=0.1.20250122.139
24
24
  Pyarrow #>=17.0.0
25
25
  pyppeteer #>=2.0.0
26
26
  pytz #>=2024.2
27
27
  python-telegram-bot>=13.4,<20.0
28
28
  requests_cache #>=1.2.1
29
+ requests_ratelimiter
30
+ pyrate_limiter
29
31
  rich #>=13.9.2
30
32
  scikit-learn #>=1.5.2
31
33
  scipy #<=1.12.0 # cdflib removed from #>=1.13.0 which breaks the build
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pkscreener
3
- Version: 0.46.20250224.738
3
+ Version: 0.46.20250225.741
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.20250224.738.zip
6
+ Download-URL: https://github.com/pkjmesra/pkscreener/archive/v0.46.20250225.741.zip
7
7
  Author: pkjmesra
8
8
  Author-email: pkjmesra@gmail.com
9
9
  License: OSI Approved (MIT)
@@ -33,13 +33,15 @@ Requires-Dist: pandas
33
33
  Requires-Dist: pandas_ta
34
34
  Requires-Dist: pefile<2024.8.26,>=2023.2.7
35
35
  Requires-Dist: Pillow
36
- Requires-Dist: PKDevTools>=0.13.20250126.243
36
+ Requires-Dist: PKDevTools>=0.13.20250126.245
37
37
  Requires-Dist: PKNSETools>=0.1.20250122.139
38
38
  Requires-Dist: Pyarrow
39
39
  Requires-Dist: pyppeteer
40
40
  Requires-Dist: pytz
41
41
  Requires-Dist: python-telegram-bot<20.0,>=13.4
42
42
  Requires-Dist: requests_cache
43
+ Requires-Dist: requests_ratelimiter
44
+ Requires-Dist: pyrate_limiter
43
45
  Requires-Dist: rich
44
46
  Requires-Dist: scikit-learn
45
47
  Requires-Dist: scipy
@@ -392,15 +394,15 @@ After you have finished the run, go to that copied path, zip the contents of the
392
394
  [MADE-IN-INDIA-badge]: https://img.shields.io/badge/MADE%20WITH%20%E2%9D%A4%20IN-INDIA-orange
393
395
  [MADE-IN-INDIA]: https://en.wikipedia.org/wiki/India
394
396
  [Windows-badge]: https://img.shields.io/badge/Windows-0078D6?logo=windows&logoColor=white
395
- [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250224.737/pkscreenercli.exe
397
+ [Windows]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/pkscreenercli.exe
396
398
  [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.20250224.737/pkscreenercli_x64.bin
399
+ [Linux_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/pkscreenercli_x64.bin
398
400
  [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.20250224.737/pkscreenercli_arm64.bin
401
+ [Linux_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/pkscreenercli_arm64.bin
400
402
  [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.20250224.737/pkscreenercli_x64.run
403
+ [Mac OS_x64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/pkscreenercli_x64.run
402
404
  [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.20250224.737/pkscreenercli_arm64.run
405
+ [Mac OS_arm64]: https://github.com/pkjmesra/PKScreener/releases/download/0.46.20250225.739/pkscreenercli_arm64.run
404
406
  [GitHub release (latest by date)-badge]: https://img.shields.io/github/v/release/pkjmesra/PKScreener
405
407
  [GitHub release (latest by date)]: https://github.com/pkjmesra/PKScreener/releases/latest
406
408
  [pypi-badge]: https://img.shields.io/pypi/v/pkscreener.svg?style=flat-square
@@ -15,13 +15,15 @@ pandas
15
15
  pandas_ta
16
16
  pefile<2024.8.26,>=2023.2.7
17
17
  Pillow
18
- PKDevTools>=0.13.20250126.243
18
+ PKDevTools>=0.13.20250126.245
19
19
  PKNSETools>=0.1.20250122.139
20
20
  Pyarrow
21
21
  pyppeteer
22
22
  pytz
23
23
  python-telegram-bot<20.0,>=13.4
24
24
  requests_cache
25
+ requests_ratelimiter
26
+ pyrate_limiter
25
27
  rich
26
28
  scikit-learn
27
29
  scipy
@@ -1 +0,0 @@
1
- VERSION='0.46.20250224.738'