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.
- {quantplay-2.0.47 → quantplay-2.0.50}/PKG-INFO +1 -26
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/aliceblue.py +8 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/dhan.py +27 -76
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay.egg-info/PKG-INFO +1 -26
- {quantplay-2.0.47 → quantplay-2.0.50}/setup.py +1 -1
- {quantplay-2.0.47 → quantplay-2.0.50}/README.md +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/pyproject.toml +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/angelone.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/auto_login/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/auto_login/aliceblue.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/broker_factory.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/finvasia_utils/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/finvasia_utils/fa_noren.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/five_paisa.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/flattrade.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/ft_utils/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/ft_utils/flattrade_utils.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/ft_utils/ft_noren.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/generics/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/generics/broker.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/iifl_xts.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/kite_utils.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/motilal.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/noren.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/shoonya.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/uplink/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/uplink/uplink_utils.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/upstox.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/xts.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/xts_utils/Connect.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/xts_utils/Exception.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/xts_utils/InteractiveSocketClient.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/xts_utils/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/broker/zerodha.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/exception/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/exception/exceptions.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/model/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/model/broker.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/model/generics.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/model/instrument_data.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/model/order_event.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/py.typed +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/caching.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/constant.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/exchange.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/number_utils.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/pickle_utils.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/utils/selenium_utils.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/wrapper/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/wrapper/aws/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay/wrapper/aws/s3.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay.egg-info/SOURCES.txt +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay.egg-info/dependency_links.txt +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay.egg-info/requires.txt +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/quantplay.egg-info/top_level.txt +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/setup.cfg +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/tests/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/tests/conftest.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/tests/wrapper/__init__.py +0 -0
- {quantplay-2.0.47 → quantplay-2.0.50}/tests/wrapper/aws/__init__.py +0 -0
- {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.
|
|
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
|
|
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__(
|
|
32
|
-
|
|
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=
|
|
35
|
-
access_token=
|
|
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
|
|
43
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|