quantplay 2.0.47__tar.gz → 2.0.50__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 (64) hide show
  1. {quantplay-2.0.47 → quantplay-2.0.50}/PKG-INFO +1 -26
  2. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/aliceblue.py +8 -0
  3. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/dhan.py +27 -76
  4. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay.egg-info/PKG-INFO +1 -26
  5. {quantplay-2.0.47 → quantplay-2.0.50}/setup.py +1 -1
  6. {quantplay-2.0.47 → quantplay-2.0.50}/README.md +0 -0
  7. {quantplay-2.0.47 → quantplay-2.0.50}/pyproject.toml +0 -0
  8. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/__init__.py +0 -0
  9. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/__init__.py +0 -0
  10. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/angelone.py +0 -0
  11. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/auto_login/__init__.py +0 -0
  12. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/auto_login/aliceblue.py +0 -0
  13. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/broker_factory.py +0 -0
  14. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/finvasia_utils/__init__.py +0 -0
  15. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/finvasia_utils/fa_noren.py +0 -0
  16. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/five_paisa.py +0 -0
  17. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/flattrade.py +0 -0
  18. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/ft_utils/__init__.py +0 -0
  19. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/ft_utils/flattrade_utils.py +0 -0
  20. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/ft_utils/ft_noren.py +0 -0
  21. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/generics/__init__.py +0 -0
  22. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/generics/broker.py +0 -0
  23. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/iifl_xts.py +0 -0
  24. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/kite_utils.py +0 -0
  25. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/motilal.py +0 -0
  26. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/noren.py +0 -0
  27. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/shoonya.py +0 -0
  28. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/uplink/__init__.py +0 -0
  29. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/uplink/uplink_utils.py +0 -0
  30. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/upstox.py +0 -0
  31. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/xts.py +0 -0
  32. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/xts_utils/Connect.py +0 -0
  33. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/xts_utils/Exception.py +0 -0
  34. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/xts_utils/InteractiveSocketClient.py +0 -0
  35. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/xts_utils/__init__.py +0 -0
  36. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/zerodha.py +0 -0
  37. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/exception/__init__.py +0 -0
  38. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/exception/exceptions.py +0 -0
  39. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/model/__init__.py +0 -0
  40. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/model/broker.py +0 -0
  41. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/model/generics.py +0 -0
  42. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/model/instrument_data.py +0 -0
  43. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/model/order_event.py +0 -0
  44. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/py.typed +0 -0
  45. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/__init__.py +0 -0
  46. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/caching.py +0 -0
  47. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/constant.py +0 -0
  48. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/exchange.py +0 -0
  49. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/number_utils.py +0 -0
  50. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/pickle_utils.py +0 -0
  51. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/selenium_utils.py +0 -0
  52. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/wrapper/__init__.py +0 -0
  53. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/wrapper/aws/__init__.py +0 -0
  54. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/wrapper/aws/s3.py +0 -0
  55. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay.egg-info/SOURCES.txt +0 -0
  56. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay.egg-info/dependency_links.txt +0 -0
  57. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay.egg-info/requires.txt +0 -0
  58. {quantplay-2.0.47 → quantplay-2.0.50}/quantplay.egg-info/top_level.txt +0 -0
  59. {quantplay-2.0.47 → quantplay-2.0.50}/setup.cfg +0 -0
  60. {quantplay-2.0.47 → quantplay-2.0.50}/tests/__init__.py +0 -0
  61. {quantplay-2.0.47 → quantplay-2.0.50}/tests/conftest.py +0 -0
  62. {quantplay-2.0.47 → quantplay-2.0.50}/tests/wrapper/__init__.py +0 -0
  63. {quantplay-2.0.47 → quantplay-2.0.50}/tests/wrapper/aws/__init__.py +0 -0
  64. {quantplay-2.0.47 → quantplay-2.0.50}/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.47
3
+ Version: 2.0.50
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
 
@@ -598,6 +598,12 @@ class Aliceblue(Broker):
598
598
 
599
599
  def margins(self) -> Dict[str, float]:
600
600
  margins = self.invoke_aliceblue_api(self.alice.get_balance)
