pkscreener 0.46.20250810.756__cp312-cp312-win_amd64.whl → 0.46.20250908.764__cp312-cp312-win_amd64.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.
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/LICENSE-Others.txt +1 -1
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/README.txt +6 -6
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/__init__.py +2 -2
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/AssetsManager.py +13 -29
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/Backtest.py +5 -5
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/CandlePatterns.py +23 -23
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/ConfigManager.py +13 -1
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/ConsoleUtility.py +1 -1
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/Fetcher.py +26 -20
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/ImageUtility.py +1 -1
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/MarketMonitor.py +6 -6
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/MarketStatus.py +3 -2
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/PKMarketOpenCloseAnalyser.py +14 -14
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/PKScanRunner.py +2 -2
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/Pktalib.py +36 -36
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/PortfolioXRay.py +5 -5
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/ScreeningStatistics.py +457 -445
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/StockScreener.py +47 -34
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/Utility.py +4 -3
- pkscreener-0.46.20250908.764.data/purelib/pkscreener/classes/__init__.py +1 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/globals.py +25 -23
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/pkscreenerbot.py +1 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/pkscreenercli.py +9 -9
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/requirements.txt +3 -3
- {pkscreener-0.46.20250810.756.dist-info → pkscreener-0.46.20250908.764.dist-info}/METADATA +8 -8
- pkscreener-0.46.20250908.764.dist-info/RECORD +58 -0
- pkscreener-0.46.20250810.756.data/purelib/pkscreener/classes/__init__.py +0 -1
- pkscreener-0.46.20250810.756.dist-info/RECORD +0 -58
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/Disclaimer.txt +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/LICENSE.txt +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/LogoWM.txt +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/ArtTexts.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/Barometer.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/BaseScreeningStatistics.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/Changelog.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/ConsoleMenuUtility.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/GlobalStore.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/MenuOptions.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/Messenger.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/OtaUpdater.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/PKAnalytics.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/PKDataService.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/PKDemoHandler.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/PKPremiumHandler.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/PKScheduledTaskProgress.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/PKScheduler.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/PKSpreadsheets.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/PKTask.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/PKUserRegistration.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/Portfolio.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/StockSentiment.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/UserMenuChoicesHandler.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/WorkflowManager.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/classes/keys.py +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/courbd.ttf +0 -0
- {pkscreener-0.46.20250810.756.data → pkscreener-0.46.20250908.764.data}/purelib/pkscreener/pkscreener.ini +0 -0
- {pkscreener-0.46.20250810.756.dist-info → pkscreener-0.46.20250908.764.dist-info}/WHEEL +0 -0
- {pkscreener-0.46.20250810.756.dist-info → pkscreener-0.46.20250908.764.dist-info}/entry_points.txt +0 -0
- {pkscreener-0.46.20250810.756.dist-info → pkscreener-0.46.20250908.764.dist-info}/licenses/LICENSE +0 -0
- {pkscreener-0.46.20250810.756.dist-info → pkscreener-0.46.20250908.764.dist-info}/top_level.txt +0 -0
@@ -62,6 +62,7 @@ class MarketStatus(SingletonMixin, metaclass=SingletonType):
|
|
62
62
|
self.attributes["marketStatus"] = status
|
63
63
|
|
64
64
|
def getMarketStatus(self, progress=None, task_id=0, exchangeSymbol="^NSEI",namedOnly=False):
|
65
|
+
return "NA"
|
65
66
|
lngStatus = ""
|
66
67
|
try:
|
67
68
|
# if not 'pytest' in sys.modules:
|
@@ -71,9 +72,9 @@ class MarketStatus(SingletonMixin, metaclass=SingletonType):
|
|
71
72
|
with SuppressOutput(suppress_stdout=suppressLogs, suppress_stderr=suppressLogs):
|
72
73
|
if progress:
|
73
74
|
progress[task_id] = {"progress": 0, "total": 1}
|
74
|
-
_,lngStatus,_ = MarketStatus.nseFetcher.capitalMarketStatus(exchange=exchangeSymbol)
|
75
|
+
_,lngStatus,_ = "","TODO","" # MarketStatus.nseFetcher.capitalMarketStatus(exchange=exchangeSymbol)
|
75
76
|
if exchangeSymbol in ["^NSEI","^BSESN"] and not namedOnly:
|
76
|
-
_,bseStatus,_ = MarketStatus.nseFetcher.capitalMarketStatus(exchange="^BSESN")
|
77
|
+
_,bseStatus,_ = "","TODO","" #MarketStatus.nseFetcher.capitalMarketStatus(exchange="^BSESN")
|
77
78
|
lngStatus = f"{lngStatus} | {bseStatus}"
|
78
79
|
if progress:
|
79
80
|
progress[task_id] = {"progress": 1, "total": 1}
|
@@ -288,9 +288,9 @@ class PKMarketOpenCloseAnalyser:
|
|
288
288
|
if df is not None and len(df) > 0:
|
289
289
|
close = PKMarketOpenCloseAnalyser.getMorningClose(df)
|
290
290
|
adjClose = df["Adj Close"][-1] if "Adj Close" in df.columns else close
|
291
|
-
combinedCandle = {"
|
292
|
-
"
|
293
|
-
"Adj Close":adjClose,"
|
291
|
+
combinedCandle = {"open":PKMarketOpenCloseAnalyser.getMorningOpen(df), "high":max(df["high"]),
|
292
|
+
"low":min(df["low"]),"close":close,
|
293
|
+
"Adj Close":adjClose,"volume":sum(df["volume"])}
|
294
294
|
tradingDate = df.index[-1] #PKDateUtilities.tradingDate()
|
295
295
|
timestamp = datetime.datetime.strptime(tradingDate.strftime("%Y-%m-%d %H:%M:%S"),"%Y-%m-%d %H:%M:%S")
|
296
296
|
df = pd.DataFrame([combinedCandle], columns=df.columns, index=[timestamp])
|
@@ -304,29 +304,29 @@ class PKMarketOpenCloseAnalyser:
|
|
304
304
|
|
305
305
|
def getMorningOpen(df):
|
306
306
|
try:
|
307
|
-
open = df["
|
307
|
+
open = df["open"][0]
|
308
308
|
except KeyError: # pragma: no cover
|
309
|
-
open = df["
|
309
|
+
open = df["open"][df.index.values[0]]
|
310
310
|
index = 0
|
311
311
|
while np.isnan(open) and index < len(df):
|
312
312
|
try:
|
313
|
-
open = df["
|
313
|
+
open = df["open"][index + 1]
|
314
314
|
except KeyError: # pragma: no cover
|
315
|
-
open = df["
|
315
|
+
open = df["open"][df.index.values[index + 1]]
|
316
316
|
index += 1
|
317
317
|
return open
|
318
318
|
|
319
319
|
def getMorningClose(df):
|
320
320
|
try:
|
321
|
-
close = df["
|
321
|
+
close = df["close"][-1]
|
322
322
|
except KeyError: # pragma: no cover
|
323
|
-
close = df["
|
323
|
+
close = df["close"][df.index.values[-1]]
|
324
324
|
index = len(df)
|
325
325
|
while np.isnan(close) and index >= 0:
|
326
326
|
try:
|
327
|
-
close = df["
|
327
|
+
close = df["close"][index - 1]
|
328
328
|
except KeyError: # pragma: no cover
|
329
|
-
close = df["
|
329
|
+
close = df["close"][df.index.values[index - 1]]
|
330
330
|
index -= 1
|
331
331
|
return close
|
332
332
|
|
@@ -459,15 +459,15 @@ class PKMarketOpenCloseAnalyser:
|
|
459
459
|
highTS, highRow = scrStats.findIntradayHighCrossover(df=df)
|
460
460
|
# buySell_df = scrStats.computeBuySellSignals(updatedCandleData[stock]["data"])
|
461
461
|
# OutputControls().printOutput(buySell_df)
|
462
|
-
dayHighLTP = dayHighLTP if pd.notna(dayHighLTP) else highRow["
|
462
|
+
dayHighLTP = dayHighLTP if pd.notna(dayHighLTP) else highRow["high"][-1]
|
463
463
|
sellTimestamps.append(PKDateUtilities.utc_to_ist(ts).strftime("%H:%M"))
|
464
464
|
dayHighTimestamps.append(PKDateUtilities.utc_to_ist(highTS).strftime("%H:%M"))
|
465
|
-
sellLTPs.append(row["
|
465
|
+
sellLTPs.append(row["high"][-1])
|
466
466
|
eodLTPs.append(round(endOfDayLTP,2))
|
467
467
|
dayHighLTPs.append(round(dayHighLTP,2))
|
468
468
|
eodDiffs.append(round(endOfDayLTP - morningLTP,2))
|
469
469
|
dayHighDiffs.append(round(dayHighLTP - morningLTP,2))
|
470
|
-
sqrOffDiffs.append(round(row["
|
470
|
+
sqrOffDiffs.append(round(row["high"][-1] - morningLTP,2))
|
471
471
|
morningAlertLTPs.append(str(int(round(morningLTP,0))))
|
472
472
|
index += 1
|
473
473
|
except: # pragma: no cover
|
@@ -71,7 +71,7 @@ class PKScanRunner:
|
|
71
71
|
"52Wk-H",
|
72
72
|
"52Wk-L",
|
73
73
|
"%Chng",
|
74
|
-
"
|
74
|
+
"volume",
|
75
75
|
"MA-Signal",
|
76
76
|
"RSI",
|
77
77
|
"RSIi",
|
@@ -89,7 +89,7 @@ class PKScanRunner:
|
|
89
89
|
"52Wk-H",
|
90
90
|
"52Wk-L",
|
91
91
|
"%Chng",
|
92
|
-
"
|
92
|
+
"volume",
|
93
93
|
"MA-Signal",
|
94
94
|
"RSI",
|
95
95
|
"RSIi",
|
@@ -49,26 +49,26 @@ if Imports["talib"]:
|
|
49
49
|
+ colorText.END
|
50
50
|
)
|
51
51
|
try:
|
52
|
-
import
|
52
|
+
import pandas_ta_classic as talib
|
53
53
|
OutputControls().printOutput(
|
54
54
|
colorText.FAIL
|
55
|
-
+ f" [+] TA-Lib is not installed. Falling back on
|
55
|
+
+ f" [+] TA-Lib is not installed. Falling back on pandas_ta_classic.\n [+] For full coverage(candle patterns), you may wish to follow instructions from\n [+] {taLink}"
|
56
56
|
+ colorText.END
|
57
57
|
)
|
58
58
|
except: # pragma: no cover
|
59
59
|
OutputControls().printOutput(
|
60
60
|
colorText.FAIL
|
61
|
-
+ f" [+]
|
61
|
+
+ f" [+] pandas_ta_classic is not installed. Falling back on pandas_ta_classic also failed.\n [+] For full coverage(candle patterns), you may wish to follow instructions from\n [+] {taLink}"
|
62
62
|
+ colorText.END
|
63
63
|
)
|
64
64
|
pass
|
65
65
|
pass
|
66
66
|
else:
|
67
67
|
try:
|
68
|
-
import
|
68
|
+
import pandas_ta_classic as talib
|
69
69
|
OutputControls().printOutput(
|
70
70
|
colorText.FAIL
|
71
|
-
+ " [+] TA-Lib is not installed. Falling back on
|
71
|
+
+ " [+] TA-Lib is not installed. Falling back on pandas_ta_classic.\n [+] For full coverage(candle patterns), you may wish to follow instructions from\n [+] https://github.com/ta-lib/ta-lib-python"
|
72
72
|
+ colorText.END
|
73
73
|
)
|
74
74
|
sleep(3)
|
@@ -103,12 +103,12 @@ class pktalib:
|
|
103
103
|
# identify potential areas of support and resistance more accurately
|
104
104
|
# and make better trading decisions.
|
105
105
|
with pd.option_context('mode.chained_assignment', None):
|
106
|
-
df["VWAP_D"] = pktalib.VWAP(high=df["
|
106
|
+
df["VWAP_D"] = pktalib.VWAP(high=df["high"],low=df["low"],close=df["close"],volume=df["volume"],anchor="D")
|
107
107
|
# If we create a column 'typical_price', it should be identical with 'VWAP_D'
|
108
|
-
df['typical_price'] = (df[
|
109
|
-
tpp_d = ((df[
|
108
|
+
df['typical_price'] = (df["high"] + df["low"] + df["close"])/3
|
109
|
+
tpp_d = ((df["high"] + df["low"] + df["close"])*df["volume"])/3
|
110
110
|
df['anchored_VWAP'] = tpp_d.where(df.index >= anchored_date).groupby(
|
111
|
-
df.index >= anchored_date).cumsum()/df[
|
111
|
+
df.index >= anchored_date).cumsum()/df["volume"].where(
|
112
112
|
df.index >= anchored_date).groupby(
|
113
113
|
df.index >= anchored_date).cumsum()
|
114
114
|
return df['anchored_VWAP']
|
@@ -132,7 +132,7 @@ class pktalib:
|
|
132
132
|
@classmethod
|
133
133
|
def VWAP(self, high, low, close, volume,anchor=None):
|
134
134
|
try:
|
135
|
-
import
|
135
|
+
import pandas_ta_classic as talib
|
136
136
|
# Aligning the series
|
137
137
|
# high,low,close = pktalib.align_series(high, low, close, fill_value=0)
|
138
138
|
return talib.vwap(high, low, close, volume,anchor=anchor)
|
@@ -204,7 +204,7 @@ class pktalib:
|
|
204
204
|
@classmethod
|
205
205
|
def TriMA(self, close,length=10):
|
206
206
|
try:
|
207
|
-
import
|
207
|
+
import pandas_ta_classic as talib
|
208
208
|
return talib.trima(close=close, length=length)
|
209
209
|
except Exception: # pragma: no cover
|
210
210
|
# default_logger().debug(e, exc_info=True)
|
@@ -213,7 +213,7 @@ class pktalib:
|
|
213
213
|
@classmethod
|
214
214
|
def MACD(self, close, fast, slow, signal):
|
215
215
|
try:
|
216
|
-
# import
|
216
|
+
# import pandas_ta_classic as talib
|
217
217
|
return talib.macd(close, fast, slow, signal, talib=Imports["talib"])
|
218
218
|
except Exception: # pragma: no cover
|
219
219
|
# default_logger().debug(e, exc_info=True)
|
@@ -346,7 +346,7 @@ class pktalib:
|
|
346
346
|
def ichimoku(
|
347
347
|
self, df, tenkan=None, kijun=None, senkou=None, include_chikou=True, offset=None
|
348
348
|
):
|
349
|
-
import
|
349
|
+
import pandas_ta_classic as ta
|
350
350
|
|
351
351
|
ichimokudf, spandf = ta.ichimoku(
|
352
352
|
df["high"], df["low"], df["close"], tenkan, kijun, senkou, False, 26
|
@@ -355,10 +355,10 @@ class pktalib:
|
|
355
355
|
|
356
356
|
@classmethod
|
357
357
|
def supertrend(self, df, length=7, multiplier=3):
|
358
|
-
import
|
358
|
+
import pandas_ta_classic as ta
|
359
359
|
|
360
360
|
sti = ta.supertrend(
|
361
|
-
df["
|
361
|
+
df["high"], df["low"], df["close"], length=length, multiplier=multiplier
|
362
362
|
)
|
363
363
|
# trend, direction, long, short
|
364
364
|
# SUPERT_7_3.0 SUPERTd_7_3.0 SUPERTl_7_3.0 SUPERTs_7_3.0
|
@@ -373,17 +373,17 @@ class pktalib:
|
|
373
373
|
|
374
374
|
# @classmethod
|
375
375
|
# def momentum(self, df):
|
376
|
-
# df.loc[:,'MOM'] = talib.MOM(df.loc[:,
|
376
|
+
# df.loc[:,'MOM'] = talib.MOM(df.loc[:,"close"],2).apply(lambda x: round(x, 2))
|
377
377
|
# return df.loc[:,'MOM']
|
378
378
|
|
379
379
|
# @classmethod
|
380
380
|
# def get_dmi_df(self, df):
|
381
|
-
# df.loc[:,'DMI'] = talib.DX(df.loc[:,
|
381
|
+
# df.loc[:,'DMI'] = talib.DX(df.loc[:,"high"],df.loc[:,"low"],df.loc[:,"close"],timeperiod=14)
|
382
382
|
# return df.loc[:,'DMI']
|
383
383
|
|
384
384
|
# @classmethod
|
385
385
|
# def get_macd_df(self, df):
|
386
|
-
# df.loc[:,'macd(12)'], df.loc[:,'macdsignal(9)'], df.loc[:,'macdhist(26)'] = talib.MACD(df.loc[:,
|
386
|
+
# df.loc[:,'macd(12)'], df.loc[:,'macdsignal(9)'], df.loc[:,'macdhist(26)'] = talib.MACD(df.loc[:,"close"], fastperiod=12, slowperiod=26, signalperiod=9)
|
387
387
|
# df.loc[:,'macd(12)'] = df.loc[:,'macd(12)'].apply(lambda x: round(x, 3))
|
388
388
|
# df.loc[:,'macdsignal(9)']= df.loc[:,'macdsignal(9)'].apply(lambda x: round(x, 3))
|
389
389
|
# df.loc[:,'macdhist(26)'] = df.loc[:,'macdhist(26)'].apply(lambda x: round(x, 3))
|
@@ -391,48 +391,48 @@ class pktalib:
|
|
391
391
|
|
392
392
|
# @classmethod
|
393
393
|
# def get_sma_df(self, df):
|
394
|
-
# df.loc[:,'SMA(10)'] = talib.SMA(df.loc[:,
|
395
|
-
# df.loc[:,'SMA(50)'] = talib.SMA(df.loc[:,
|
396
|
-
# return df.loc[:,[
|
394
|
+
# df.loc[:,'SMA(10)'] = talib.SMA(df.loc[:,"close"],10).apply(lambda x: round(x, 2))
|
395
|
+
# df.loc[:,'SMA(50)'] = talib.SMA(df.loc[:,"close"],50).apply(lambda x: round(x, 2))
|
396
|
+
# return df.loc[:,["close",'SMA(10)', 'SMA(50)']]
|
397
397
|
|
398
398
|
# @classmethod
|
399
399
|
# def get_ema_df(self, df):
|
400
|
-
# df.loc[:,'EMA(9)'] = talib.EMA(df.loc[:,
|
401
|
-
# return df.loc[:,[
|
400
|
+
# df.loc[:,'EMA(9)'] = talib.EMA(df.loc[:,"close"], timeperiod = 9).apply(lambda x: round(x, 2))
|
401
|
+
# return df.loc[:,["close",'EMA(9)']]
|
402
402
|
|
403
403
|
# @classmethod
|
404
404
|
# def get_adx_df(self, df):
|
405
|
-
# df.loc[:,'ADX'] = talib.ADX(df.loc[:,
|
405
|
+
# df.loc[:,'ADX'] = talib.ADX(df.loc[:,"high"],df.loc[:,"low"], df.loc[:,"close"], timeperiod=14).apply(lambda x: round(x, 2))
|
406
406
|
# return df.loc[:,'ADX']
|
407
407
|
|
408
408
|
# @classmethod
|
409
409
|
# def get_bbands_df(self, df):
|
410
|
-
# df.loc[:,'BBands-U'], df.loc[:,'BBands-M'], df.loc[:,'BBands-L'] = talib.BBANDS(df.loc[:,
|
410
|
+
# df.loc[:,'BBands-U'], df.loc[:,'BBands-M'], df.loc[:,'BBands-L'] = talib.BBANDS(df.loc[:,"close"], timeperiod =20)
|
411
411
|
# df.loc[:,'BBands-U'] = df.loc[:,'BBands-U'].apply(lambda x: round(x, 2))
|
412
412
|
# df.loc[:,'BBands-M'] = df.loc[:,'BBands-M'].apply(lambda x: round(x, 2))
|
413
413
|
# df.loc[:,'BBands-L'] = df.loc[:,'BBands-L'].apply(lambda x: round(x, 2))
|
414
|
-
# return df[[
|
414
|
+
# return df[["close",'BBands-U','BBands-M','BBands-L']]
|
415
415
|
|
416
416
|
# @classmethod
|
417
417
|
# def get_obv_df(self, df):
|
418
|
-
# if (
|
418
|
+
# if ("close" not in df.keys()) or ("volume" not in df.keys()):
|
419
419
|
# return np.nan
|
420
|
-
# df.loc[:,'OBV'] = talib.OBV(df.loc[:,
|
420
|
+
# df.loc[:,'OBV'] = talib.OBV(df.loc[:,"close"], df.loc[:,"volume"])
|
421
421
|
# return df.loc[:,'OBV']
|
422
422
|
|
423
423
|
# @classmethod
|
424
424
|
# def get_atr_df(self, df):
|
425
|
-
# df.loc[:,'ATR'] = talib.ATR(df.loc[:,
|
425
|
+
# df.loc[:,'ATR'] = talib.ATR(df.loc[:,"high"], df.loc[:,"low"], df.loc[:,"close"], timeperiod=14).apply(lambda x: round(x, 2))
|
426
426
|
# return df.loc[:,'ATR']
|
427
427
|
|
428
428
|
# @classmethod
|
429
429
|
# def get_natr_df(self, df):
|
430
|
-
# df.loc[:,'NATR'] = talib.NATR(df.loc[:,
|
430
|
+
# df.loc[:,'NATR'] = talib.NATR(df.loc[:,"high"], df.loc[:,"low"], df.loc[:,"close"], timeperiod=14).apply(lambda x: round(x, 2))
|
431
431
|
# return df.loc[:,'NATR']
|
432
432
|
|
433
433
|
# @classmethod
|
434
434
|
# def get_trange_df(self, df):
|
435
|
-
# df.loc[:,'TRANGE'] = talib.TRANGE(df.loc[:,
|
435
|
+
# df.loc[:,'TRANGE'] = talib.TRANGE(df.loc[:,"high"], df.loc[:,"low"], df.loc[:,"close"]).apply(lambda x: round(x, 2))
|
436
436
|
# return df.loc[:,'TRANGE']
|
437
437
|
|
438
438
|
# @classmethod
|
@@ -443,9 +443,9 @@ class pktalib:
|
|
443
443
|
|
444
444
|
# @return: fasts, slows
|
445
445
|
# """
|
446
|
-
# highs = df.loc[:,
|
447
|
-
# lows = df.loc[:,
|
448
|
-
# closes = df.loc[:,
|
446
|
+
# highs = df.loc[:,"high"]
|
447
|
+
# lows = df.loc[:,"low"]
|
448
|
+
# closes = df.loc[:,"close"]
|
449
449
|
# slowPeriod=30
|
450
450
|
# fastPeriod=3
|
451
451
|
# atr = self.get_atr_df(df)
|
@@ -467,7 +467,7 @@ class pktalib:
|
|
467
467
|
# """
|
468
468
|
# ATR(14)/MA(14)
|
469
469
|
# """
|
470
|
-
# closes = df.loc[:,
|
470
|
+
# closes = df.loc[:,"close"]
|
471
471
|
|
472
472
|
# atr = self.get_atr_df(df)
|
473
473
|
# ma = talib.MA(closes, timeperiod=14)
|
@@ -501,7 +501,7 @@ class pktalib:
|
|
501
501
|
result = pd.Series(high + 2 * (PP - low))
|
502
502
|
elif pivotPoint == "S3":
|
503
503
|
result = pd.Series(low - 2 * (high - PP))
|
504
|
-
psr = {
|
504
|
+
psr = {"close":close, 'PP':round(PP,2)}
|
505
505
|
if pivotPoint != "PP" and result is not None:
|
506
506
|
psr[pivotPoint] = round(result,2)
|
507
507
|
with pd.option_context('mode.chained_assignment', None):
|
@@ -399,7 +399,7 @@ def statScanCalculationForPatterns(*args, **kwargs):
|
|
399
399
|
return scanResults
|
400
400
|
|
401
401
|
def ensureColumnsExist(saveResults):
|
402
|
-
columns = ['Stock', 'Date',
|
402
|
+
columns = ['Stock', 'Date', "volume", 'Trend', 'MA-Signal', 'LTP', '52Wk-H',
|
403
403
|
'52Wk-L', '1-Pd', '2-Pd', '3-Pd', '4-Pd', '5-Pd', '10-Pd', '15-Pd',
|
404
404
|
'22-Pd', '30-Pd', 'Consol.', 'Breakout', 'RSI', 'Pattern', 'CCI',
|
405
405
|
'LTP1', 'Growth1', 'LTP2', 'Growth2', 'LTP3', 'Growth3', 'LTP4',
|
@@ -423,7 +423,7 @@ def cleanupData(savedResults):
|
|
423
423
|
|
424
424
|
saveResults["LTP"] = saveResults["LTP"].astype(float).fillna(0.0)
|
425
425
|
saveResults["RSI"] = saveResults["RSI"].astype(float).fillna(0.0)
|
426
|
-
saveResults.loc[:, "
|
426
|
+
saveResults.loc[:, "volume"] = saveResults.loc[:, "volume"].apply(
|
427
427
|
lambda x: x.replace("x", "")
|
428
428
|
)
|
429
429
|
if f"Trend({configManager.daysToLookback}Prds)" not in saveResults.columns:
|
@@ -455,7 +455,7 @@ def cleanupData(savedResults):
|
|
455
455
|
].apply(lambda x: x.replace("(Potential)", "") if x is not None else x)
|
456
456
|
saveResults["Breakout"] = saveResults["Breakout"].astype(float).fillna(0.0)
|
457
457
|
saveResults["Resistance"] = saveResults["Resistance"].astype(float).fillna(0.0)
|
458
|
-
saveResults["
|
458
|
+
saveResults["volume"] = saveResults["volume"].astype(float).fillna(0.0)
|
459
459
|
saveResults[f"Consol."] = (
|
460
460
|
saveResults[f"Consol."].astype(float).fillna(0.0)
|
461
461
|
)
|
@@ -1036,13 +1036,13 @@ def filterMASignalResist(df):
|
|
1036
1036
|
def filterVolumeLessThan25(df):
|
1037
1037
|
if df is None:
|
1038
1038
|
return None
|
1039
|
-
return df[df["
|
1039
|
+
return df[df["volume"] < 2.5].fillna(0.0)
|
1040
1040
|
|
1041
1041
|
|
1042
1042
|
def filterVolumeMoreThan25(df):
|
1043
1043
|
if df is None:
|
1044
1044
|
return None
|
1045
|
-
return df[df["
|
1045
|
+
return df[df["volume"] >= 2.5].fillna(0.0)
|
1046
1046
|
|
1047
1047
|
|
1048
1048
|
def filterConsolidating10Percent(df):
|