unicex 0.17.3__tar.gz → 0.17.4__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.
- {unicex-0.17.3/unicex.egg-info → unicex-0.17.4}/PKG-INFO +1 -1
- {unicex-0.17.3 → unicex-0.17.4}/pyproject.toml +1 -1
- {unicex-0.17.3 → unicex-0.17.4}/unicex/extra.py +61 -0
- {unicex-0.17.3 → unicex-0.17.4/unicex.egg-info}/PKG-INFO +1 -1
- {unicex-0.17.3 → unicex-0.17.4}/LICENSE +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/README.md +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/setup.cfg +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/_abc/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/_abc/exchange_info.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/_abc/uni_client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/_abc/uni_websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/_base/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/_base/client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/_base/websocket.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/aster/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/aster/adapter.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/aster/client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/aster/exchange_info.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/aster/uni_client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/aster/uni_websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/aster/user_websocket.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/aster/websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/binance/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/binance/adapter.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/binance/client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/binance/exchange_info.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/binance/uni_client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/binance/uni_websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/binance/user_websocket.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/binance/websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bingx/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bingx/adapter.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bingx/client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bingx/exchange_info.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bingx/uni_client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bingx/uni_websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bingx/user_websocket.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bingx/websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bitget/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bitget/adapter.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bitget/client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bitget/exchange_info.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bitget/uni_client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bitget/uni_websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bitget/user_websocket.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bitget/websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bybit/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bybit/adapter.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bybit/client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bybit/exchange_info.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bybit/uni_client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bybit/uni_websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bybit/user_websocket.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/bybit/websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/enums.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/exceptions.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/gate/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/gate/adapter.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/gate/client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/gate/exchange_info.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/gate/uni_client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/gate/uni_websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/gate/user_websocket.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/gate/websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/hyperliquid/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/hyperliquid/adapter.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/hyperliquid/client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/hyperliquid/exchange_info.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/hyperliquid/uni_client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/hyperliquid/uni_websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/hyperliquid/user_websocket.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/hyperliquid/websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/kucoin/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/kucoin/adapter.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/kucoin/client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/kucoin/exchange_info.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/kucoin/uni_client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/kucoin/uni_websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/kucoin/user_websocket.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/kucoin/websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mapper.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PrivateAccountV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PrivateDealsV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PrivateOrdersV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicAggreBookTickerV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicAggreDealsV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicAggreDepthsV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicBookTickerBatchV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicBookTickerV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicDealsV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicFuture_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicIncreaseDepthsBatchV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicIncreaseDepthsV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicLimitDepthsV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicMiniTickerV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicMiniTickersV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicSpotKlineV3Api_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PushDataV3ApiWrapper_pb2.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/adapter.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/exchange_info.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/uni_client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/uni_websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/user_websocket.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/okx/__init__.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/okx/adapter.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/okx/client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/okx/exchange_info.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/okx/uni_client.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/okx/uni_websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/okx/user_websocket.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/okx/websocket_manager.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/types.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex/utils.py +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex.egg-info/SOURCES.txt +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex.egg-info/dependency_links.txt +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex.egg-info/requires.txt +0 -0
- {unicex-0.17.3 → unicex-0.17.4}/unicex.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ name = "unicex"
|
|
|
4
4
|
# • PATCH (x.y.Z) → увеличивается при багфиксе, который не ломает совместимость.
|
|
5
5
|
# • MINOR (x.Y.z) → увеличивается при добавлении новой функциональности, но без ломающих изменений (backward-compatible).
|
|
6
6
|
# • MAJOR (X.y.z) → увеличивается при изменениях, которые ломают обратную совместимость.
|
|
7
|
-
version = "0.17.
|
|
7
|
+
version = "0.17.4"
|
|
8
8
|
|
|
9
9
|
description = "Unified Crypto Exchange API "
|
|
10
10
|
readme = "README.md"
|
|
@@ -13,6 +13,7 @@ __all__ = [
|
|
|
13
13
|
]
|
|
14
14
|
|
|
15
15
|
import time
|
|
16
|
+
from collections import defaultdict
|
|
16
17
|
from typing import Literal
|
|
17
18
|
|
|
18
19
|
from .enums import Exchange, MarketType
|
|
@@ -93,6 +94,66 @@ class TimeoutTracker[T]:
|
|
|
93
94
|
self._blocked_items[item] = time.time() + duration
|
|
94
95
|
|
|
95
96
|
|
|
97
|
+
class SignalCounter[T]:
|
|
98
|
+
"""Класс, который считает количество сигналов за отведенный интервал."""
|
|
99
|
+
|
|
100
|
+
def __init__(self, window_sec: int = 86400) -> None:
|
|
101
|
+
"""Инициализация класса SignalCounter."""
|
|
102
|
+
self._window_sec = window_sec
|
|
103
|
+
self._signals: dict[T, list[float]] = defaultdict(list)
|
|
104
|
+
|
|
105
|
+
def is_within_limit(self, item: T, limit: int) -> bool:
|
|
106
|
+
"""Проверяет, что количество сигналов НЕ превышает допустимый лимит.
|
|
107
|
+
|
|
108
|
+
Лимит считается превышенным, если количество сигналов
|
|
109
|
+
равно или больше limit.
|
|
110
|
+
|
|
111
|
+
Параметры:
|
|
112
|
+
item (T): Объект (сигнал), для которого проверяется количество срабатываний.
|
|
113
|
+
limit (int): Максимально допустимое количество сигналов.
|
|
114
|
+
|
|
115
|
+
Возвращает:
|
|
116
|
+
bool:
|
|
117
|
+
True — если количество сигналов строго меньше limit
|
|
118
|
+
(лимит не превышен).
|
|
119
|
+
False — если количество сигналов равно или больше limit
|
|
120
|
+
(лимит считается превышенным).
|
|
121
|
+
|
|
122
|
+
"""
|
|
123
|
+
return self.get(item) < limit
|
|
124
|
+
|
|
125
|
+
def get(self, item: T) -> int:
|
|
126
|
+
"""Возвращает количество сигналов за интервал.
|
|
127
|
+
|
|
128
|
+
Параметры:
|
|
129
|
+
item (T): Сигнал.
|
|
130
|
+
|
|
131
|
+
Возвращает:
|
|
132
|
+
int: Количество сигналов за интервал.
|
|
133
|
+
|
|
134
|
+
"""
|
|
135
|
+
timestamp = time.time()
|
|
136
|
+
threshold = timestamp - self._window_sec
|
|
137
|
+
self._signals[item] = [t for t in self._signals[item] if t > threshold]
|
|
138
|
+
return len(self._signals[item])
|
|
139
|
+
|
|
140
|
+
def add(self, item: T) -> int:
|
|
141
|
+
"""Добавляет сигнал и возвращает количество сигналов за интервал.
|
|
142
|
+
|
|
143
|
+
Параметры:
|
|
144
|
+
item (T): Сигнал.
|
|
145
|
+
|
|
146
|
+
Возвращает:
|
|
147
|
+
int: Количество сигналов за интервал.
|
|
148
|
+
|
|
149
|
+
"""
|
|
150
|
+
timestamp = time.time()
|
|
151
|
+
self._signals[item].append(timestamp)
|
|
152
|
+
threshold = timestamp - self._window_sec
|
|
153
|
+
self._signals[item] = [t for t in self._signals[item] if t > threshold]
|
|
154
|
+
return len(self._signals[item])
|
|
155
|
+
|
|
156
|
+
|
|
96
157
|
def normalize_ticker(raw_ticker: str) -> str:
|
|
97
158
|
"""Нормализует тикер и возвращает базовую валюту (например, `BTC`).
|
|
98
159
|
|
|
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
|
|
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
|
{unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicAggreBookTickerV3Api_pb2.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicBookTickerBatchV3Api_pb2.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{unicex-0.17.3 → unicex-0.17.4}/unicex/mexc/_spot_ws_proto/PublicIncreaseDepthsBatchV3Api_pb2.py
RENAMED
|
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
|