quantplay 2.0.76__tar.gz → 2.0.80__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. {quantplay-2.0.76 → quantplay-2.0.80}/PKG-INFO +1 -26
  2. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/angelone.py +1 -1
  3. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/dhan.py +29 -6
  4. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/ft_utils/flattrade_utils.py +6 -12
  5. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/generics/broker.py +5 -1
  6. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay.egg-info/PKG-INFO +1 -26
  7. {quantplay-2.0.76 → quantplay-2.0.80}/setup.py +1 -1
  8. {quantplay-2.0.76 → quantplay-2.0.80}/README.md +0 -0
  9. {quantplay-2.0.76 → quantplay-2.0.80}/pyproject.toml +0 -0
  10. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/__init__.py +0 -0
  11. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/__init__.py +0 -0
  12. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/aliceblue.py +0 -0
  13. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/auto_login/__init__.py +0 -0
  14. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/auto_login/aliceblue.py +0 -0
  15. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/broker_factory.py +0 -0
  16. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/finvasia_utils/__init__.py +0 -0
  17. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/finvasia_utils/fa_noren.py +0 -0
  18. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/five_paisa.py +0 -0
  19. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/flattrade.py +0 -0
  20. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/ft_utils/__init__.py +0 -0
  21. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/ft_utils/ft_noren.py +0 -0
  22. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/generics/__init__.py +0 -0
  23. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/iifl_xts.py +0 -0
  24. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/kite_utils.py +0 -0
  25. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/kotak.py +0 -0
  26. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/motilal.py +0 -0
  27. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/noren.py +0 -0
  28. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/shoonya.py +0 -0
  29. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/uplink/__init__.py +0 -0
  30. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/uplink/uplink_utils.py +0 -0
  31. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/upstox.py +0 -0
  32. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/xts.py +0 -0
  33. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/xts_utils/Connect.py +0 -0
  34. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/xts_utils/Exception.py +0 -0
  35. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/xts_utils/InteractiveSocketClient.py +0 -0
  36. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/xts_utils/__init__.py +0 -0
  37. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/broker/zerodha.py +0 -0
  38. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/exception/__init__.py +0 -0
  39. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/exception/exceptions.py +0 -0
  40. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/model/__init__.py +0 -0
  41. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/model/broker.py +0 -0
  42. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/model/generics.py +0 -0
  43. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/model/instrument_data.py +0 -0
  44. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/model/order_event.py +0 -0
  45. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/py.typed +0 -0
  46. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/utils/__init__.py +0 -0
  47. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/utils/caching.py +0 -0
  48. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/utils/constant.py +0 -0
  49. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/utils/exchange.py +0 -0
  50. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/utils/number_utils.py +0 -0
  51. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/utils/pickle_utils.py +0 -0
  52. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/utils/selenium_utils.py +0 -0
  53. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/wrapper/__init__.py +0 -0
  54. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/wrapper/aws/__init__.py +0 -0
  55. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay/wrapper/aws/s3.py +0 -0
  56. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay.egg-info/SOURCES.txt +0 -0
  57. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay.egg-info/dependency_links.txt +0 -0
  58. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay.egg-info/requires.txt +0 -0
  59. {quantplay-2.0.76 → quantplay-2.0.80}/quantplay.egg-info/top_level.txt +0 -0
  60. {quantplay-2.0.76 → quantplay-2.0.80}/setup.cfg +0 -0
  61. {quantplay-2.0.76 → quantplay-2.0.80}/tests/__init__.py +0 -0
  62. {quantplay-2.0.76 → quantplay-2.0.80}/tests/conftest.py +0 -0
  63. {quantplay-2.0.76 → quantplay-2.0.80}/tests/wrapper/__init__.py +0 -0
  64. {quantplay-2.0.76 → quantplay-2.0.80}/tests/wrapper/aws/__init__.py +0 -0
  65. {quantplay-2.0.76 → quantplay-2.0.80}/tests/wrapper/aws/s3_test.py +0 -0
@@ -1,36 +1,11 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: quantplay
3
- Version: 2.0.76
3
+ Version: 2.0.80
4
4
  Summary: This python package will be stored in AWS CodeArtifact
5
5
  Home-page:
6
6
  Author:
7
7
  Author-email:
8
8
  License: MIT
