crypticorn 2.6.0__py3-none-any.whl → 2.7.1__py3-none-any.whl

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.
@@ -60,6 +60,7 @@ class ApiErrorIdentifier(ExcludeEnumMixin, StrEnum):
60
60
  INVALID_PARAMETER = "invalid_parameter_provided"
61
61
  LEVERAGE_EXCEEDED = "leverage_limit_exceeded"
62
62
  LIQUIDATION_PRICE_VIOLATION = "order_violates_liquidation_price_constraints"
63
+ MODEL_NAME_NOT_UNIQUE = "model_name_not_unique"
63
64
  NO_CREDENTIALS = "no_credentials"
64
65
  NOW_API_DOWN = "now_api_down"
65
66
  OBJECT_ALREADY_EXISTS = "object_already_exists"
@@ -318,6 +319,11 @@ class ApiError(ExcludeEnumMixin, Enum, metaclass=ApiErrorFallback):
318
319
  ApiErrorType.SERVER_ERROR,
319
320
  ApiErrorLevel.ERROR,
320
321
  )
322
+ MODEL_NAME_NOT_UNIQUE = (
323
+ ApiErrorIdentifier.MODEL_NAME_NOT_UNIQUE,
324
+ ApiErrorType.USER_ERROR,
325
+ ApiErrorLevel.ERROR,
326
+ )
321
327
  NO_CREDENTIALS = (
322
328
  ApiErrorIdentifier.NO_CREDENTIALS,
323
329
  ApiErrorType.USER_ERROR,
@@ -598,6 +604,10 @@ class StatusCodeMapper:
598
604
  status.HTTP_409_CONFLICT,
599
605
  status.WS_1008_POLICY_VIOLATION,
600
606
  ),
607
+ ApiError.MODEL_NAME_NOT_UNIQUE: (
608
+ status.HTTP_409_CONFLICT,
609
+ status.WS_1008_POLICY_VIOLATION,
610
+ ),
601
611
  # Invalid Content
602
612
  ApiError.CONTENT_TYPE_ERROR: (
603
613
  status.HTTP_415_UNSUPPORTED_MEDIA_TYPE,
@@ -48,9 +48,10 @@ class DataApi:
48
48
  version: Annotated[
49
49
  Optional[DataVersion],
50
50
  Field(description="Data version. Default is the latest public version."),
51
- ],
51
+ ] = None,
52
52
  feature_size: Annotated[
53
- Optional[FeatureSize], Field(description="Feature size")
53
+ Optional[FeatureSize],
54
+ Field(description="The number of features in the data. Default is LARGE."),
54
55
  ] = None,
55
56
  _request_timeout: Union[
56
57
  None,
@@ -70,9 +71,9 @@ class DataApi:
70
71
 
71
72
  :param model_id: Model ID (required)
72
73
  :type model_id: int
73
- :param version: Data version. Default is the latest public version. (required)
74
+ :param version: Data version. Default is the latest public version.
74
75
  :type version: DataVersion
75
- :param feature_size: Feature size
76
+ :param feature_size: The number of features in the data. Default is LARGE.
76
77
  :type feature_size: FeatureSize
77
78
  :param _request_timeout: timeout setting for this request. If one
78
79
  number provided, it will be total request
@@ -125,9 +126,10 @@ class DataApi:
125
126
  version: Annotated[
126
127
  Optional[DataVersion],
127
128
  Field(description="Data version. Default is the latest public version."),
128
- ],
129
+ ] = None,
129
130
  feature_size: Annotated[
130
- Optional[FeatureSize], Field(description="Feature size")
131
+ Optional[FeatureSize],
132
+ Field(description="The number of features in the data. Default is LARGE."),
131
133
  ] = None,
132
134
  _request_timeout: Union[
133
135
  None,
@@ -147,9 +149,9 @@ class DataApi:
147
149
 
148
150
  :param model_id: Model ID (required)
149
151
  :type model_id: int
150
- :param version: Data version. Default is the latest public version. (required)
152
+ :param version: Data version. Default is the latest public version.
151
153
  :type version: DataVersion
152
- :param feature_size: Feature size
154
+ :param feature_size: The number of features in the data. Default is LARGE.
153
155
  :type feature_size: FeatureSize
154
156
  :param _request_timeout: timeout setting for this request. If one
155
157
  number provided, it will be total request
@@ -202,9 +204,10 @@ class DataApi:
202
204
  version: Annotated[
203
205
  Optional[DataVersion],
204
206
  Field(description="Data version. Default is the latest public version."),
205
- ],
207
+ ] = None,
206
208
  feature_size: Annotated[
207
- Optional[FeatureSize], Field(description="Feature size")
209
+ Optional[FeatureSize],
210
+ Field(description="The number of features in the data. Default is LARGE."),
208
211
  ] = None,
