quantplay 2.0.57__tar.gz → 2.0.59__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.57 → quantplay-2.0.59}/PKG-INFO +1 -1
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/broker_factory.py +7 -5
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/dhan.py +9 -4
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/flattrade.py +3 -3
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/shoonya.py +3 -5
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/upstox.py +12 -31
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay.egg-info/PKG-INFO +1 -1
- {quantplay-2.0.57 → quantplay-2.0.59}/setup.py +1 -1
- {quantplay-2.0.57 → quantplay-2.0.59}/README.md +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/pyproject.toml +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/aliceblue.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/angelone.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/auto_login/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/auto_login/aliceblue.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/finvasia_utils/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/finvasia_utils/fa_noren.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/five_paisa.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/ft_utils/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/ft_utils/flattrade_utils.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/ft_utils/ft_noren.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/generics/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/generics/broker.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/iifl_xts.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/kite_utils.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/kotak.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/motilal.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/noren.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/uplink/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/uplink/uplink_utils.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/xts.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/xts_utils/Connect.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/xts_utils/Exception.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/xts_utils/InteractiveSocketClient.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/xts_utils/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/broker/zerodha.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/exception/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/exception/exceptions.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/model/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/model/broker.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/model/generics.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/model/instrument_data.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/model/order_event.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/py.typed +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/utils/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/utils/caching.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/utils/constant.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/utils/exchange.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/utils/number_utils.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/utils/pickle_utils.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/utils/selenium_utils.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/wrapper/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/wrapper/aws/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay/wrapper/aws/s3.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay.egg-info/SOURCES.txt +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay.egg-info/dependency_links.txt +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay.egg-info/requires.txt +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/quantplay.egg-info/top_level.txt +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/setup.cfg +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/tests/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/tests/conftest.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/tests/wrapper/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/tests/wrapper/aws/__init__.py +0 -0
- {quantplay-2.0.57 → quantplay-2.0.59}/tests/wrapper/aws/s3_test.py +0 -0
|
@@ -91,7 +91,7 @@ broker_required_args = {
|
|
|
91
91
|
|
|
92
92
|
broker_generate_args = {
|
|
93
93
|
Broker.ZERODHA: set(["user_id", "api_key", "api_secret"]),
|
|
94
|
-
Broker.FLATTRADE: set(["user_id" "api_secret", "password", "
|
|
94
|
+
Broker.FLATTRADE: set(["user_id" "api_secret", "password", "totp", "api_key"]),
|
|
95
95
|
Broker.IIFL_XTS: set(["api_key", "api_secret", "md_api_key", "md_api_secret"]),
|
|
96
96
|
Broker.MOTILAL: set(["user_id", "password", "api_key", "two_fa", "totp"]),
|
|
97
97
|
Broker.ALICEBLUE: set(["user_id", "api_key"]),
|
|
@@ -110,7 +110,7 @@ broker_generate_args = {
|
|
|
110
110
|
),
|
|
111
111
|
Broker.ANGELONE: set(["user_id", "api_key", "mpin", "totp"]),
|
|
112
112
|
Broker.FINVASIA: set(
|
|
113
|
-
["api_secret", "imei", "password", "
|
|
113
|
+
["api_secret", "imei", "password", "totp", "user_id", "vendor_code"]
|
|
114
114
|
),
|
|
115
115
|
Broker.UPSTOX: set(["user_id", "access_token"]),
|
|
116
116
|
Broker.KOTAK: set(
|
|
@@ -142,7 +142,9 @@ class BrokerFactory:
|
|
|
142
142
|
f"Missing Arguments for {user_broker_account['username']}:{user_broker_account['nickname']} in broker '{broker}' -> {compare_map[broker].difference(user_broker_account.keys())}"
|
|
143
143
|
)
|
|
144
144
|
|
|
145
|
-
def generate_token(
|
|
145
|
+
def generate_token(
|
|
146
|
+
self, user_broker_account: Dict[str, Any]
|
|
147
|
+
) -> Dict[str, BrokerType | Any]:
|
|
146
148
|
broker_client: BrokerType | None = None
|
|
147
149
|
|
|
148
150
|
broker_data = user_broker_account["broker_data"]
|
|
@@ -239,7 +241,7 @@ class BrokerFactory:
|
|
|
239
241
|
api_secret=broker_data["api_secret"],
|
|
240
242
|
imei=broker_data["imei"],
|
|
241
243
|
password=broker_data["password"],
|
|
242
|
-
|
|
244
|
+
totp=broker_data["totp_key"],
|
|
243
245
|
user_id=broker_data["user_id"],
|
|
244
246
|
vendor_code=broker_data["vendor_code"],
|
|
245
247
|
load_instrument=False,
|
|
@@ -253,7 +255,7 @@ class BrokerFactory:
|
|
|
253
255
|
user_id=broker_data["user_id"],
|
|
254
256
|
api_secret=broker_data["api_secret"],
|
|
255
257
|
password=broker_data["password"],
|
|
256
|
-
|
|
258
|
+
totp=broker_data["totp_key"],
|
|
257
259
|
api_key=broker_data["api_key"],
|
|
258
260
|
load_instrument=False,
|
|
259
261
|
)
|
|
@@ -10,6 +10,7 @@ from quantplay.exception.exceptions import (
|
|
|
10
10
|
InvalidArgumentException,
|
|
11
11
|
QuantplayOrderPlacementException,
|
|
12
12
|
RetryableException,
|
|
13
|
+
TokenException,
|
|
13
14
|
retry_exception,
|
|
14
15
|
)
|
|
15
16
|
from quantplay.model.broker import (
|
|
@@ -32,10 +33,14 @@ class Dhan(Broker):
|
|
|
32
33
|
access_token: str,
|
|
33
34
|
load_instrument: bool = True,
|
|
34
35
|
):
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
try:
|
|
37
|
+
self.dhan = dhanhq(
|
|
38
|
+
client_id=user_id,
|
|
39
|
+
access_token=access_token,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
except Exception:
|
|
43
|
+
raise TokenException("Dhan Session Expired")
|
|
39
44
|
|
|
40
45
|
def load_instrument(self, file_name: str | None = None) -> None:
|
|
41
46
|
super().load_instrument("upstox_instruments")
|
|
@@ -17,7 +17,7 @@ class FlatTrade(Noren):
|
|
|
17
17
|
order_updates: Queue[OrderUpdateEvent] | None = None,
|
|
18
18
|
api_secret: str | None = None,
|
|
19
19
|
password: str | None = None,
|
|
20
|
-
|
|
20
|
+
totp: str | None = None,
|
|
21
21
|
user_id: str | None = None,
|
|
22
22
|
user_token: str | None = None,
|
|
23
23
|
api_key: str | None = None,
|
|
@@ -33,11 +33,11 @@ class FlatTrade(Noren):
|
|
|
33
33
|
if user_token and user_id:
|
|
34
34
|
self.api.set_session(userid=user_id, usertoken=user_token)
|
|
35
35
|
|
|
36
|
-
elif user_id and password and
|
|
36
|
+
elif user_id and password and totp and api_key and api_secret:
|
|
37
37
|
token = self.login(
|
|
38
38
|
user_id=user_id,
|
|
39
39
|
password=password,
|
|
40
|
-
totp_key=
|
|
40
|
+
totp_key=totp,
|
|
41
41
|
api_key=api_key,
|
|
42
42
|
api_secret=api_secret,
|
|
43
43
|
)
|
|
@@ -16,7 +16,7 @@ class FinvAsia(Noren):
|
|
|
16
16
|
api_secret: str | None = None,
|
|
17
17
|
imei: str | None = None,
|
|
18
18
|
password: str | None = None,
|
|
19
|
-
|
|
19
|
+
totp: str | None = None,
|
|
20
20
|
user_id: str | None = None,
|
|
21
21
|
vendor_code: str | None = None,
|
|
22
22
|
user_token: str | None = None,
|
|
@@ -37,10 +37,8 @@ class FinvAsia(Noren):
|
|
|
37
37
|
"email": None,
|
|
38
38
|
"uname": None,
|
|
39
39
|
}
|
|
40
|
-
elif
|
|
41
|
-
|
|
42
|
-
):
|
|
43
|
-
totp = pyotp.TOTP(totp_key).now()
|
|
40
|
+
elif user_id and password and totp and vendor_code and api_secret and imei:
|
|
41
|
+
totp = pyotp.TOTP(totp).now()
|
|
44
42
|
response = self.login(
|
|
45
43
|
user_id=user_id,
|
|
46
44
|
password=password,
|
|
@@ -51,39 +51,20 @@ class Upstox(Broker):
|
|
|
51
51
|
):
|
|
52
52
|
super().__init__()
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
# TODO: Implement Auto Login
|
|
60
|
-
# elif (
|
|
61
|
-
# api_key
|
|
62
|
-
# and api_secret
|
|
63
|
-
# and totp
|
|
64
|
-
# and mobile_number
|
|
65
|
-
# and account_pin
|
|
66
|
-
# and redirect_url
|
|
67
|
-
# ):
|
|
68
|
-
# new_access_token = self.generate_token(
|
|
69
|
-
# api_key, api_secret, totp, mobile_number, account_pin, redirect_url
|
|
70
|
-
# )
|
|
71
|
-
# self.set_access_token(new_access_token)
|
|
72
|
-
|
|
73
|
-
# self.configuration = upstox_client.Configuration()
|
|
74
|
-
# self.configuration.access_token = self.access_token
|
|
75
|
-
|
|
76
|
-
else:
|
|
77
|
-
raise InvalidArgumentException("Missing Args")
|
|
78
|
-
|
|
79
|
-
except Exception as e:
|
|
80
|
-
raise e
|
|
54
|
+
if access_token:
|
|
55
|
+
self.set_access_token(access_token)
|
|
56
|
+
self.user_id = user_id
|
|
57
|
+
else:
|
|
58
|
+
raise TokenException("Upstox Session Expired")
|
|
81
59
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
60
|
+
try:
|
|
61
|
+
self.configuration = upstox_client.Configuration()
|
|
62
|
+
self.configuration.access_token = self.access_token
|
|
63
|
+
self.api_version = "2.0"
|
|
85
64
|
|
|
86
|
-
|
|
65
|
+
self.api_client = upstox_client.ApiClient(self.configuration)
|
|
66
|
+
except Exception:
|
|
67
|
+
raise TokenException("Upstox Session Expired")
|
|
87
68
|
|
|
88
69
|
if load_instrument:
|
|
89
70
|
self.load_instrument()
|
|
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
|