9
- Requires-Dist: setuptools
10
- Requires-Dist: path
11
- Requires-Dist: pyotp
12
- Requires-Dist: retrying
13
- Requires-Dist: boto3
14
- Requires-Dist: numpy
15
- Requires-Dist: websocket-client
16
- Requires-Dist: smartapi-python
17
- Requires-Dist: logzero
18
- Requires-Dist: selenium
19
- Requires-Dist: requests
20
- Requires-Dist: pandas
21
- Requires-Dist: pyarrow
22
- Requires-Dist: polars
23
- Requires-Dist: kiteconnect
24
- Requires-Dist: pya3
25
- Requires-Dist: py5paisa
26
- Requires-Dist: upstox-python-sdk
27
- Requires-Dist: undetected-chromedriver
28
- Requires-Dist: cachetools
29
- Requires-Dist: py_vollib
30
- Requires-Dist: python-engineio
31
- Requires-Dist: python-socketio
32
- Requires-Dist: six
33
- Requires-Dist: dhanhq
34
9
 
35
10
  # Quantplay Alpha playground
36
11
 
@@ -85,7 +85,7 @@ class AngelOne(Broker):
85
85
  totp=pyotp.TOTP(str(totp)).now(),
86
86
  )
87
87
 
88
- if not response["status"]:
88
+ if response["status"] is False:
89
89
  if "message" in response:
90
90
  raise InvalidArgumentException(response["message"])
91
91
  raise InvalidArgumentException("Invalid API credentials")
@@ -24,6 +24,8 @@ from quantplay.model.generics import (
24
24
  TransactionType,
25
25
  )
26
26
  from quantplay.utils.constant import Constants, OrderType
27
+ from quantplay.utils.pickle_utils import InstrumentData
28
+ from quantplay.wrapper.aws.s3 import S3Utils
27
29
 
28
30
 
29
31
  class Dhan(Broker):
@@ -38,14 +40,26 @@ class Dhan(Broker):
38
40
  client_id=user_id,
39
41
  access_token=access_token,
40
42
  )
41
-
43
+ self.user_id = user_id
42
44
  except Exception:
43
45
  raise TokenException("Dhan Session Expired")
44
46
  if load_instrument:
45
47
  self.load_instrument()
46
48
 
47
49
  def load_instrument(self, file_name: str | None = None) -> None:
48
- super().load_instrument("dhan_instruments")
50
+ try:
51
+ self.symbol_data = InstrumentData.get_instance().load_data( # type: ignore
52
+ "dhan_instruments"
53
+ )
54
+ Constants.logger.info("[LOADING_INSTRUMENTS] loading data from cache")
55
+ except Exception:
56
+ self.instrument_data = S3Utils.read_csv(
57
+ "quantplay-market-data",
58
+ "symbol_data/dhan_instruments.csv",
59
+ )
60
+ self.initialize_symbol_data(save_as="dhan_instruments")
61
+
62
+ self.initialize_broker_symbol_map()
49
63
 
50
64
  def set_username(self, username: str):
51
65
  self.username = username
@@ -53,9 +67,6 @@ class Dhan(Broker):
53
67
  def get_username(self):
54
68
  return self.username
55
69
 
56
- def get_quantplay_symbol(self, symbol: str):
57
- return symbol
58
-
59
70
  @retry(
60
71
  wait_exponential_multiplier=3000,
61
72
  wait_exponential_max=10000,
@@ -321,7 +332,12 @@ class Dhan(Broker):
321
332
  }
322
333
  )
323
334
  orders_df = orders_df.with_columns(
324
- pl.when(pl.col("product") == "INTRADAY").then(pl.lit("MIS")).alias("product"),
335
+ pl.when(pl.col("product") == "INTRADAY")
336
+ .then(pl.lit("MIS"))
337
+ .when(pl.col("product") == "MARGIN")
338
+ .then(pl.lit("NRML"))
339
+ .otherwise(pl.col("product"))
340
+ .alias("product"),
325
341
  pl.when(pl.col("exchange") == "NSE_FNO")
326
342
  .then(pl.lit("NFO"))
327
343
  .when(pl.col("exchange") == "BSE_FO")
@@ -346,6 +362,13 @@ class Dhan(Broker):
346
362
  .alias("status"),
347
363
  )
348
364
 
365
+ orders_df = orders_df.with_columns(
366
+ pl.when((pl.col("status") == "OPEN") & (pl.col("trigger_price") > 0))
367
+ .then(pl.lit("TRIGGER PENDING"))
368
+ .otherwise(pl.col("status"))
369
+ .alias("status")
370
+ )
371
+
349
372
  orders_df = orders_df.with_columns(
350
373
  pl.lit(None).cast(pl.Float64).alias("ltp"),
351
374
  pl.lit(0.0).alias("average_price"),
@@ -9,7 +9,6 @@ from selenium.common.exceptions import WebDriverException
9
9
  from quantplay.exception.exceptions import (
10
10
  InvalidArgumentException,
11
11
  RetryableException,
12
- TokenException,
13
12
  WrongLibrarySetup,
14
13
  retry_exception,
15
14
  )
@@ -69,11 +68,9 @@ class FlatTradeUtils:
69
68
  )