209
212
  _request_timeout: Union[
210
213
  None,
@@ -224,9 +227,9 @@ class DataApi:
224
227
 
225
228
  :param model_id: Model ID (required)
226
229
  :type model_id: int
227
- :param version: Data version. Default is the latest public version. (required)
230
+ :param version: Data version. Default is the latest public version.
228
231
  :type version: DataVersion
229
- :param feature_size: Feature size
232
+ :param feature_size: The number of features in the data. Default is LARGE.
230
233
  :type feature_size: FeatureSize
231
234
  :param _request_timeout: timeout setting for this request. If one
232
235
  number provided, it will be total request
@@ -20,7 +20,7 @@ from typing_extensions import Self
20
20
 
21
21
  class Coins(str, Enum):
22
22
  """
23
- All ever existing coins
23
+ All existing coins. Some might no be available in the latest data version, but kept for older versions.
24
24
  """
25
25
 
26
26
  """
@@ -17,7 +17,7 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict
20
+ from pydantic import BaseModel, ConfigDict, Field
21
21
  from typing import Any, ClassVar, Dict, List
22
22
  from crypticorn.hive.client.models.coins import Coins
23
23
  from crypticorn.hive.client.models.data_version import DataVersion
@@ -30,13 +30,13 @@ from typing_extensions import Self
30
30
 
31
31
  class DataDownloadResponse(BaseModel):
32
32
  """
33
- DataDownloadResponse
33
+ The response for a data download request
34
34
  """ # noqa: E501
35
35
 
36
- coin: Coins
37
- feature_size: FeatureSize
38
- version: DataVersion
39
- target: Target
36
+ coin: Coins = Field(description="The coin the data is for")
37
+ feature_size: FeatureSize = Field(description="The feature size the data is for")
38
+ version: DataVersion = Field(description="The version of the data")
39
+ target: Target = Field(description="The target of the data")
40
40
  links: DownloadLinks
41
41
  __properties: ClassVar[List[str]] = [
42
42
  "coin",
@@ -17,7 +17,7 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict
20
+ from pydantic import BaseModel, ConfigDict, Field
21
21
  from typing import Any, ClassVar, Dict, List
22
22
  from crypticorn.hive.client.models.coins import Coins
23
23
  from crypticorn.hive.client.models.data_value_value_value_inner import (
@@ -32,15 +32,27 @@ from typing_extensions import Self
32
32
 
33
33
  class DataInfo(BaseModel):
34
34
  """
35
- DataInfo
35
+ The complete data information for all versions, coins, feature sizes and targets
36
36
  """ # noqa: E501
37
37
 
38
- data: Dict[str, Dict[str, Dict[str, List[DataValueValueValueInner]]]]
39
- coins: List[Coins]
40
- feature_sizes: List[FeatureSize]
41
- targets: List[TargetInfo]
42
- all_versions: List[DataVersionInfo]
43
- available_versions: List[DataVersionInfo]
38
+ data: Dict[str, Dict[str, Dict[str, List[DataValueValueValueInner]]]] = Field(
39
+ description="The complete data information for all versions, coins, feature sizes and targets."
40
+ )
41
+ coins: List[Coins] = Field(
42
+ description="The coins available on the latest data version."
43
+ )
44
+ feature_sizes: List[FeatureSize] = Field(
45
+ description="The feature sizes available on the latest data version."
46
+ )
47
+ targets: List[TargetInfo] = Field(
48
+ description="The targets available on the latest data version."
49
+ )
50
+ all_versions: List[DataVersionInfo] = Field(
51
+ description="All ever existing data versions. Some may not be publicly available yet."
52
+ )
53
+ available_versions: List[DataVersionInfo] = Field(
54
+ description="All publicly available data versions."
55
+ )
44
56
  __properties: ClassVar[List[str]] = [
45
57
  "data",
46
58
  "coins",
@@ -20,7 +20,7 @@ from typing_extensions import Self
20
20
 
21
21
  class DataVersion(str, Enum):
22
22
  """
23
- All ever existing data versions
23
+ All existing data versions
24
24
  """
25
25
 
26
26
  """
@@ -25,12 +25,16 @@ from typing_extensions import Self
25
25
 
26
26
  class DownloadLinks(BaseModel):
27
27
  """
28
- DownloadLinks
28
+ The download links for the data
29
29
  """ # noqa: E501
30
30
 
31
- y_train: StrictStr
32
- x_test: StrictStr = Field(alias="X_test")
33
- x_train: StrictStr = Field(alias="X_train")
31
+ y_train: StrictStr = Field(description="The download link for the y_train data")
32
+ x_test: StrictStr = Field(
33
+ description="The download link for the X_test data", alias="X_test"
34
+ )
35
+ x_train: StrictStr = Field(
36
+ description="The download link for the X_train data", alias="X_train"
37
+ )
34
38
  __properties: ClassVar[List[str]] = ["y_train", "X_test", "X_train"]
35
39
 
36
40
  model_config = ConfigDict(
@@ -20,7 +20,7 @@ from typing_extensions import Self
20
20
 
21
21
  class FeatureSize(str, Enum):
22
22
  """
23
- All ever existing feature sizes
23
+ All existing feature sizes. Some might no be available in the latest data version, but kept for older versions.
24
24
  """
25
25
 
26
26
  """
@@ -20,7 +20,7 @@ from typing_extensions import Self
20
20
 
21
21
  class Target(str, Enum):
22
22
  """
23
- All ever existing targets
23
+ All existing targets. Some might no be available in the latest data version, but kept for older versions.
24
24
  """
25
25
 
26
26
  """
@@ -28,7 +28,7 @@ from typing_extensions import Self
28
28
 
29
29
  class TargetInfo(BaseModel):
30
30
  """
31
- TargetInfo
31
+ Information about a target
32
32
  """ # noqa: E501
33
33
 
34
34
  name: Target = Field(description="Target name")
@@ -20,7 +20,7 @@ from typing_extensions import Self
20
20
 
21
21
  class TargetType(str, Enum):
22
22
  """
23
- TargetType
23
+ The type of the target
24
24
  """
25
25
 
26
26
  """
crypticorn/hive/main.py CHANGED
@@ -1,3 +1,6 @@
1
+ import asyncio
2
+ from pathlib import Path
3
+ import os
1
4
  from crypticorn.hive import (
2
5
  ApiClient,
3
6
  Configuration,
@@ -6,7 +9,51 @@ from crypticorn.hive import (
6
9
  StatusApi,
7
10
  Configuration,
8
11
  )
9
- from crypticorn.common import apikey_header as aph
12
+ from crypticorn.hive.utils import download_file
13
+ import logging
14
+
15
+
16
+ class DataApiWrapper(DataApi):
17
+ """
18
+ A wrapper for the DataApi class.
19
+ """
20
+
21
+ async def download_data(self, folder: Path = "data", *args, **kwargs) -> list[Path]:
22
+ """
23
+ Download data for model training. All three files (y_train, x_test, x_train) are downloaded and saved under e.g. FOLDER/v1/coin_1/*.feather.
24
+ The folder will be created if it doesn't exist.
25
+
26
+ :param model_id: Model ID (required) (type: int)
27
+ :param version: Data version. Default is the latest public version. (optional) (type: DataVersion)
28
+ :param feature_size: The number of features in the data. Default is LARGE. (optional) (type: FeatureSize)
29
+ :return: A list of paths to the downloaded files.
30
+ """
31
+ response = await super().download_data(*args, **kwargs)
32
+ base_path = f"{folder}/v{response.version.value}/coin_{response.coin.value}/"
33
+ os.makedirs(base_path, exist_ok=True)
34
+
35
+ return await asyncio.gather(
36
+ *[
37
+ download_file(
38
+ url=response.links.y_train,
39
+ dest_path=base_path + "y_train_" + response.target + ".feather",
40
+ ),
41
+ download_file(
42
+ url=response.links.x_test,
43
+ dest_path=base_path
44
+ + "x_test_"
45
+ + response.feature_size
46
+ + ".feather",
47
+ ),
48
+ download_file(
49
+ url=response.links.x_train,
50
+ dest_path=base_path
51
+ + "x_train_"
52
+ + response.feature_size
53
+ + ".feather",
54
+ ),
55
+ ]
56
+ )
10
57
 
11
58
 
12
59
  class HiveClient:
@@ -24,5 +71,5 @@ class HiveClient:
24
71
  self.base_client = ApiClient(configuration=self.config)
25
72
  # Instantiate all the endpoint clients
26
73
  self.models = ModelsApi(self.base_client)
27
- self.data = DataApi(self.base_client)
74
+ self.data = DataApiWrapper(self.base_client)
28
75
  self.status = StatusApi(self.base_client)
@@ -0,0 +1,67 @@
1
+ import requests
2
+ import os
3
+ import tqdm
4
+ import logging
5
+
6
+ logger = logging.getLogger(__name__)
7
+ logger.setLevel(logging.INFO)
8
+
9
+
10
+ async def download_file(
11
+ url: str, dest_path: str, show_progress_bars: bool = True
12
+ ) -> str:
13
+ """downloads a file and shows a progress bar. allow resuming a download"""
14
+ file_size = 0
15
+ req = requests.get(url, stream=True, timeout=600)
16
+ req.raise_for_status()
17
+
18
+ total_size = int(req.headers.get("content-length", 0))
19
+ temp_path = dest_path + ".temp"
20
+
21
+ if os.path.exists(dest_path):
22
+ logger.info(f" file already exists: {dest_path}")
23
+ file_size = os.stat(dest_path).st_size
24
+ if file_size == total_size:
25
+ return dest_path
26
+
27
+ if os.path.exists(temp_path):
28
+ file_size = os.stat(temp_path).st_size
29
+
30
+ if file_size < total_size:
31
+ # Download incomplete
32
+ logger.info(f" resuming download")
33
+ resume_header = {"Range": f"bytes={file_size}-"}
34
+ req = requests.get(
35
+ url,
36
+ headers=resume_header,
37
+ stream=True,
38
+ verify=False,
39
+ allow_redirects=True,
40
+ timeout=600,
41
+ )
42
+ else:
43
+ # Error, delete file and restart download
44
+ logger.error(f" deleting file {dest_path} and restarting")
45
+ os.remove(temp_path)
46
+ file_size = 0
47
+ else:
48
+ # File does not exist, starting download
49
+ logger.info(f" starting download")
50
+
51
+ # write dataset to file and show progress bar
52
+ pbar = tqdm.tqdm(
53
+ total=total_size,
54
+ unit="B",
55
+ unit_scale=True,
56
+ desc=dest_path,
57
+ disable=not show_progress_bars,
58
+ )
59
+ # Update progress bar to reflect how much of the file is already downloaded
60
+ pbar.update(file_size)
61
+ with open(temp_path, "ab") as dest_file:
62
+ for chunk in req.iter_content(1024):
63
+ dest_file.write(chunk)
64
+ pbar.update(1024)
65
+ # move temp file to target destination
66
+ os.replace(temp_path, dest_path)
67
+ return dest_path
crypticorn/klines/main.py CHANGED
@@ -10,6 +10,25 @@ from crypticorn.klines import (
10
10
  )
11
11
  from crypticorn.common import optional_import
12
12
 
13
+ class KlinesClient:
14
+ """
15
+ A client for interacting with the Crypticorn Klines API.
16
+ """
17
+
18
+ config_class = Configuration
19
+
20
+ def __init__(
21
+ self,
22
+ config: Configuration,
23
+ ):
24
+ self.config = config
25
+ self.base_client = ApiClient(configuration=self.config)
26
+ # Instantiate all the endpoint clients
27
+ self.funding = FundingRatesApiWrapper(self.base_client)
28
+ self.ohlcv = OHLCVDataApiWrapper(self.base_client)
29
+ self.symbols = SymbolsApiWrapper(self.base_client)
30
+ self.udf = UDFApi(self.base_client)
31
+ self.status = StatusApi(self.base_client)
13
32
 
14
33
  class FundingRatesApiWrapper(FundingRatesApi):
15
34
  """
@@ -21,11 +40,16 @@ class FundingRatesApiWrapper(FundingRatesApi):
21
40
  Get the funding rates in a pandas DataFrame.
22
41
  """
23
42
  pd = optional_import("pandas", "extra")
24
- response = await self.get_funding_rates_without_preload_content(*args, **kwargs)
25
- response.raise_for_status()
26
- json_data = await response.json()
27
- return pd.DataFrame(json_data)
28
-
43
+ response = await self.get_funding_rates(*args, **kwargs)
44
+ response = [
45
+ {
46
+ "timestamp": int(m.timestamp.timestamp()),
47
+ "symbol": m.symbol,
48
+ "funding_rate": m.funding_rate,
49
+ }
50
+ for m in response
51
+ ]
52
+ return pd.DataFrame(response)
29
53
 
30
54
  class OHLCVDataApiWrapper(OHLCVDataApi):
31
55
  """
@@ -37,19 +61,20 @@ class OHLCVDataApiWrapper(OHLCVDataApi):
37
61
  Get the OHLCV data in a pandas DataFrame.
38
62
  """
39
63
  pd = optional_import("pandas", "extra")
40
- response = await self.get_ohlcv_without_preload_content(*args, **kwargs)
41
- response.raise_for_status()
42
- json_data = await response.json()
43
- return pd.DataFrame(
64
+ response = await self.get_ohlcv(*args, **kwargs)
65
+ df = pd.DataFrame(
44
66
  {
45
- "timestamp": json_data["timestamp"],
46
- "open": json_data["open"],
47
- "high": json_data["high"],
48
- "low": json_data["low"],
49
- "close": json_data["close"],
50
- "volume": json_data["volume"],
67
+ "timestamp": [int(d.timestamp()) for d in response.timestamps],
68
+ "open": response.open,
69
+ "high": response.high,
70
+ "low": response.low,
71
+ "close": response.close,
72
+ "volume": response.volume,
51
73
  }
52
74
  )
75
+ df.sort_values(by="timestamp", ascending=False, inplace=True)
76
+ df.reset_index(drop=True, inplace=True)
77
+ return df
53
78
 
54
79
 
55
80
  class SymbolsApiWrapper(SymbolsApi):
@@ -62,30 +87,7 @@ class SymbolsApiWrapper(SymbolsApi):
62
87
  Get the symbols in a pandas DataFrame.
63
88
  """
64
89
  pd = optional_import("pandas", "extra")
65
- response = await self.get_klines_symbols_without_preload_content(
66
- *args, **kwargs
67
- )
68
- response.raise_for_status()
69
- json_data = await response.json()
70
- return pd.DataFrame(json_data["data"], columns=["symbol"])
90
+ response = await self.get_klines_symbols(*args, **kwargs)
91
+ return pd.DataFrame(response, columns=["symbol"])
71
92
 
72
93
 
73
- class KlinesClient:
74
- """
75
- A client for interacting with the Crypticorn Klines API.
76
- """
77
-
78
- config_class = Configuration
79
-
80
- def __init__(
81
- self,
82
- config: Configuration,
83
- ):
84
- self.config = config
85
- self.base_client = ApiClient(configuration=self.config)
86
- # Instantiate all the endpoint clients
87
- self.funding = FundingRatesApiWrapper(self.base_client)
88
- self.ohlcv = OHLCVDataApiWrapper(self.base_client)
89
- self.symbols = SymbolsApiWrapper(self.base_client)
90
- self.udf = UDFApi(self.base_client)
91
- self.status = StatusApi(self.base_client)
@@ -33,7 +33,7 @@ class MetricsClient:
33
33
  self.marketcap = MarketcapApiWrapper(self.base_client)
34
34
  self.markets = MarketsApi(self.base_client)
35
35
  self.tokens = TokensApiWrapper(self.base_client)
36
- self.exchanges = ExchangesApi(self.base_client)
36
+ self.exchanges = ExchangesApiWrapper(self.base_client)
37
37
 
38
38
 
39
39
  class MarketcapApiWrapper(MarketcapApi):
@@ -46,12 +46,8 @@ class MarketcapApiWrapper(MarketcapApi):
46
46
  Get the marketcap symbols in a pandas dataframe
47
47
  """
48
48
  pd = optional_import("pandas", "extra")
49
- response = await self.get_marketcap_symbols_without_preload_content(
50
- *args, **kwargs
51
- )
52
- response.raise_for_status()
53
- json_response = await response.json()
54
- df = pd.DataFrame(json_response["data"])
49
+ response = await self.get_marketcap_symbols(*args, **kwargs)
50
+ df = pd.DataFrame(response)
55
51
  df.rename(columns={df.columns[0]: "timestamp"}, inplace=True)
56
52
  return df
57
53
 
@@ -66,12 +62,8 @@ class TokensApiWrapper(TokensApi):
66
62
  Get the tokens in a pandas dataframe
67
63
  """
68
64
  pd = optional_import("pandas", "extra")
69
- response = await self.get_stable_and_wrapped_tokens_without_preload_content(
70
- *args, **kwargs
71
- )
72
- response.raise_for_status()
73
- json_data = await response.json()
74
- return pd.DataFrame(json_data)
65
+ response = await self.get_stable_and_wrapped_tokens(*args, **kwargs)
66
+ return pd.DataFrame(response)
75
67
 
76
68
 
77
69
  class ExchangesApiWrapper(ExchangesApi):
@@ -79,18 +71,14 @@ class ExchangesApiWrapper(ExchangesApi):
79
71
  A wrapper for the ExchangesApi class.
80
72
  """
81
73
 
82
- async def get_exchanges_fmt(self, *args, **kwargs) -> pd.DataFrame: # type: ignore
74
+ async def get_available_exchanges_fmt(self, *args, **kwargs) -> pd.DataFrame: # type: ignore
83
75
  """
84
76
  Get the exchanges in a pandas dataframe
85
77
  """
86
78
  pd = optional_import("pandas", "extra")
87
- response = await self.get_available_exchanges_without_preload_content(
88
- *args, **kwargs
89
- )
90
- response.raise_for_status()
91
- json_data = await response.json()
79
+ response = await self.get_available_exchanges(*args, **kwargs)
92
80
  processed_results = []
93
- for row in json_data:
81
+ for row in response:
94
82
  data = {"timestamp": row["timestamp"]}
95
83
  data.update(row["exchanges"])
96
84
  processed_results.append(data)
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crypticorn
3
- Version: 2.6.0
4
- Summary: Maximise Your Crypto Trading Profits with AI Predictions
3
+ Version: 2.7.1
4
+ Summary: Maximise Your Crypto Trading Profits with Machine Learning
5
5
  Author-email: Crypticorn <timon@crypticorn.com>
6
6
  Project-URL: Homepage, https://crypticorn.com
7
7
  Keywords: machine learning,data science,crypto,modelling
@@ -64,7 +64,7 @@ crypticorn/common/__init__.py,sha256=42ajAXlz0LDBb1AFyX8xvwpp1MB_YrvqutFDkLthUQM
64
64
  crypticorn/common/auth.py,sha256=60SRXlW72VJO8rGzCiemWmzGu8tXDqWr0wt9EM6p8aI,8631
65
65
  crypticorn/common/decorators.py,sha256=pmnGYCIrLv59wZkDbvPyK9NJmgPJWW74LXTdIWSjOkY,1063
66
66
  crypticorn/common/enums.py,sha256=RitDVqlG_HTe6tHT6bWusZNFCeYk1eQvJVH-7x3_Zlg,668
67
- crypticorn/common/errors.py,sha256=I1wuD8ZaMqlhJDk-SE1yS41KyjPEhNQ4r4LpLXwcSBw,27515
67
+ crypticorn/common/errors.py,sha256=K1VSEKZro1I4cmi-sOhx24pTrvhbbD4RBRRqKodWpA8,27851
68
68
  crypticorn/common/exceptions.py,sha256=Rrpk2ORou2F__cNUWmXs6tFZwIFBZppF4YapUSZLfOQ,5662
69
69
  crypticorn/common/mixins.py,sha256=LKPcNTR8uREeDGWTlWozNx7rS1mYdQVx1RllLhxIAsE,1640
70
70
  crypticorn/common/pagination.py,sha256=c07jrMNrBaNTmgx4sppdP7ND4RNT7NBqBXWvofazIlE,2251
@@ -73,7 +73,8 @@ crypticorn/common/status_router.py,sha256=s7LY3aNQPhtDUgNWHRszfCQMl0Uh13li_jR8je
73
73
  crypticorn/common/urls.py,sha256=3Gf1NU1XQYcOTjcdztG3bDAE98FVbgTK2QXzUe7tFVQ,878
74
74
  crypticorn/common/utils.py,sha256=Kz2-I96MKIGKM18PHQ77VbKHLMGUvZG_jjj7xpQed8k,2138
75
75
  crypticorn/hive/__init__.py,sha256=hRfTlEzEql4msytdUC_04vfaHzVKG5CGZle1M-9QFgY,81
76
- crypticorn/hive/main.py,sha256=WUgsjs9p9zZ5NgPuD54m1u8dLnM8yaYCYHF51AH2IaE,665
76
+ crypticorn/hive/main.py,sha256=4oQ2RybZMbe0kRxVJrVAABsN5kUTCMExQFJDSnAzBUY,2428
77
+ crypticorn/hive/utils.py,sha256=dxQ_OszrnTsslO5hDefMmgfj6yRwRPr8sr17fGizWIw,2066
77
78
  crypticorn/hive/client/__init__.py,sha256=BZ7MlUhK1x5j73WRPTPJFbTSELv9urdbpPonq04m6Aw,2331
78
79
  crypticorn/hive/client/api_client.py,sha256=fDFsACK7hxXw_sgt3ZJVH2RplEdUhR0YZd4tsZA9P5Q,26869
79
80
  crypticorn/hive/client/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
@@ -82,30 +83,30 @@ crypticorn/hive/client/exceptions.py,sha256=IKuM8sbMtr3T9z-fOuePTJmheUFahzmyZ8ia
82
83
  crypticorn/hive/client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
84
  crypticorn/hive/client/rest.py,sha256=VhXkE7R3y1RD0QmbvIwmsk-LP_DmOei_zd9YiIXer28,6975
84
85
  crypticorn/hive/client/api/__init__.py,sha256=y0KYdyqWZTjlf6IKASYmLdUs9a2aiFMHrfQO_V_-ZUw,223
85
- crypticorn/hive/client/api/data_api.py,sha256=9WpN0R1eI6Bq7KfJwm7R_fJ0IYIDoBIehQiUG3sb4kE,22351
86
+ crypticorn/hive/client/api/data_api.py,sha256=GJlH2Qs1KmWCc4nv7y5byyyFDiidLdooG-WvbBv-Z-4,22624
86
87
  crypticorn/hive/client/api/models_api.py,sha256=61r9uObh1puEGJOXi_v-LmEP1xNqfbEo5spEYzlAA44,74136
87
88
  crypticorn/hive/client/api/status_api.py,sha256=3ZZ9e1duL9Oz8gWvQQMryUevuRY_ERMPpClW8gY2THE,28714
88
89
  crypticorn/hive/client/models/__init__.py,sha256=C-SmdIMEQljgJaxgADRAgHQuknh0sCZiAELnHC4SuJI,1539
89
- crypticorn/hive/client/models/coins.py,sha256=9fTwC6_7mMS2dz4cUZoLYWloOpAjCr-KySGYrVZO_IE,795
90
- crypticorn/hive/client/models/data_download_response.py,sha256=ZipGpZW_BPmjLeHimiveacWc3R27afjA2c8R7xXAlAE,3425
91
- crypticorn/hive/client/models/data_info.py,sha256=2moeH1k9b6-jot6HIzyduONTNWXFcB2ltW3U0sZd5nk,5068
90
+ crypticorn/hive/client/models/coins.py,sha256=4rPueVFUDbdU-8KrZ5b1jwqasf3uMT_cIsORyKbeydc,875
91
+ crypticorn/hive/client/models/data_download_response.py,sha256=AVPLov8RO9zq6vThUe7M4p3LlhZQytXyPbFZD1AFDfY,3649
92
+ crypticorn/hive/client/models/data_info.py,sha256=5MILoSXWeiWArYKUtDi4448mSdamE3elCQuYE5je8Kk,5716
92
93
  crypticorn/hive/client/models/data_value_value_value_inner.py,sha256=fMkZWwAwrdmTDjwD9PVNIh4WzZ_nFACD57B7OPKO4n4,4987
93
- crypticorn/hive/client/models/data_version.py,sha256=MMgH6JyFdcpAc6mzs4j13Gumd0vDTw3UEOsKFSOcsSg,668
94
+ crypticorn/hive/client/models/data_version.py,sha256=Id_PKD-6GDVgkxbg194s3gOokgpX3WbLQ3CGdctnajU,663
94
95
  crypticorn/hive/client/models/data_version_info.py,sha256=LdwEwSgGfOzjitxiPXZfEp7IDkMQJs_7SCftZI0-5TQ,2687
95
- crypticorn/hive/client/models/download_links.py,sha256=bmxzXwpGxlFwoOPPsKFtEGdotzP_04WHQvzuj2mtu-Q,2639
96
+ crypticorn/hive/client/models/download_links.py,sha256=nXq__ZoJ2ZVqeofVolB9B47LgGGDQKorPBNRsdp8uPU,2854
96
97
  crypticorn/hive/client/models/evaluation.py,sha256=WeLJA4tCS4W_CnGxRAgrxySWko3QPYzpxeVDuYyLPgM,2608
97
98
  crypticorn/hive/client/models/evaluation_response.py,sha256=iwE1G1_EOFga6Zztf1A8z6TNiNc_R06r2lKLHIr5_6A,2526
98
99
  crypticorn/hive/client/models/exception_detail.py,sha256=xLvJvILpIQl3Nl0LYtDPXsZcIouWIUB-0fqoUAaqiaU,3657
99
- crypticorn/hive/client/models/feature_size.py,sha256=4lICZHaNU9eLkHzcTaquajSrcOGlBBRFvEKySPp89bc,705
100
+ crypticorn/hive/client/models/feature_size.py,sha256=saLwDjXIzoa9sPO0lMvm3x4FavG2-IbBLub7-TOzW2M,785
100
101
  crypticorn/hive/client/models/model.py,sha256=xbyqGaaiql35T2-qGyG1kkLsnKJCEmzm1bBNvQDf4FI,4536
101
102
  crypticorn/hive/client/models/model_create.py,sha256=f6Ayw3KD39qw0qtvYF77K3huy7_Tmzv8pDyyQ_ooAG8,2828
102
103
  crypticorn/hive/client/models/model_status.py,sha256=-2H6CHw6jhJgv4VJgwr1sgN2NtT1m7LGCX7L8ULTxEQ,685
103
104
  crypticorn/hive/client/models/model_update.py,sha256=iO-VtYt0aRzj9z_GeIUK2OVNg9yvM01OUVfWyCA36fc,2413
104
- crypticorn/hive/client/models/target.py,sha256=eTDXDO4Vv1bB-cFrH7FuEeY7Eaf0YDIrQgba9TW7Y6s,697
105
- crypticorn/hive/client/models/target_info.py,sha256=evxehW41BlLG2EUYb4ZZBKgF-0-3ZzHNSFWe_7qyjiQ,2841
106
- crypticorn/hive/client/models/target_type.py,sha256=rv9ub_0BM5DAR8jtGAZKbTO7RObEu-86kPT4dTS-OuM,672
105
+ crypticorn/hive/client/models/target.py,sha256=otOJK8s5WVUen6J1AQZpRiD330RIpaJU6JShb-EU8Hs,777
106
+ crypticorn/hive/client/models/target_info.py,sha256=hFaOMZlirH2B68DQstL_c4WvtejwXyOk67lxIaeuh3Q,2857
107
+ crypticorn/hive/client/models/target_type.py,sha256=FUMaEFkPM7EvStPJE1auimDJ9mxDf6pbsFf-dF3coGw,684
107
108
  crypticorn/klines/__init__.py,sha256=9UUW013uZ5x4evz5zRUxbNid-6O9WAPPYvPZIHpAwms,87
108
- crypticorn/klines/main.py,sha256=uQ7Ds_pQZ68o3uvSUOd7J0NEyy9--88dKXhzzm0F9dI,2754
109
+ crypticorn/klines/main.py,sha256=gLbd-taZhyHLV20CT2CFQr-ucM0oESx9QtqoYTe-G4U,2788
109
110
  crypticorn/klines/client/__init__.py,sha256=YLtas-sCXyq543ujKIWIT73qfQ1D97stsztr1AWjhSc,2222
110
111
  crypticorn/klines/client/api_client.py,sha256=XYk_eoVRHxQDoTKJJwMpO__LbU1DQtpMikBTyulJrvE,26925
111
112
  crypticorn/klines/client/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
@@ -134,7 +135,7 @@ crypticorn/klines/client/models/symbol_type.py,sha256=uOEqlQJ714fa0SEYOxzCOx9cG-
134
135
  crypticorn/klines/client/models/timeframe.py,sha256=bSZJz3Q78V1RAnm3ZDtGBzFOnDKE3Pc5A0eP3ky3KaI,760
135
136
  crypticorn/klines/client/models/udf_config.py,sha256=3VxMqMJb7AqwxWyeM1SxEd4jp2r-iRZppVRW7RHR7iY,5066
136
137
  crypticorn/metrics/__init__.py,sha256=t7FrHV5PaVTka90eIxDgOaWvOiyznSStcUanSbLov2o,126
137
- crypticorn/metrics/main.py,sha256=Gg-kF8zgGs4oSl2lqH8ef-3QAEsAjOld0N-_nXDuhdo,3501
138
+ crypticorn/metrics/main.py,sha256=hT7dS8Nc3IEIHOGAzVDehEOwHy3GlmEjaL2IxREHjhw,3127
138
139
  crypticorn/metrics/client/__init__.py,sha256=IcYZIuKVRCnesSbJgvn_-Wg1it5vY0goYwL-pNdVfh0,1727
139
140
  crypticorn/metrics/client/api_client.py,sha256=pGWJuO-mgxlUdhJGwkScf7CviGzjDrmUAiU0LXasQY4,26934
140
141
  crypticorn/metrics/client/api_response.py,sha256=WhxwYDSMm6wPixp9CegO8dJzjFxDz3JF1yCq9s0ZqKE,639
@@ -220,8 +221,8 @@ crypticorn/trade/client/models/strategy_model_input.py,sha256=ala19jARyfA5ysys5D
220
221
  crypticorn/trade/client/models/strategy_model_output.py,sha256=2o2lhbgUSTznowpMLEHF1Ex9TG9oRmzlCIb-gXqo7_s,5643
221
222
  crypticorn/trade/client/models/tpsl.py,sha256=C2KgTIZs-a8W4msdaXgBKJcwtA-o5wR4rBauRP-iQxU,4317
222
223
  crypticorn/trade/client/models/trading_action_type.py,sha256=pGq_TFLMPfYFizYP-xKgEC1ZF4U3lGdJYoGa_ZH2x-Q,769
223
- crypticorn-2.6.0.dist-info/METADATA,sha256=bDu5aD7J0MfUC_bMe6FL57Z8niFcOTBWWG_WTu1tEro,6247
224
- crypticorn-2.6.0.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
225
- crypticorn-2.6.0.dist-info/entry_points.txt,sha256=d_xHsGvUTebPveVUK0SrpDFQ5ZRSjlI7lNCc11sn2PM,59
226
- crypticorn-2.6.0.dist-info/top_level.txt,sha256=EP3NY216qIBYfmvGl0L2Zc9ItP0DjGSkiYqd9xJwGcM,11
227
- crypticorn-2.6.0.dist-info/RECORD,,
224
+ crypticorn-2.7.1.dist-info/METADATA,sha256=V-HqZMdshq4XkwDAHV-vBDfZ2dqR1nhtrHiUb0EJDXc,6249
225
+ crypticorn-2.7.1.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
226
+ crypticorn-2.7.1.dist-info/entry_points.txt,sha256=d_xHsGvUTebPveVUK0SrpDFQ5ZRSjlI7lNCc11sn2PM,59
227
+ crypticorn-2.7.1.dist-info/top_level.txt,sha256=EP3NY216qIBYfmvGl0L2Zc9ItP0DjGSkiYqd9xJwGcM,11
228
+ crypticorn-2.7.1.dist-info/RECORD,,