601
+ if margins is None:
602
+ return {
603
+ "margin_used": 0.0,
604
+ "total_balance": 0.0,
605
+ "margin_available": 0.0,
606
+ }
601
607
 
602
608
  margins = [a for a in margins if a["segment"] == "ALL"][0]
603
609
 
@@ -625,6 +631,8 @@ class Aliceblue(Broker):
625
631
 
626
632
  if "emsg" in response and "expired" in response["emsg"].lower():
627
633
  raise TokenException("Session expired")
634
+ elif "emsg" in response and "unauthorized" in response["emsg"].lower():
635
+ raise TokenException("Session expired")
628
636
  elif (
629
637
  "stat" in response
630
638
  and response["stat"].lower() == "not_ok"
@@ -1,7 +1,5 @@
1
- import codecs
2
- import pickle
3
1
  import traceback
4
- from typing import Any, Dict, Hashable, List
2
+ from typing import Any, Dict
5
3
 
6
4
  import polars as pl
7
5
  from dhanhq import dhanhq # type:ignore
@@ -16,6 +14,7 @@ from quantplay.exception.exceptions import (
16
14
  )
17
15
  from quantplay.model.broker import (
18
16
  ExchangeType,
17
+ UserBrokerProfileResponse,
19
18
  )
20
19
  from quantplay.model.generics import (
21
20
  DhanTypes,
@@ -24,40 +23,22 @@ from quantplay.model.generics import (
24
23
  TransactionType,
25
24
  )
26
25
  from quantplay.utils.constant import Constants, OrderType
27
- from quantplay.utils.pickle_utils import InstrumentData, PickleUtils
28
26
 
29
27
 
30
28
  class Dhan(Broker):
31
- def __init__(self):
32
- super().__init__()
29
+ def __init__(
30
+ self,
31
+ user_id: str,
32
+ access_token: str,
33
+ load_instrument: bool = True,
34
+ ):
33
35
  self.dhan = dhanhq(
34
- client_id="1102866282",
35
- access_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJkaGFuIiwicGFydG5lcklkIjoiIiwiZXhwIjoxNzIzODgxNjgxLCJ0b2tlbkNvbnN1bWVyVHlwZSI6IlNFTEYiLCJ3ZWJob29rVXJsIjoiIiwiZGhhbkNsaWVudElkIjoiMTEwMjg2NjI4MiJ9.0dNR4gOdIQ3KeaAokEwbRt6v_6ESn73r6yOL9-7lzphVCAmP-pahgK6OIOxVUExBJa0SaxX0TNX7Vk0RBQ-lxQ",
36
- )
37
- self.dhan_w = dhanhq(
38
- client_id="1100799116",
39
- access_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJkaGFuIiwicGFydG5lcklkIjoiIiwiZXhwIjoxNzIxMzc3ODM5LCJ0b2tlbkNvbnN1bWVyVHlwZSI6IlNFTEYiLCJ3ZWJob29rVXJsIjoiIiwiZGhhbkNsaWVudElkIjoiMTEwMDc5OTExNiJ9.ykd4NYsnl7s1UegkUUY9tbP4OxxjqtskGi8JK0lyC9bRRPQRyxDv022JyDIl6crdFsQXfG7-6BsipPYxOtLR8g",
36
+ client_id=user_id,
37
+ access_token=access_token,
40
38
  )
41
39
 
42
- def set_wrapper(self, serialized_wrapper: str):
43
- self.wrapper = pickle.loads(codecs.decode(serialized_wrapper.encode(), "base64"))
44
-
45
- def initialize_symbol_data(self, save_as: str | None = None) -> None:
46
- try:
47
- self.symbol_data = InstrumentData.get_instance().load_data( # type: ignore
48
- "zerodha_instruments"
49
- )
50
- Constants.logger.info("[LOADING_INSTRUMENTS] loading data from cache")
51
- except Exception:
52
- instruments = self.wrapper.instruments() # type: ignore
53
- self.symbol_data = {}
54
- for instrument in instruments:
55
- exchange = instrument["exchange"]
56
- tradingsymbol = instrument["tradingsymbol"]
57
- self.symbol_data["{}:{}".format(exchange, tradingsymbol)] = instrument
58
-
59
- PickleUtils.save_data(self.symbol_data, "zerodha_instruments")
60
- Constants.logger.info("[LOADING_INSTRUMENTS] loading data from server")
40
+ def load_instrument(self, file_name: str | None = None) -> None:
41
+ super().load_instrument("upstox_instruments")
61
42
 
62
43
  def set_username(self, username: str):
63
44
  self.username = username
@@ -65,51 +46,9 @@ class Dhan(Broker):
65
46
  def get_username(self):
66
47
  return self.username
67
48
 
68
- @retry(
69
- wait_exponential_multiplier=3000,
70
- wait_exponential_max=10000,
71
- stop_max_attempt_number=3,
72
- )
73
- def get_ltps(self, trading_symbols: List[str]):
74
- response = self.wrapper.ltp(trading_symbols) # type: ignore
75
- if not isinstance(response, dict):
76
- raise InvalidArgumentException(
77
- "Invalid data response. Zerodha sent incorrect data, Please check."
78
- )
79
- api_response: Dict[str, Any] = response
80
- return api_response
81
-
82
49
  def get_quantplay_symbol(self, symbol: str):
83
50
  return symbol
84
51
 
85
- @retry(
86
- wait_exponential_multiplier=3000,
87
- wait_exponential_max=10000,
88
- stop_max_attempt_number=3,
89
- retry_on_exception=retry_exception,
90
- )
91
- def ltp(self, exchange: ExchangeType, tradingsymbol: str) -> float:
92
- try:
93
- key = f"{exchange}:{tradingsymbol}"
94
- response = self.wrapper.ltp([key]) # type: ignore
95
- if not isinstance(response, dict):
96
- raise InvalidArgumentException(
97
- "Invalid data response. Zerodha sent incorrect data, Please check."
98
- )
99
- api_response: Dict[Hashable, Any] = response
100
-
101
- if key not in api_response:
102
- raise InvalidArgumentException(
103
- "Symbol {} not listed on exchange".format(tradingsymbol)
104
- )
105
-
106
- return api_response[key]["last_price"]
107
- except Exception as e:
108
- exception_message = "GetLtp call failed for [{}] with error [{}]".format(
109
- tradingsymbol, str(e)
110
- )
111
- raise RetryableException(exception_message)
112
-
113
52
  @retry(
114
53
  wait_exponential_multiplier=3000,
115
54
  wait_exponential_max=10000,
@@ -135,7 +74,7 @@ class Dhan(Broker):
135
74
  trigger_price=order["trigger_price"],
136
75
  order_type=order["order_type"],
137
76
  )
138
- return response
77
+ return response # type:ignore
139
78
  except Exception as e:
140
79
  exception_message = (
141
80
  "OrderModificationFailed for {} failed with exception {}".format(
@@ -225,7 +164,7 @@ class Dhan(Broker):
225
164
  stop_max_attempt_number=3,
226
165
  )
227
166
  def holdings(self):
228
- holdings = self.dhan_w.get_holdings()
167
+ holdings = self.dhan.get_holdings()
229
168
 
230
169
  if not isinstance(holdings["data"], list):
231
170
  return pl.DataFrame(schema=self.holidings_schema)
@@ -259,7 +198,7 @@ class Dhan(Broker):
259
198
  retry_on_exception=retry_exception,
260
199
  )
261
200
  def positions(self, drop_cnc: bool = True) -> pl.DataFrame:
262
- positions = self.dhan_w.get_positions()
201
+ positions = self.dhan.get_positions()
263
202
 
264
203
  positions_df = pl.DataFrame(positions.get("data", {})) # type:ignore
265
204
 
@@ -436,3 +375,15 @@ class Dhan(Broker):
436
375
 
437
376
  return margins
438
377
  return {}
378
+
379
+ def profile(self) -> UserBrokerProfileResponse:
380
+ return {"user_id": "test"}
381
+
382
+ def get_exchange(
383
+ self,
384
+ exchange: ExchangeType,
385
+ ) -> Any:
386
+ return exchange
387
+
388
+ def ltp(self, exchange: ExchangeType, tradingsymbol: str) -> float:
389
+ return 0.0
@@ -1,36 +1,11 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: quantplay
3
- Version: 2.0.47
3
+ Version: 2.0.50
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.47",
24
+ version="2.0.50",
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