70
69
  error_message = error_attempt.text
71
70
 
72
- if error_message.lower() in [
73
- "invalid input : wrong password",
74
- "invalid api key",
75
- "resetpassword",
76
- "user blocked due to multiple wrong attempts",
71
+ if error_message in [
72
+ "Invalid Input : Wrong Password",
73
+ "Invalid API key",
77
74
  ]:
78
75
  raise InvalidArgumentException(
79
76
  f"Flattrade Login Failed: {error_message}"
@@ -82,22 +79,19 @@ class FlatTradeUtils:
82
79
  except Exception as e:
83
80
  Constants.logger.error(f"Flattrade Selenium Error : {e}")
84
81
  traceback.print_exc()
85
- raise TokenException(str(e))
86
82
 
87
83
  finally:
88
84
  Constants.logger.error(
89
85
  f"Flattrade Unkown Selenium Error : {error_message}"
90
86
  )
91
- raise TokenException(
92
- f"Flattrade Unkown Selenium Error : {error_message}"
93
- )
87
+ raise Exception(f"Flattrade Unkown Selenium Error : {error_message}")
94
88
 
95
89
  try:
96
90
  request_token = url.split("code=")[1].split("&")[0]
97
91
  except Exception as e:
98
92
  Constants.logger.error(f"Flattrade Selenium Error for {url}")
99
93
  traceback.print_exc()
100
- raise TokenException(str(e))
94
+ raise e
101
95
 
102
96
  driver.close()
103
97
 
@@ -105,7 +99,7 @@ class FlatTradeUtils:
105
99
 
106
100
  except binascii.Error:
107
101
  raise InvalidArgumentException("Invalid TOTP key provided")
108
- except (InvalidArgumentException, TokenException) as e:
102
+ except InvalidArgumentException as e:
109
103
  raise e
110
104
  except WebDriverException:
111
105
  raise WrongLibrarySetup("Selenium setup need to be fixed")
@@ -74,6 +74,7 @@ class Broker(ABC):
74
74
  "trigger_price": pl.Float64,
75
75
  "ltp": pl.Float64,
76
76
  "order_timestamp": pl.Datetime(time_unit="ms"),
77
+ "update_timestamp": pl.Datetime(time_unit="ms"),
77
78
  "token": pl.Int64,
78
79
  "quantity": pl.Int64,
79
80
  "pending_quantity": pl.Int64,
@@ -595,7 +596,10 @@ class Broker(ABC):
595
596
  delta_time = str(
596
597
  datetime.now().replace(microsecond=0) - timedelta(seconds=120)
597
598
  )
598
- orders = orders[orders["update_timestamp"] >= delta_time]
599
+ orders = orders.filter(
600
+ pl.col("update_timestamp").dt.strftime("%Y-%m-%d %H:%M:%S")
601
+ >= delta_time
602
+ )
599
603
 
600
604
  orders = orders.to_dicts()
601
605
  for order in orders:
@@ -1,36 +1,11 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: quantplay
3
- Version: 2.0.76
3
+ Version: 2.0.80
4
4
  Summary: This python package will be stored in AWS CodeArtifact
5
5
  Home-page:
6
6
  Author:
7
7
  Author-email:
8
8
  License: MIT
9
- Requires-Dist: setuptools
10
- Requires-Dist: path
11
- Requires-Dist: pyotp
12
- Requires-Dist: retrying
13
- Requires-Dist: boto3
14
- Requires-Dist: numpy
15
- Requires-Dist: websocket-client
16
- Requires-Dist: smartapi-python
17
- Requires-Dist: logzero
18
- Requires-Dist: selenium
19
- Requires-Dist: requests
20
- Requires-Dist: pandas
21
- Requires-Dist: pyarrow
22
- Requires-Dist: polars
23
- Requires-Dist: kiteconnect
24
- Requires-Dist: pya3
25
- Requires-Dist: py5paisa
26
- Requires-Dist: upstox-python-sdk
27
- Requires-Dist: undetected-chromedriver
28
- Requires-Dist: cachetools
29
- Requires-Dist: py_vollib
30
- Requires-Dist: python-engineio
31
- Requires-Dist: python-socketio
32
- Requires-Dist: six
33
- Requires-Dist: dhanhq
34
9
 
35
10
  # Quantplay Alpha playground
36
11
 
@@ -21,7 +21,7 @@ requirements = [
21
21
  setup(
22
22
  name="quantplay",
23
23
  long_description=Path("README.md").read_text(),
24
- version="2.0.76",
24
+ version="2.0.80",
25
25
  setup_requires=["pytest-runner"],
26
26
  install_requires=requirements,
27
27
  tests_require=[],
File without changes
File without changes
File without changes
File without changes
File without changes