wiz-trader 0.25.0__tar.gz → 0.26.0__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.
- {wiz_trader-0.25.0/src/wiz_trader.egg-info → wiz_trader-0.26.0}/PKG-INFO +69 -2
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/README.md +69 -2
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/pyproject.toml +1 -1
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/src/wiz_trader/__init__.py +2 -2
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/src/wiz_trader/apis/__init__.py +1 -1
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/src/wiz_trader/apis/client.py +87 -2
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/src/wiz_trader/quotes/client.py +2 -3
- {wiz_trader-0.25.0 → wiz_trader-0.26.0/src/wiz_trader.egg-info}/PKG-INFO +69 -2
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/MANIFEST.in +0 -0
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/setup.cfg +0 -0
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/setup.py +0 -0
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/src/wiz_trader/quotes/__init__.py +0 -0
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/src/wiz_trader.egg-info/SOURCES.txt +0 -0
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/src/wiz_trader.egg-info/dependency_links.txt +0 -0
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/src/wiz_trader.egg-info/requires.txt +0 -0
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/src/wiz_trader.egg-info/top_level.txt +0 -0
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/tests/test_apis.py +0 -0
- {wiz_trader-0.25.0 → wiz_trader-0.26.0}/tests/test_quotes.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: wiz_trader
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.26.0
|
4
4
|
Summary: A Python SDK for connecting to the Wizzer.
|
5
5
|
Home-page: https://bitbucket.org/wizzer-tech/quotes_sdk.git
|
6
6
|
Author: Pawan Wagh
|
@@ -59,7 +59,7 @@ Dynamic: requires-python
|
|
59
59
|
WizTrader is a Python SDK for connecting to the Wizzer trading platform. It provides two main client classes:
|
60
60
|
|
61
61
|
- **QuotesClient**: For real-time market data streaming via WebSockets
|
62
|
-
- **WizzerClient**: For REST API access to trading, order management, and market data
|
62
|
+
- **WizzerClient**: For REST API access to trading, order management, and market data, including data pipelines and classification APIs.
|
63
63
|
|
64
64
|
This documentation covers all the ways to use the SDK, with examples for each endpoint and common use cases.
|
65
65
|
|
@@ -403,6 +403,73 @@ for component in components[:5]:
|
|
403
403
|
print(f"{component['tradingSymbol']} - {component.get('weightage', 'N/A')}%")
|
404
404
|
```
|
405
405
|
|
406
|
+
#### List Classification Types
|
407
|
+
|
408
|
+
Retrieve all available classification types.
|
409
|
+
|
410
|
+
```python
|
411
|
+
classification_types = client.get_classification_types()
|
412
|
+
# Response: ['basicIndustry', 'industry', 'macroEconomicSector', 'sector']
|
413
|
+
```
|
414
|
+
|
415
|
+
#### List Classification Values
|
416
|
+
|
417
|
+
Retrieve all values for a specific classification type.
|
418
|
+
|
419
|
+
```python
|
420
|
+
basic_industry_values = client.get_classifications("basicIndustry")
|
421
|
+
# Response: ['Aerospace & Defense', 'Agricultural Food & other Products', ...]
|
422
|
+
```
|
423
|
+
|
424
|
+
#### Filter Indices by Classifications
|
425
|
+
|
426
|
+
Filter indices based on multiple classification criteria. The `match_all` parameter controls the filter logic:
|
427
|
+
- `True`: AND logic (all filters must match)
|
428
|
+
- `False`: OR logic (any filter can match)
|
429
|
+
|
430
|
+
```python
|
431
|
+
# Example: Find indices in the 'Commodities' macro-economic sector OR 'Aerospace & Defense' industry
|
432
|
+
filters = {
|
433
|
+
"macroEconomicSector": ["Commodities"],
|
434
|
+
"industry": ["Aerospace & Defense"]
|
435
|
+
}
|
436
|
+
or_logic_indices = client.filter_indices(filters=filters, match_all=False)
|
437
|
+
|
438
|
+
# Example: Find indices that are in BOTH 'Housing Finance Company' and 'Financial Services'
|
439
|
+
filters = {
|
440
|
+
"basicIndustry": ["Housing Finance Company"],
|
441
|
+
"sector": ["Financial Services"]
|
442
|
+
}
|
443
|
+
and_logic_indices = client.filter_indices(filters=filters, match_all=True)
|
444
|
+
```
|
445
|
+
|
446
|
+
#### Filter Instruments by Classifications
|
447
|
+
|
448
|
+
Filter instruments based on classification criteria.
|
449
|
+
|
450
|
+
```python
|
451
|
+
# Example: Find instruments in the 'Technology' sector
|
452
|
+
filters = {"sector": ["Technology"]}
|
453
|
+
tech_instruments = client.filter_instruments(filters=filters, match_all=True)
|
454
|
+
```
|
455
|
+
|
456
|
+
#### Filter Instruments by Classifications and Index
|
457
|
+
|
458
|
+
Filter instruments that belong to both specific classifications and a given index.
|
459
|
+
|
460
|
+
```python
|
461
|
+
# Example: Find 'Financial Services' instruments within the 'NIFTY NEXT 50' index
|
462
|
+
filters = {
|
463
|
+
"basicIndustry": ["Housing Finance Company"],
|
464
|
+
"sector": ["Financial Services"]
|
465
|
+
}
|
466
|
+
filtered_instruments = client.filter_instruments(
|
467
|
+
index_identifier="NSE:NIFTY NEXT 50:26054",
|
468
|
+
filters=filters,
|
469
|
+
match_all=False
|
470
|
+
)
|
471
|
+
```
|
472
|
+
|
406
473
|
#### Get Historical OHLCV Data
|
407
474
|
## Overview
|
408
475
|
|
@@ -32,7 +32,7 @@
|
|
32
32
|
WizTrader is a Python SDK for connecting to the Wizzer trading platform. It provides two main client classes:
|
33
33
|
|
34
34
|
- **QuotesClient**: For real-time market data streaming via WebSockets
|
35
|
-
- **WizzerClient**: For REST API access to trading, order management, and market data
|
35
|
+
- **WizzerClient**: For REST API access to trading, order management, and market data, including data pipelines and classification APIs.
|
36
36
|
|
37
37
|
This documentation covers all the ways to use the SDK, with examples for each endpoint and common use cases.
|
38
38
|
|
@@ -376,6 +376,73 @@ for component in components[:5]:
|
|
376
376
|
print(f"{component['tradingSymbol']} - {component.get('weightage', 'N/A')}%")
|
377
377
|
```
|
378
378
|
|
379
|
+
#### List Classification Types
|
380
|
+
|
381
|
+
Retrieve all available classification types.
|
382
|
+
|
383
|
+
```python
|
384
|
+
classification_types = client.get_classification_types()
|
385
|
+
# Response: ['basicIndustry', 'industry', 'macroEconomicSector', 'sector']
|
386
|
+
```
|
387
|
+
|
388
|
+
#### List Classification Values
|
389
|
+
|
390
|
+
Retrieve all values for a specific classification type.
|
391
|
+
|
392
|
+
```python
|
393
|
+
basic_industry_values = client.get_classifications("basicIndustry")
|
394
|
+
# Response: ['Aerospace & Defense', 'Agricultural Food & other Products', ...]
|
395
|
+
```
|
396
|
+
|
397
|
+
#### Filter Indices by Classifications
|
398
|
+
|
399
|
+
Filter indices based on multiple classification criteria. The `match_all` parameter controls the filter logic:
|
400
|
+
- `True`: AND logic (all filters must match)
|
401
|
+
- `False`: OR logic (any filter can match)
|
402
|
+
|
403
|
+
```python
|
404
|
+
# Example: Find indices in the 'Commodities' macro-economic sector OR 'Aerospace & Defense' industry
|
405
|
+
filters = {
|
406
|
+
"macroEconomicSector": ["Commodities"],
|
407
|
+
"industry": ["Aerospace & Defense"]
|
408
|
+
}
|
409
|
+
or_logic_indices = client.filter_indices(filters=filters, match_all=False)
|
410
|
+
|
411
|
+
# Example: Find indices that are in BOTH 'Housing Finance Company' and 'Financial Services'
|
412
|
+
filters = {
|
413
|
+
"basicIndustry": ["Housing Finance Company"],
|
414
|
+
"sector": ["Financial Services"]
|
415
|
+
}
|
416
|
+
and_logic_indices = client.filter_indices(filters=filters, match_all=True)
|
417
|
+
```
|
418
|
+
|
419
|
+
#### Filter Instruments by Classifications
|
420
|
+
|
421
|
+
Filter instruments based on classification criteria.
|
422
|
+
|
423
|
+
```python
|
424
|
+
# Example: Find instruments in the 'Technology' sector
|
425
|
+
filters = {"sector": ["Technology"]}
|
426
|
+
tech_instruments = client.filter_instruments(filters=filters, match_all=True)
|
427
|
+
```
|
428
|
+
|
429
|
+
#### Filter Instruments by Classifications and Index
|
430
|
+
|
431
|
+
Filter instruments that belong to both specific classifications and a given index.
|
432
|
+
|
433
|
+
```python
|
434
|
+
# Example: Find 'Financial Services' instruments within the 'NIFTY NEXT 50' index
|
435
|
+
filters = {
|
436
|
+
"basicIndustry": ["Housing Finance Company"],
|
437
|
+
"sector": ["Financial Services"]
|
438
|
+
}
|
439
|
+
filtered_instruments = client.filter_instruments(
|
440
|
+
index_identifier="NSE:NIFTY NEXT 50:26054",
|
441
|
+
filters=filters,
|
442
|
+
match_all=False
|
443
|
+
)
|
444
|
+
```
|
445
|
+
|
379
446
|
#### Get Historical OHLCV Data
|
380
447
|
## Overview
|
381
448
|
|
@@ -2762,4 +2829,4 @@ All supported environment variables:
|
|
2762
2829
|
- `modify_basket_order(order_id, **params)`
|
2763
2830
|
- `rebalance_basket(trading_symbol, instruments)`
|
2764
2831
|
- `exit_all_positions()`
|
2765
|
-
- `exit_strategy_positions(strategy_id)`
|
2832
|
+
- `exit_strategy_positions(strategy_id)`
|
@@ -197,7 +197,14 @@ class WizzerClient:
|
|
197
197
|
"instrument.metrics": "/instruments/metrics",
|
198
198
|
"instrument.option_chain": "/instruments/options/chain",
|
199
199
|
"instrument.expiry_list": "/instruments/options/chain/expirylist",
|
200
|
-
"instrument.future_list": "/instruments/futures/list"
|
200
|
+
"instrument.future_list": "/instruments/futures/list",
|
201
|
+
|
202
|
+
# Classification API endpoints
|
203
|
+
"classification.types": "/datahub/classifications/types",
|
204
|
+
"classification.values": "/datahub/classifications/{type}",
|
205
|
+
"indices.filter": "/datahub/indices/filter",
|
206
|
+
"instruments.filter": "/datahub/instruments/filter",
|
207
|
+
"instruments.filter_with_index": "/datahub/indices/{id}/instruments"
|
201
208
|
}
|
202
209
|
|
203
210
|
def __init__(
|
@@ -1598,6 +1605,84 @@ class WizzerClient:
|
|
1598
1605
|
logger.debug("Fetching futures list for: %s", identifier)
|
1599
1606
|
return self._make_request("POST", endpoint, json=data)
|
1600
1607
|
|
1608
|
+
|
1609
|
+
def get_classification_types(self) -> list:
|
1610
|
+
"""
|
1611
|
+
Retrieve all available classification types.
|
1612
|
+
|
1613
|
+
Returns:
|
1614
|
+
list: A list of classification types.
|
1615
|
+
"""
|
1616
|
+
endpoint = self._routes["classification.types"]
|
1617
|
+
logger.debug("Fetching classification types.")
|
1618
|
+
return self._make_request("GET", endpoint)
|
1619
|
+
|
1620
|
+
def get_classifications(self, classification_type: str) -> list:
|
1621
|
+
"""
|
1622
|
+
Retrieve all values for a specific classification type.
|
1623
|
+
|
1624
|
+
Args:
|
1625
|
+
classification_type (str): The type of classification to retrieve values for.
|
1626
|
+
|
1627
|
+
Returns:
|
1628
|
+
list: A list of classification values.
|
1629
|
+
"""
|
1630
|
+
endpoint = self._routes["classification.values"].format(type=classification_type)
|
1631
|
+
logger.debug(f"Fetching classification values for type: {classification_type}")
|
1632
|
+
return self._make_request("GET", endpoint)
|
1633
|
+
|
1634
|
+
def filter_indices(self, filters: Dict[str, List[str]], match_all: bool = True) -> list:
|
1635
|
+
"""
|
1636
|
+
Filter indices based on multiple classification criteria.
|
1637
|
+
|
1638
|
+
Args:
|
1639
|
+
filters (Dict[str, List[str]]): A dictionary of filters where keys are classification
|
1640
|
+
types and values are lists of classification values.
|
1641
|
+
match_all (bool): If True, performs an AND logic search. If False, performs an OR logic search.
|
1642
|
+
|
1643
|
+
Returns:
|
1644
|
+
list: A list of indices that match the filter criteria.
|
1645
|
+
"""
|
1646
|
+
endpoint = self._routes["indices.filter"]
|
1647
|
+
data = {
|
1648
|
+
"filters": filters,
|
1649
|
+
"matchAll": match_all
|
1650
|
+
}
|
1651
|
+
logger.debug(f"Filtering indices with filters: {filters} and match_all: {match_all}")
|
1652
|
+
return self._make_request("POST", endpoint, json=data)
|
1653
|
+
|
1654
|
+
def filter_instruments(
|
1655
|
+
self,
|
1656
|
+
filters: Optional[Dict[str, List[str]]] = None,
|
1657
|
+
match_all: bool = True,
|
1658
|
+
index_identifier: Optional[str] = None
|
1659
|
+
) -> list:
|
1660
|
+
"""
|
1661
|
+
Filter instruments based on classification criteria, with an option to filter within an index.
|
1662
|
+
|
1663
|
+
Args:
|
1664
|
+
filters (Optional[Dict[str, List[str]]]): A dictionary of filters where keys are classification
|
1665
|
+
types and values are lists of classification values. Can be None.
|
1666
|
+
match_all (bool): If True, performs an AND logic search. If False, performs an OR logic search.
|
1667
|
+
index_identifier (Optional[str]): If provided, filters instruments within a specific index.
|
1668
|
+
|
1669
|
+
Returns:
|
1670
|
+
list: A list of instruments that match the filter criteria.
|
1671
|
+
"""
|
1672
|
+
data = {
|
1673
|
+
"filters": filters or {},
|
1674
|
+
"matchAll": match_all
|
1675
|
+
}
|
1676
|
+
|
1677
|
+
if index_identifier:
|
1678
|
+
endpoint = self._routes["instruments.filter_with_index"].format(id=index_identifier)
|
1679
|
+
logger.debug(f"Filtering instruments for index: {index_identifier} with filters: {filters} and match_all: {match_all}")
|
1680
|
+
else:
|
1681
|
+
endpoint = self._routes["instruments.filter"]
|
1682
|
+
logger.debug(f"Filtering instruments with filters: {filters} and match_all: {match_all}")
|
1683
|
+
|
1684
|
+
return self._make_request("POST", endpoint, json=data)
|
1685
|
+
|
1601
1686
|
def _make_request(
|
1602
1687
|
self,
|
1603
1688
|
method: str,
|
@@ -1640,4 +1725,4 @@ class WizzerClient:
|
|
1640
1725
|
logger.error("API request failed: %s", e, exc_info=True)
|
1641
1726
|
if hasattr(e.response, 'text'):
|
1642
1727
|
logger.error("Response content: %s", e.response.text)
|
1643
|
-
raise
|
1728
|
+
raise
|
@@ -7,7 +7,6 @@ from typing import Callable, List, Optional, Any, Iterator
|
|
7
7
|
|
8
8
|
import websockets
|
9
9
|
from websockets.exceptions import ConnectionClosed
|
10
|
-
from websockets.protocol import State
|
11
10
|
|
12
11
|
# Setup module‐level logger with a default handler if none exists.
|
13
12
|
logger = logging.getLogger(__name__)
|
@@ -163,7 +162,7 @@ class QuotesClient:
|
|
163
162
|
# -- Async core methods (for internal use) --
|
164
163
|
|
165
164
|
async def _subscribe_async(self, instruments: List[str]) -> None:
|
166
|
-
if self.ws and self.ws.
|
165
|
+
if self.ws and self.ws.open:
|
167
166
|
new = set(instruments) - self.subscribed_instruments
|
168
167
|
if new:
|
169
168
|
self.subscribed_instruments |= new
|
@@ -178,7 +177,7 @@ class QuotesClient:
|
|
178
177
|
self.subscribed_instruments |= set(instruments)
|
179
178
|
|
180
179
|
async def _unsubscribe_async(self, instruments: List[str]) -> None:
|
181
|
-
if self.ws and self.ws.
|
180
|
+
if self.ws and self.ws.open:
|
182
181
|
to_remove = set(instruments) & self.subscribed_instruments
|
183
182
|
if to_remove:
|
184
183
|
self.subscribed_instruments -= to_remove
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: wiz_trader
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.26.0
|
4
4
|
Summary: A Python SDK for connecting to the Wizzer.
|
5
5
|
Home-page: https://bitbucket.org/wizzer-tech/quotes_sdk.git
|
6
6
|
Author: Pawan Wagh
|
@@ -59,7 +59,7 @@ Dynamic: requires-python
|
|
59
59
|
WizTrader is a Python SDK for connecting to the Wizzer trading platform. It provides two main client classes:
|
60
60
|
|
61
61
|
- **QuotesClient**: For real-time market data streaming via WebSockets
|
62
|
-
- **WizzerClient**: For REST API access to trading, order management, and market data
|
62
|
+
- **WizzerClient**: For REST API access to trading, order management, and market data, including data pipelines and classification APIs.
|
63
63
|
|
64
64
|
This documentation covers all the ways to use the SDK, with examples for each endpoint and common use cases.
|
65
65
|
|
@@ -403,6 +403,73 @@ for component in components[:5]:
|
|
403
403
|
print(f"{component['tradingSymbol']} - {component.get('weightage', 'N/A')}%")
|
404
404
|
```
|
405
405
|
|
406
|
+
#### List Classification Types
|
407
|
+
|
408
|
+
Retrieve all available classification types.
|
409
|
+
|
410
|
+
```python
|
411
|
+
classification_types = client.get_classification_types()
|
412
|
+
# Response: ['basicIndustry', 'industry', 'macroEconomicSector', 'sector']
|
413
|
+
```
|
414
|
+
|
415
|
+
#### List Classification Values
|
416
|
+
|
417
|
+
Retrieve all values for a specific classification type.
|
418
|
+
|
419
|
+
```python
|
420
|
+
basic_industry_values = client.get_classifications("basicIndustry")
|
421
|
+
# Response: ['Aerospace & Defense', 'Agricultural Food & other Products', ...]
|
422
|
+
```
|
423
|
+
|
424
|
+
#### Filter Indices by Classifications
|
425
|
+
|
426
|
+
Filter indices based on multiple classification criteria. The `match_all` parameter controls the filter logic:
|
427
|
+
- `True`: AND logic (all filters must match)
|
428
|
+
- `False`: OR logic (any filter can match)
|
429
|
+
|
430
|
+
```python
|
431
|
+
# Example: Find indices in the 'Commodities' macro-economic sector OR 'Aerospace & Defense' industry
|
432
|
+
filters = {
|
433
|
+
"macroEconomicSector": ["Commodities"],
|
434
|
+
"industry": ["Aerospace & Defense"]
|
435
|
+
}
|
436
|
+
or_logic_indices = client.filter_indices(filters=filters, match_all=False)
|
437
|
+
|
438
|
+
# Example: Find indices that are in BOTH 'Housing Finance Company' and 'Financial Services'
|
439
|
+
filters = {
|
440
|
+
"basicIndustry": ["Housing Finance Company"],
|
441
|
+
"sector": ["Financial Services"]
|
442
|
+
}
|
443
|
+
and_logic_indices = client.filter_indices(filters=filters, match_all=True)
|
444
|
+
```
|
445
|
+
|
446
|
+
#### Filter Instruments by Classifications
|
447
|
+
|
448
|
+
Filter instruments based on classification criteria.
|
449
|
+
|
450
|
+
```python
|
451
|
+
# Example: Find instruments in the 'Technology' sector
|
452
|
+
filters = {"sector": ["Technology"]}
|
453
|
+
tech_instruments = client.filter_instruments(filters=filters, match_all=True)
|
454
|
+
```
|
455
|
+
|
456
|
+
#### Filter Instruments by Classifications and Index
|
457
|
+
|
458
|
+
Filter instruments that belong to both specific classifications and a given index.
|
459
|
+
|
460
|
+
```python
|
461
|
+
# Example: Find 'Financial Services' instruments within the 'NIFTY NEXT 50' index
|
462
|
+
filters = {
|
463
|
+
"basicIndustry": ["Housing Finance Company"],
|
464
|
+
"sector": ["Financial Services"]
|
465
|
+
}
|
466
|
+
filtered_instruments = client.filter_instruments(
|
467
|
+
index_identifier="NSE:NIFTY NEXT 50:26054",
|
468
|
+
filters=filters,
|
469
|
+
match_all=False
|
470
|
+
)
|
471
|
+
```
|
472
|
+
|
406
473
|
#### Get Historical OHLCV Data
|
407
474
|
## Overview
|
408
475
|
|
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
|