crypticorn 1.0.1__py3-none-any.whl → 1.0.2rc2__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.
Files changed (132) hide show
  1. crypticorn/__init__.py +3 -3
  2. crypticorn/client.py +722 -0
  3. crypticorn/hive/__init__.py +1 -0
  4. crypticorn/{api.py → hive/main.py} +6 -6
  5. crypticorn/hive/requirements.txt +4 -0
  6. crypticorn/{utils.py → hive/utils.py} +2 -2
  7. crypticorn/klines/__init__.py +2 -0
  8. crypticorn/klines/client/__init__.py +62 -0
  9. crypticorn/klines/client/api/__init__.py +9 -0
  10. crypticorn/klines/client/api/funding_rates_api.py +362 -0
  11. crypticorn/klines/client/api/health_check_api.py +281 -0
  12. crypticorn/klines/client/api/ohlcv_data_api.py +409 -0
  13. crypticorn/klines/client/api/symbols_api.py +308 -0
  14. crypticorn/klines/client/api/udf_api.py +1929 -0
  15. crypticorn/klines/client/api_client.py +797 -0
  16. crypticorn/klines/client/api_response.py +21 -0
  17. crypticorn/klines/client/configuration.py +565 -0
  18. crypticorn/klines/client/exceptions.py +216 -0
  19. crypticorn/klines/client/models/__init__.py +41 -0
  20. crypticorn/klines/client/models/base_response_health_check_response.py +108 -0
  21. crypticorn/klines/client/models/base_response_list_funding_rate_response.py +112 -0
  22. crypticorn/klines/client/models/base_response_list_str.py +104 -0
  23. crypticorn/klines/client/models/base_response_ohlcv_response.py +108 -0
  24. crypticorn/klines/client/models/error_response.py +101 -0
  25. crypticorn/{models/deleted.py → klines/client/models/exchange.py} +15 -11
  26. crypticorn/klines/client/models/funding_rate_response.py +92 -0
  27. crypticorn/klines/client/models/health_check_response.py +89 -0
  28. crypticorn/{models/create_api_key_response.py → klines/client/models/history_error_response.py} +12 -22
  29. crypticorn/klines/client/models/history_no_data_response.py +99 -0
  30. crypticorn/klines/client/models/history_success_response.py +99 -0
  31. crypticorn/klines/client/models/http_validation_error.py +95 -0
  32. crypticorn/klines/client/models/market.py +37 -0
  33. crypticorn/klines/client/models/ohlcv_response.py +98 -0
  34. crypticorn/klines/client/models/resolution.py +40 -0
  35. crypticorn/klines/client/models/response_get_history_udf_history_get.py +149 -0
  36. crypticorn/klines/client/models/search_symbol_response.py +97 -0
  37. crypticorn/klines/client/models/sort_direction.py +37 -0
  38. crypticorn/{models/futures_balance_error.py → klines/client/models/symbol_group_response.py} +12 -14
  39. crypticorn/klines/client/models/symbol_info_response.py +115 -0
  40. crypticorn/{models/id.py → klines/client/models/symbol_type.py} +13 -11
  41. crypticorn/klines/client/models/timeframe.py +40 -0
  42. crypticorn/klines/client/models/udf_config_response.py +121 -0
  43. crypticorn/klines/client/models/validation_error.py +99 -0
  44. crypticorn/{models/get_futures_balance200_response_inner.py → klines/client/models/validation_error_loc_inner.py} +39 -35
  45. crypticorn/klines/client/py.typed +0 -0
  46. crypticorn/klines/client/rest.py +257 -0
  47. crypticorn/klines/main.py +42 -0
  48. crypticorn/klines/requirements.txt +4 -0
  49. crypticorn/klines/test/__init__.py +0 -0
  50. crypticorn/klines/test/test_base_response_health_check_response.py +56 -0
  51. crypticorn/klines/test/test_base_response_list_funding_rate_response.py +59 -0
  52. crypticorn/klines/test/test_base_response_list_str.py +56 -0
  53. crypticorn/klines/test/test_base_response_ohlcv_response.py +72 -0
  54. crypticorn/klines/test/test_error_response.py +57 -0
  55. crypticorn/klines/test/test_exchange.py +56 -0
  56. crypticorn/klines/test/test_funding_rate_response.py +56 -0
  57. crypticorn/klines/test/test_funding_rates_api.py +38 -0
  58. crypticorn/klines/test/test_health_check_api.py +38 -0
  59. crypticorn/klines/test/test_health_check_response.py +52 -0
  60. crypticorn/klines/test/test_history_error_response.py +53 -0
  61. crypticorn/klines/test/test_history_no_data_response.py +69 -0
  62. crypticorn/klines/test/test_history_success_response.py +87 -0
  63. crypticorn/klines/test/test_http_validation_error.py +58 -0
  64. crypticorn/klines/test/test_market.py +33 -0
  65. crypticorn/klines/test/test_ohlcv_data_api.py +38 -0
  66. crypticorn/klines/test/test_ohlcv_response.py +86 -0
  67. crypticorn/klines/test/test_resolution.py +33 -0
  68. crypticorn/klines/test/test_response_get_history_udf_history_get.py +89 -0
  69. crypticorn/klines/test/test_search_symbol_response.py +62 -0
  70. crypticorn/klines/test/test_sort_direction.py +33 -0
  71. crypticorn/klines/test/test_symbol_group_response.py +53 -0
  72. crypticorn/klines/test/test_symbol_info_response.py +84 -0
  73. crypticorn/klines/test/test_symbol_type.py +54 -0
  74. crypticorn/klines/test/test_symbols_api.py +38 -0
  75. crypticorn/klines/test/test_timeframe.py +33 -0
  76. crypticorn/klines/test/test_udf_api.py +80 -0
  77. crypticorn/klines/test/test_udf_config_response.py +95 -0
  78. crypticorn/klines/test/test_validation_error.py +60 -0
  79. crypticorn/klines/test/test_validation_error_loc_inner.py +50 -0
  80. crypticorn/trade/__init__.py +2 -0
  81. crypticorn/trade/client/__init__.py +63 -0
  82. crypticorn/trade/client/api/__init__.py +13 -0
  83. crypticorn/trade/client/api/api_keys_api.py +1468 -0
  84. crypticorn/trade/client/api/bots_api.py +1211 -0
  85. crypticorn/trade/client/api/exchanges_api.py +297 -0
  86. crypticorn/trade/client/api/futures_trading_panel_api.py +1463 -0
  87. crypticorn/trade/client/api/notifications_api.py +1767 -0
  88. crypticorn/trade/client/api/orders_api.py +331 -0
  89. crypticorn/trade/client/api/status_api.py +278 -0
  90. crypticorn/trade/client/api/strategies_api.py +331 -0
  91. crypticorn/trade/client/api/trading_actions_api.py +898 -0
  92. crypticorn/trade/client/api_client.py +797 -0
  93. crypticorn/trade/client/api_response.py +21 -0
  94. crypticorn/trade/client/configuration.py +574 -0
  95. crypticorn/trade/client/exceptions.py +216 -0
  96. crypticorn/trade/client/models/__init__.py +38 -0
  97. crypticorn/{models → trade/client/models}/action_model.py +17 -20
  98. crypticorn/{models → trade/client/models}/api_error_identifier.py +3 -1
  99. crypticorn/{models → trade/client/models}/api_key_model.py +5 -8
  100. crypticorn/{models → trade/client/models}/bot_model.py +15 -11
  101. crypticorn/{models → trade/client/models}/futures_trading_action.py +12 -12
  102. crypticorn/{models → trade/client/models}/http_validation_error.py +1 -1
  103. crypticorn/{models → trade/client/models}/notification_model.py +8 -6
  104. crypticorn/{models → trade/client/models}/order_model.py +12 -15
  105. crypticorn/{models → trade/client/models}/post_futures_action.py +1 -1
  106. crypticorn/{models → trade/client/models}/strategy_exchange_info.py +1 -1
  107. crypticorn/{models → trade/client/models}/strategy_model.py +6 -2
  108. crypticorn/{models → trade/client/models}/validation_error.py +1 -1
  109. crypticorn/trade/client/py.typed +0 -0
  110. crypticorn/trade/client/rest.py +257 -0
  111. crypticorn/trade/main.py +39 -0
  112. crypticorn/trade/requirements.txt +4 -0
  113. crypticorn-1.0.2rc2.dist-info/METADATA +47 -0
  114. crypticorn-1.0.2rc2.dist-info/RECORD +128 -0
  115. {crypticorn-1.0.1.dist-info → crypticorn-1.0.2rc2.dist-info}/WHEEL +1 -1
  116. crypticorn/models/__init__.py +0 -31
  117. crypticorn/models/modified.py +0 -87
  118. crypticorn-1.0.1.dist-info/METADATA +0 -40
  119. crypticorn-1.0.1.dist-info/RECORD +0 -38
  120. /crypticorn/{models → trade/client/models}/exchange.py +0 -0
  121. /crypticorn/{models → trade/client/models}/execution_ids.py +0 -0
  122. /crypticorn/{models → trade/client/models}/futures_balance.py +0 -0
  123. /crypticorn/{models → trade/client/models}/margin_mode.py +0 -0
  124. /crypticorn/{models → trade/client/models}/market_type.py +0 -0
  125. /crypticorn/{models → trade/client/models}/notification_type.py +0 -0
  126. /crypticorn/{models → trade/client/models}/order_status.py +0 -0
  127. /crypticorn/{models → trade/client/models}/tpsl.py +0 -0
  128. /crypticorn/{models → trade/client/models}/trading_action_type.py +0 -0
  129. /crypticorn/{models → trade/client/models}/update_notification.py +0 -0
  130. /crypticorn/{models → trade/client/models}/validation_error_loc_inner.py +0 -0
  131. {crypticorn-1.0.1.dist-info → crypticorn-1.0.2rc2.dist-info}/LICENSE.md +0 -0
  132. {crypticorn-1.0.1.dist-info → crypticorn-1.0.2rc2.dist-info}/top_level.txt +0 -0
@@ -17,14 +17,14 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict, StrictFloat, StrictInt, StrictStr
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr
21
21
  from typing import Any, ClassVar, Dict, List, Optional, Union
22
- from crypticorn.models.api_error_identifier import ApiErrorIdentifier
23
- from crypticorn.models.exchange import Exchange
24
- from crypticorn.models.margin_mode import MarginMode
25
- from crypticorn.models.market_type import MarketType
26
- from crypticorn.models.order_status import OrderStatus
27
- from crypticorn.models.trading_action_type import TradingActionType
22
+ from crypticorn.trade.client.models.api_error_identifier import ApiErrorIdentifier
23
+ from crypticorn.trade.client.models.exchange import Exchange
24
+ from crypticorn.trade.client.models.margin_mode import MarginMode
25
+ from crypticorn.trade.client.models.market_type import MarketType
26
+ from crypticorn.trade.client.models.order_status import OrderStatus
27
+ from crypticorn.trade.client.models.trading_action_type import TradingActionType
28
28
  from typing import Optional, Set
29
29
  from typing_extensions import Self
30
30
 
@@ -32,6 +32,8 @@ class OrderModel(BaseModel):
32
32
  """
33
33
  Response model for orders. All optional as the model is built step by step.
34
34
  """ # noqa: E501
35
+ created_at: Optional[StrictInt] = Field(default=1742386800, description="Timestamp of creation")
36
+ updated_at: Optional[StrictInt] = Field(default=1742386800, description="Timestamp of last update")
35
37
  id: Optional[StrictStr] = None
36
38
  trading_action_id: Optional[StrictStr] = None
37
39
  execution_id: Optional[StrictStr] = None
@@ -44,7 +46,6 @@ class OrderModel(BaseModel):
44
46
  exchange: Optional[Exchange] = None
45
47
  symbol: Optional[StrictStr] = None
46
48
  common_symbol: Optional[StrictStr] = None
47
- timestamp: Optional[StrictInt] = None
48
49
  price: Optional[Union[StrictFloat, StrictInt]] = None
49
50
  action_type: Optional[TradingActionType] = None
50
51
  market_type: Optional[MarketType] = None
@@ -57,7 +58,7 @@ class OrderModel(BaseModel):
57
58
  leverage: Optional[Union[StrictFloat, StrictInt]] = None
58
59
  order_details: Optional[Dict[str, Any]] = None
59
60
  pnl: Optional[Union[StrictFloat, StrictInt]] = None
60
- __properties: ClassVar[List[str]] = ["id", "trading_action_id", "execution_id", "exchange_order_id", "position_id", "api_key_id", "user_id", "bot_id", "client_order_id", "exchange", "symbol", "common_symbol", "timestamp", "price", "action_type", "market_type", "margin_mode", "status_code", "status", "filled_perc", "filled_qty", "fee", "leverage", "order_details", "pnl"]
61
+ __properties: ClassVar[List[str]] = ["created_at", "updated_at", "id", "trading_action_id", "execution_id", "exchange_order_id", "position_id", "api_key_id", "user_id", "bot_id", "client_order_id", "exchange", "symbol", "common_symbol", "price", "action_type", "market_type", "margin_mode", "status_code", "status", "filled_perc", "filled_qty", "fee", "leverage", "order_details", "pnl"]
61
62
 
62
63
  model_config = ConfigDict(
63
64
  populate_by_name=True,
@@ -158,11 +159,6 @@ class OrderModel(BaseModel):
158
159
  if self.common_symbol is None and "common_symbol" in self.model_fields_set:
159
160
  _dict['common_symbol'] = None
160
161
 
161
- # set to None if timestamp (nullable) is None
162
- # and model_fields_set contains the field
163
- if self.timestamp is None and "timestamp" in self.model_fields_set:
164
- _dict['timestamp'] = None
165
-
166
162
  # set to None if price (nullable) is None
167
163
  # and model_fields_set contains the field
168
164
  if self.price is None and "price" in self.model_fields_set:
@@ -235,6 +231,8 @@ class OrderModel(BaseModel):
235
231
  return cls.model_validate(obj)
236
232
 
237
233
  _obj = cls.model_validate({
234
+ "created_at": obj.get("created_at") if obj.get("created_at") is not None else 1742386800,
235
+ "updated_at": obj.get("updated_at") if obj.get("updated_at") is not None else 1742386800,
238
236
  "id": obj.get("id"),
239
237
  "trading_action_id": obj.get("trading_action_id"),
240
238
  "execution_id": obj.get("execution_id"),
@@ -247,7 +245,6 @@ class OrderModel(BaseModel):
247
245
  "exchange": obj.get("exchange"),
248
246
  "symbol": obj.get("symbol"),
249
247
  "common_symbol": obj.get("common_symbol"),
250
- "timestamp": obj.get("timestamp"),
251
248
  "price": obj.get("price"),
252
249
  "action_type": obj.get("action_type"),
253
250
  "market_type": obj.get("market_type"),
@@ -19,7 +19,7 @@ import json
19
19
 
20
20
  from pydantic import BaseModel, ConfigDict, Field, StrictStr
21
21
  from typing import Any, ClassVar, Dict, List
22
- from crypticorn.models.execution_ids import ExecutionIds
22
+ from crypticorn.trade.client.models.execution_ids import ExecutionIds
23
23
  from typing import Optional, Set
24
24
  from typing_extensions import Self
25
25
 
@@ -19,7 +19,7 @@ import json
19
19
 
20
20
  from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt
21
21
  from typing import Any, ClassVar, Dict, List, Union
22
- from crypticorn.models.exchange import Exchange
22
+ from crypticorn.trade.client.models.exchange import Exchange
23
23
  from typing import Optional, Set
24
24
  from typing_extensions import Self
25
25
 
@@ -20,7 +20,7 @@ import json
20
20
  from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictInt, StrictStr
21
21
  from typing import Any, ClassVar, Dict, List, Optional, Union
22
22
  from typing_extensions import Annotated
23
- from crypticorn.models.strategy_exchange_info import StrategyExchangeInfo
23
+ from crypticorn.trade.client.models.strategy_exchange_info import StrategyExchangeInfo
24
24
  from typing import Optional, Set
25
25
  from typing_extensions import Self
26
26
 
@@ -28,6 +28,8 @@ class StrategyModel(BaseModel):
28
28
  """
29
29
  StrategyModel
30
30
  """ # noqa: E501
31
+ created_at: Optional[StrictInt] = Field(default=1742386800, description="Timestamp of creation")
32
+ updated_at: Optional[StrictInt] = Field(default=1742386800, description="Timestamp of last update")
31
33
  id: Optional[StrictStr] = None
32
34
  identifier: StrictStr = Field(description="Unique human readable identifier for the strategy e.g. 'daily_trend_momentum'")
33
35
  name: StrictStr = Field(description="Name of the strategy")
@@ -36,7 +38,7 @@ class StrategyModel(BaseModel):
36
38
  enabled: StrictBool = Field(description="Whether the strategy is enabled")
37
39
  leverage: StrictInt = Field(description="Leverage for the strategy")
38
40
  performance_fee: Union[Annotated[float, Field(le=1.0, strict=True)], Annotated[int, Field(le=1, strict=True)]] = Field(description="Performance fee for the strategy")
39
- __properties: ClassVar[List[str]] = ["id", "identifier", "name", "description", "exchanges", "enabled", "leverage", "performance_fee"]
41
+ __properties: ClassVar[List[str]] = ["created_at", "updated_at", "id", "identifier", "name", "description", "exchanges", "enabled", "leverage", "performance_fee"]
40
42
 
41
43
  model_config = ConfigDict(
42
44
  populate_by_name=True,
@@ -101,6 +103,8 @@ class StrategyModel(BaseModel):
101
103
  return cls.model_validate(obj)
102
104
 
103
105
  _obj = cls.model_validate({
106
+ "created_at": obj.get("created_at") if obj.get("created_at") is not None else 1742386800,
107
+ "updated_at": obj.get("updated_at") if obj.get("updated_at") is not None else 1742386800,
104
108
  "id": obj.get("id"),
105
109
  "identifier": obj.get("identifier"),
106
110
  "name": obj.get("name"),
@@ -19,7 +19,7 @@ import json
19
19
 
20
20
  from pydantic import BaseModel, ConfigDict, StrictStr
21
21
  from typing import Any, ClassVar, Dict, List
22
- from crypticorn.models.validation_error_loc_inner import ValidationErrorLocInner
22
+ from crypticorn.trade.client.models.validation_error_loc_inner import ValidationErrorLocInner
23
23
  from typing import Optional, Set
24
24
  from typing_extensions import Self
25
25
 
File without changes
@@ -0,0 +1,257 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ FastAPI
5
+
6
+ No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
7
+
8
+ The version of the OpenAPI document: 0.1.0
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ import io
16
+ import json
17
+ import re
18
+ import ssl
19
+
20
+ import urllib3
21
+
22
+ from crypticorn.trade.client.exceptions import ApiException, ApiValueError
23
+
24
+ SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"}
25
+ RESTResponseType = urllib3.HTTPResponse
26
+
27
+
28
+ def is_socks_proxy_url(url):
29
+ if url is None:
30
+ return False
31
+ split_section = url.split("://")
32
+ if len(split_section) < 2:
33
+ return False
34
+ else:
35
+ return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES
36
+
37
+
38
+ class RESTResponse(io.IOBase):
39
+
40
+ def __init__(self, resp) -> None:
41
+ self.response = resp
42
+ self.status = resp.status
43
+ self.reason = resp.reason
44
+ self.data = None
45
+
46
+ def read(self):
47
+ if self.data is None:
48
+ self.data = self.response.data
49
+ return self.data
50
+
51
+ def getheaders(self):
52
+ """Returns a dictionary of the response headers."""
53
+ return self.response.headers
54
+
55
+ def getheader(self, name, default=None):
56
+ """Returns a given response header."""
57
+ return self.response.headers.get(name, default)
58
+
59
+
60
+ class RESTClientObject:
61
+
62
+ def __init__(self, configuration) -> None:
63
+ # urllib3.PoolManager will pass all kw parameters to connectionpool
64
+ # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501
65
+ # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501
66
+ # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501
67
+
68
+ # cert_reqs
69
+ if configuration.verify_ssl:
70
+ cert_reqs = ssl.CERT_REQUIRED
71
+ else:
72
+ cert_reqs = ssl.CERT_NONE
73
+
74
+ pool_args = {
75
+ "cert_reqs": cert_reqs,
76
+ "ca_certs": configuration.ssl_ca_cert,
77
+ "cert_file": configuration.cert_file,
78
+ "key_file": configuration.key_file,
79
+ }
80
+ if configuration.assert_hostname is not None:
81
+ pool_args['assert_hostname'] = (
82
+ configuration.assert_hostname
83
+ )
84
+
85
+ if configuration.retries is not None:
86
+ pool_args['retries'] = configuration.retries
87
+
88
+ if configuration.tls_server_name:
89
+ pool_args['server_hostname'] = configuration.tls_server_name
90
+
91
+
92
+ if configuration.socket_options is not None:
93
+ pool_args['socket_options'] = configuration.socket_options
94
+
95
+ if configuration.connection_pool_maxsize is not None:
96
+ pool_args['maxsize'] = configuration.connection_pool_maxsize
97
+
98
+ # https pool manager
99
+ self.pool_manager: urllib3.PoolManager
100
+
101
+ if configuration.proxy:
102
+ if is_socks_proxy_url(configuration.proxy):
103
+ from urllib3.contrib.socks import SOCKSProxyManager
104
+ pool_args["proxy_url"] = configuration.proxy
105
+ pool_args["headers"] = configuration.proxy_headers
106
+ self.pool_manager = SOCKSProxyManager(**pool_args)
107
+ else:
108
+ pool_args["proxy_url"] = configuration.proxy
109
+ pool_args["proxy_headers"] = configuration.proxy_headers
110
+ self.pool_manager = urllib3.ProxyManager(**pool_args)
111
+ else:
112
+ self.pool_manager = urllib3.PoolManager(**pool_args)
113
+
114
+ def request(
115
+ self,
116
+ method,
117
+ url,
118
+ headers=None,
119
+ body=None,
120
+ post_params=None,
121
+ _request_timeout=None
122
+ ):
123
+ """Perform requests.
124
+
125
+ :param method: http request method
126
+ :param url: http request url
127
+ :param headers: http request headers
128
+ :param body: request json body, for `application/json`
129
+ :param post_params: request post parameters,
130
+ `application/x-www-form-urlencoded`
131
+ and `multipart/form-data`
132
+ :param _request_timeout: timeout setting for this request. If one
133
+ number provided, it will be total request
134
+ timeout. It can also be a pair (tuple) of
135
+ (connection, read) timeouts.
136
+ """
137
+ method = method.upper()
138
+ assert method in [
139
+ 'GET',
140
+ 'HEAD',
141
+ 'DELETE',
142
+ 'POST',
143
+ 'PUT',
144
+ 'PATCH',
145
+ 'OPTIONS'
146
+ ]
147
+
148
+ if post_params and body:
149
+ raise ApiValueError(
150
+ "body parameter cannot be used with post_params parameter."
151
+ )
152
+
153
+ post_params = post_params or {}
154
+ headers = headers or {}
155
+
156
+ timeout = None
157
+ if _request_timeout:
158
+ if isinstance(_request_timeout, (int, float)):
159
+ timeout = urllib3.Timeout(total=_request_timeout)
160
+ elif (
161
+ isinstance(_request_timeout, tuple)
162
+ and len(_request_timeout) == 2
163
+ ):
164
+ timeout = urllib3.Timeout(
165
+ connect=_request_timeout[0],
166
+ read=_request_timeout[1]
167
+ )
168
+
169
+ try:
170
+ # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE`
171
+ if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']:
172
+
173
+ # no content type provided or payload is json
174
+ content_type = headers.get('Content-Type')
175
+ if (
176
+ not content_type
177
+ or re.search('json', content_type, re.IGNORECASE)
178
+ ):
179
+ request_body = None
180
+ if body is not None:
181
+ request_body = json.dumps(body)
182
+ r = self.pool_manager.request(
183
+ method,
184
+ url,
185
+ body=request_body,
186
+ timeout=timeout,
187
+ headers=headers,
188
+ preload_content=False
189
+ )
190
+ elif content_type == 'application/x-www-form-urlencoded':
191
+ r = self.pool_manager.request(
192
+ method,
193
+ url,
194
+ fields=post_params,
195
+ encode_multipart=False,
196
+ timeout=timeout,
197
+ headers=headers,
198
+ preload_content=False
199
+ )
200
+ elif content_type == 'multipart/form-data':
201
+ # must del headers['Content-Type'], or the correct
202
+ # Content-Type which generated by urllib3 will be
203
+ # overwritten.
204
+ del headers['Content-Type']
205
+ # Ensures that dict objects are serialized
206
+ post_params = [(a, json.dumps(b)) if isinstance(b, dict) else (a,b) for a, b in post_params]
207
+ r = self.pool_manager.request(
208
+ method,
209
+ url,
210
+ fields=post_params,
211
+ encode_multipart=True,
212
+ timeout=timeout,
213
+ headers=headers,
214
+ preload_content=False
215
+ )
216
+ # Pass a `string` parameter directly in the body to support
217
+ # other content types than JSON when `body` argument is
218
+ # provided in serialized form.
219
+ elif isinstance(body, str) or isinstance(body, bytes):
220
+ r = self.pool_manager.request(
221
+ method,
222
+ url,
223
+ body=body,
224
+ timeout=timeout,
225
+ headers=headers,
226
+ preload_content=False
227
+ )
228
+ elif headers['Content-Type'].startswith('text/') and isinstance(body, bool):
229
+ request_body = "true" if body else "false"
230
+ r = self.pool_manager.request(
231
+ method,
232
+ url,
233
+ body=request_body,
234
+ preload_content=False,
235
+ timeout=timeout,
236
+ headers=headers)
237
+ else:
238
+ # Cannot generate the request from given parameters
239
+ msg = """Cannot prepare a request message for provided
240
+ arguments. Please check that your arguments match
241
+ declared content type."""
242
+ raise ApiException(status=0, reason=msg)
243
+ # For `GET`, `HEAD`
244
+ else:
245
+ r = self.pool_manager.request(
246
+ method,
247
+ url,
248
+ fields={},
249
+ timeout=timeout,
250
+ headers=headers,
251
+ preload_content=False
252
+ )
253
+ except urllib3.exceptions.SSLError as e:
254
+ msg = "\n".join([type(e).__name__, str(e)])
255
+ raise ApiException(status=0, reason=msg)
256
+
257
+ return RESTResponse(r)
@@ -0,0 +1,39 @@
1
+ from crypticorn.trade import (
2
+ BotsApi,
3
+ ExchangesApi,
4
+ NotificationsApi,
5
+ OrdersApi,
6
+ StatusApi,
7
+ StrategiesApi,
8
+ TradingActionsApi,
9
+ FuturesTradingPanelApi,
10
+ APIKeysApi,
11
+ ApiClient,
12
+ Configuration,
13
+ )
14
+
15
+
16
+ class TradeClient:
17
+ """
18
+ A client for interacting with the Crypticorn Trade API.
19
+ """
20
+
21
+ def __init__(self, base_url: str = None, api_key: str = None, jwt: str = None):
22
+ # Configure Trade client
23
+ self.host = f"{base_url}/v1/trade"
24
+ config = Configuration(
25
+ host=self.host,
26
+ access_token=jwt,
27
+ # authorization=api_key, # TODO: add api key verification
28
+ )
29
+ base_client = ApiClient(configuration=config)
30
+ # Instantiate all the endpoint clients
31
+ self.bots = BotsApi(base_client)
32
+ self.exchanges = ExchangesApi(base_client)
33
+ self.notifications = NotificationsApi(base_client)
34
+ self.orders = OrdersApi(base_client)
35
+ self.status = StatusApi(base_client)
36
+ self.strategies = StrategiesApi(base_client)
37
+ self.trading_actions = TradingActionsApi(base_client)
38
+ self.futures = FuturesTradingPanelApi(base_client)
39
+ self.api_keys = APIKeysApi(base_client)
@@ -0,0 +1,4 @@
1
+ urllib3 >= 1.25.3, < 3.0.0
2
+ python_dateutil >= 2.8.2
3
+ pydantic >= 2
4
+ typing-extensions >= 4.7.1
@@ -0,0 +1,47 @@
1
+ Metadata-Version: 2.2
2
+ Name: crypticorn
3
+ Version: 1.0.2rc2
4
+ Summary: Maximise Your Crypto Trading Profits with AI Predictions
5
+ Author-email: Crypticorn <timon@crypticorn.com>
6
+ License: MIT License
7
+ Project-URL: Homepage, https://crypticorn.com
8
+ Keywords: machine learning,data science,crypto,modelling
9
+ Classifier: Topic :: Scientific/Engineering
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Typing :: Typed
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE.md
19
+ Provides-Extra: trade
20
+ Requires-Dist: urllib3<3.0.0,>=1.25.3; extra == "trade"
21
+ Requires-Dist: python_dateutil>=2.8.2; extra == "trade"
22
+ Requires-Dist: pydantic>=2; extra == "trade"
23
+ Requires-Dist: typing-extensions>=4.7.1; extra == "trade"
24
+ Provides-Extra: klines
25
+ Requires-Dist: urllib3<3.0.0,>=1.25.3; extra == "klines"
26
+ Requires-Dist: python_dateutil>=2.8.2; extra == "klines"
27
+ Requires-Dist: pydantic>=2; extra == "klines"
28
+ Requires-Dist: typing-extensions>=4.7.1; extra == "klines"
29
+ Provides-Extra: hive
30
+ Requires-Dist: pandas<3.0.0,>=2.2.0; extra == "hive"
31
+ Requires-Dist: requests<3.0.0,>=2.32.0; extra == "hive"
32
+ Requires-Dist: tqdm<5.0.0,>=4.67.0; extra == "hive"
33
+ Requires-Dist: pydantic<3.0.0,>=2.0.0; extra == "hive"
34
+ Provides-Extra: dev
35
+ Requires-Dist: streamlit; extra == "dev"
36
+ Requires-Dist: httpx; extra == "dev"
37
+ Requires-Dist: build; extra == "dev"
38
+ Requires-Dist: black; extra == "dev"
39
+ Requires-Dist: twine; extra == "dev"
40
+ Requires-Dist: pyflakes; extra == "dev"
41
+ Provides-Extra: test
42
+ Requires-Dist: pytest>=7.2.1; extra == "test"
43
+ Requires-Dist: pytest-cov>=2.8.1; extra == "test"
44
+ Requires-Dist: tox>=3.9.0; extra == "test"
45
+ Requires-Dist: flake8>=4.0.0; extra == "test"
46
+ Requires-Dist: types-python-dateutil>=2.8.19.14; extra == "test"
47
+ Requires-Dist: mypy>=1.5; extra == "test"
@@ -0,0 +1,128 @@
1
+ crypticorn/__init__.py,sha256=tSmvwtqHKKAzbhWIc8Vt95hffRf8aEYX-8wWX6ZAPaM,147
2
+ crypticorn/client.py,sha256=AWM7R7X24QQvOJn-YnJQtwK8G7SVNBrfwpGRGdji2uY,29215
3
+ crypticorn/hive/__init__.py,sha256=1o5DghmXxXFp7cL-RCNg9_EqNAJih7ftEl5gz0Q19Qc,43
4
+ crypticorn/hive/main.py,sha256=ZdB0mS_x37pGF7r63Ek-RMYTfGkmdKPf2Sj18WGGJKw,4856
5
+ crypticorn/hive/requirements.txt,sha256=-eIbxeVF3c8WJ-QKUSHm-16kCHVp-dRP7isN25wbxqw,103
6
+ crypticorn/hive/utils.py,sha256=UOgdUomUDoX97OylN0_4fsu3mPsJHaUkpHqNmSp-QYE,3126
7
+ crypticorn/klines/__init__.py,sha256=9UUW013uZ5x4evz5zRUxbNid-6O9WAPPYvPZIHpAwms,87
8
+ crypticorn/klines/main.py,sha256=_c_lVK2tTdiAz36jkUvdNipEg-h-j3VsiSliBehdNmc,1590
9
+ crypticorn/klines/requirements.txt,sha256=n8RhXDEAbEojFhhRCctaYym4TMVetN5A7FZ-tjjgMRA,93
10
+ crypticorn/klines/client/__init__.py,sha256=yRh5QZclw9iV6gx5VXxkcQLDuIDgqf8n4-NHsfjX4Ps,3732
11
+ crypticorn/klines/client/api_client.py,sha256=daaHrXxIXfsBxpAf82DFktJRXb5V3Di23oMkQp8HO1E,27818
12
+ crypticorn/klines/client/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
13
+ crypticorn/klines/client/configuration.py,sha256=T9KKthOv2xPmDV5b1STn1VdNLaJ-m-mkJsN8IhVVjDk,17910
14
+ crypticorn/klines/client/exceptions.py,sha256=HguTaQpkSMBj5KBOCTJ3SBg4USOfHhIcQ3b5XqnQ1Zg,6755
15
+ crypticorn/klines/client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ crypticorn/klines/client/rest.py,sha256=43g9TDd2NnYnf2uWqepgwFlZrx2SwxDOewdNFGMhMaM,9706
17
+ crypticorn/klines/client/api/__init__.py,sha256=TJz6q5vOTkPnyAxKyldGojE6y5rPdDoMNIV2JHLbpbo,385
18
+ crypticorn/klines/client/api/funding_rates_api.py,sha256=2uvNa5iALWWI9YEPWjmRTW2FFyUU6MKeSNrsiv1kSy4,14717
19
+ crypticorn/klines/client/api/health_check_api.py,sha256=lmAwwxp9wyYM9GbSp31mh2hieBaPKrP26mKrG7_almw,10753
20
+ crypticorn/klines/client/api/ohlcv_data_api.py,sha256=T29hx3Q5jUCAQK36fk82pdVV55g4c6TyBpH2Dl1z9Dw,17121
21
+ crypticorn/klines/client/api/symbols_api.py,sha256=VBl-K6soMueXQvQvmsKXI9x22Z5U71pFblLT0-RV040,11967
22
+ crypticorn/klines/client/api/udf_api.py,sha256=zx6YssNqPz61P121Ri787GHwrGxdoVVwoqiqYh5uyJI,72370
23
+ crypticorn/klines/client/models/__init__.py,sha256=tG5LpvKiSFCXJeXZ6T_-PDZYyjuZIFWcSDMFXtlneXI,2761
24
+ crypticorn/klines/client/models/base_response_health_check_response.py,sha256=naRstiHVscc-bzNwKAmfsuTz1By-XhrO1NAlSpj_wvU,3954
25
+ crypticorn/klines/client/models/base_response_list_funding_rate_response.py,sha256=zlbjz8L-YVjVPlFWGRmJPbfsneLQdNRtqdiVWvj2Z3w,4152
26
+ crypticorn/klines/client/models/base_response_list_str.py,sha256=6iKQ4US1J3xtVL1F9lkhr0DMC_yx6WKQRPR2MK3n6uw,3595
27
+ crypticorn/klines/client/models/base_response_ohlcv_response.py,sha256=hXlBkl35iIkBH0gKd39x-eVFFpW017wVhhsZT497rWg,3905
28
+ crypticorn/klines/client/models/error_response.py,sha256=kpPqsuBsG70QijtjhNFLcDNqzjQ9pdO0Qxw-KrBIf44,3457
29
+ crypticorn/klines/client/models/exchange.py,sha256=OM8EyBnzeoMns0EhLb3cOZ0Sl5J8S0u0rjXNg8r1o24,2866
30
+ crypticorn/klines/client/models/funding_rate_response.py,sha256=27H2uzkiyKnBTPu_DZCnbco5hasyc6lJ0ruXYyQtVvI,3046
31
+ crypticorn/klines/client/models/health_check_response.py,sha256=QJRpoJjtyG_xGnCfCqVlgpzVzWAYz9_H9SDXQqahPSA,2998
32
+ crypticorn/klines/client/models/history_error_response.py,sha256=gFbHzKqa7zmrMuvhtMTlh7x7N0nPpdkjGDj0w4trKoQ,2912
33
+ crypticorn/klines/client/models/history_no_data_response.py,sha256=I11VDZDGBkqb-h-mekmv7GbbIemuiy9DgOkIBYINhO8,3434
34
+ crypticorn/klines/client/models/history_success_response.py,sha256=pgtZR3hMOri6bNebM7QDPaNewIlHsXH6gPfuP4u2Zo8,3326
35
+ crypticorn/klines/client/models/http_validation_error.py,sha256=ELlAbC8sbVCj5vbORmvwz2f0yPzOSOVGRX88Al9x8vY,3298
36
+ crypticorn/klines/client/models/market.py,sha256=B9SyGnzmUmIF7mipmmxMz3g3elXjKT0Eaj_2zF7lCwY,1013
37
+ crypticorn/klines/client/models/ohlcv_response.py,sha256=HwgJlV6DHgVecHmdFkCxYqQn6xqGAUjXSgSTeo1-Fto,3290
38
+ crypticorn/klines/client/models/resolution.py,sha256=cG2c9ci8ML4KoMyAhydIl3k8Xof4kqKotga6wV3wSxo,1080
39
+ crypticorn/klines/client/models/response_get_history_udf_history_get.py,sha256=LHHvYkX3yXjQbdqUpMVvqQ-zWJQyrZu4Z0LmaOrIxos,6408
40
+ crypticorn/klines/client/models/search_symbol_response.py,sha256=6ldl7w97r_vNTJ_-ioLNp5DVsgwhjG8hA5DOaq4bEmM,3185
41
+ crypticorn/klines/client/models/sort_direction.py,sha256=1jY_QIV3y2WDIGEH58OHzjbWN4pf_YTP93Mh756zU0g,1026
42
+ crypticorn/klines/client/models/symbol_group_response.py,sha256=DtlSkA7MkV6YTG-UO32__6k-Sy1ouQ5Cx6rOV5JUq7k,2817
43
+ crypticorn/klines/client/models/symbol_info_response.py,sha256=nR5UNos61yh8vC_GoBnqDPU-30AowSu6M5dbUv4GmMQ,4142
44
+ crypticorn/klines/client/models/symbol_type.py,sha256=w_3BW5_G4qAa7nREeKIvmVqUV_Jd6qkPpVM6sJ7CQQA,2809
45
+ crypticorn/klines/client/models/timeframe.py,sha256=hxcNrPTIoYimYBwuNG_KowG9xB4X914743AOvvZCojA,1079
46
+ crypticorn/klines/client/models/udf_config_response.py,sha256=YaeCHhH_VX6sJlklw4eS9MH6W8E_RTxBcsS70gbcSeM,5277
47
+ crypticorn/klines/client/models/validation_error.py,sha256=Jmxe-nLipKwGbKLiZRHwrT3yF2s-micZ5s7Z3pd6jbM,3390
48
+ crypticorn/klines/client/models/validation_error_loc_inner.py,sha256=4okdF8FqhyWXtD1zZFyngleCv3B11eAJdIDI03eFIOY,5169
49
+ crypticorn/klines/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ crypticorn/klines/test/test_base_response_health_check_response.py,sha256=wEGQH5X-GPG42l7FwwSc7P7m3vQkaRzMfQVXu_PpxU4,2181
51
+ crypticorn/klines/test/test_base_response_list_funding_rate_response.py,sha256=cY7q9y_5DSLmbJrLf7qPsc1cpuiGy8B2yfZXCW6vjIw,2398
52
+ crypticorn/klines/test/test_base_response_list_str.py,sha256=NHsfoW-I81AEFXICiTFgnMial9v75xYcghQjdOYkZnQ,1949
53
+ crypticorn/klines/test/test_base_response_ohlcv_response.py,sha256=dkl0ErxNlL4gX5Yx-t12nBz-ZidifvvNKepq5T719xY,2619
54
+ crypticorn/klines/test/test_error_response.py,sha256=jBR4ga9WKW7sMZD2RYYwlV6nTz5fVNZxhu_L0irVAYk,1932
55
+ crypticorn/klines/test/test_exchange.py,sha256=OjD2pyyMa7h80bRqjG8D2qEm0Hgv6J3B2LdyBKWtIdI,1739
56
+ crypticorn/klines/test/test_funding_rate_response.py,sha256=z26hWTlS9tNxyYZS5QQ5G2bPZ2wtqHE_XinkCDy8MFo,2055
57
+ crypticorn/klines/test/test_funding_rates_api.py,sha256=pbaZ21JtiB8vWeY4KZKTnD_LzxEWZb4lvGctonWCyLQ,1123
58
+ crypticorn/klines/test/test_health_check_api.py,sha256=wl6vC5MwRIfHviZT_VaNQNudA4ZueVZaZPbDBDBtTgw,1055
59
+ crypticorn/klines/test/test_health_check_response.py,sha256=u4IYyQqDYZh3ZwXhrGMgEUZn6is0hHv08dGFSXiGRbM,1775
60
+ crypticorn/klines/test/test_history_error_response.py,sha256=jLtpjock2qfW-S77EbXCluRhgBnkbQVIls1gliOpS5E,1808
61
+ crypticorn/klines/test/test_history_no_data_response.py,sha256=nyaUzdxRfmxEwt5aoYyclXI_zSZxWmsKnjMSolOpc3s,2188
62
+ crypticorn/klines/test/test_history_success_response.py,sha256=VuBVDVXd55berpitDapgl8PIG31I8puTOoCl3RHg6Rk,2617
63
+ crypticorn/klines/test/test_http_validation_error.py,sha256=R4-Y5AaGG3KOF186n807fwG6l4CpWRYFgh5oGrDt5fs,1996
64
+ crypticorn/klines/test/test_market.py,sha256=ECis_r2Mw7CH8zpWq1ryeWdzxD8wB824NbVpQcfUPZw,948
65
+ crypticorn/klines/test/test_ohlcv_data_api.py,sha256=7BydPyycLPeGS5p1F0cNcGjwD7QGv-ZGcqNaiRekgE8,1105
66
+ crypticorn/klines/test/test_ohlcv_response.py,sha256=rKJqRgIRF13fqtfPeTwE4Vx_DewZJTqX1eS0XY28j0M,2680
67
+ crypticorn/klines/test/test_resolution.py,sha256=kvhW2JJ6PB2zjW7S9Z4cm62JwdgLSXzPmOJrreCW0vo,976
68
+ crypticorn/klines/test/test_response_get_history_udf_history_get.py,sha256=6Y3amNSIIniMz9sbmMdlVyJzz59s4sSgFYzLkW6OCWU,2789
69
+ crypticorn/klines/test/test_search_symbol_response.py,sha256=cK6VC4NG5TQZjbn12w_q5yMudGIWToF8Z99PAcfjFTg,2085
70
+ crypticorn/klines/test/test_sort_direction.py,sha256=r7qpTz_IPLYjZT9o0TU9wt1CKy_tvC1VneF3AyIYOY0,998
71
+ crypticorn/klines/test/test_symbol_group_response.py,sha256=wI8CO6lzejXC6RgGGrGOl8edR5N6BELp1ZSZVfH4Rjs,1782
72
+ crypticorn/klines/test/test_symbol_info_response.py,sha256=5dPtp3BJi62uvnjsaEo9gSvJMYc1kIu8puItixpUcSY,2781
73
+ crypticorn/klines/test/test_symbol_type.py,sha256=ojRM2yhJa-94yfhDRu4dGTV0vIK61lT3vCGT3PwIjDM,1710
74
+ crypticorn/klines/test/test_symbols_api.py,sha256=4eJ6Z2ELOn-zGqt7pUtk-BEcgMvK57uot4NFtsU_RA8,1070
75
+ crypticorn/klines/test/test_timeframe.py,sha256=6XpneN7_eZtGgyzNEB2gjqKaoDgROUrC_AzChimB0ZU,969
76
+ crypticorn/klines/test/test_udf_api.py,sha256=GHb4-jTWPwnDn1O0PxRq58p-LRvt1qXCoBLxoKUYYlA,2031
77
+ crypticorn/klines/test/test_udf_config_response.py,sha256=WCMj8VVWE1tQgIuvRSbuFI1ixU8iQx2J105VjA2mzmE,3214
78
+ crypticorn/klines/test/test_validation_error.py,sha256=6zSVzD_LX5yIGKGZJgsH74tsXQsV6DhJIpXyqPV-fow,1910
79
+ crypticorn/klines/test/test_validation_error_loc_inner.py,sha256=D4dHw64J4-bTmMd5K-JuwKaKzHfe8bJvHdAcAfX8nsA,1759
80
+ crypticorn/trade/__init__.py,sha256=QzScH9n-ly3QSaBSpPP7EqYwhdzDqYCZJs0-AhEhrsY,84
81
+ crypticorn/trade/main.py,sha256=7CpTb-5JiDCgRJwjb2sohTcO1sbL_ux3d8p1cFOd4pg,1228
82
+ crypticorn/trade/requirements.txt,sha256=n8RhXDEAbEojFhhRCctaYym4TMVetN5A7FZ-tjjgMRA,93
83
+ crypticorn/trade/client/__init__.py,sha256=Fq_jmX_KcwTcUKG5SLky3UgeiAuJNwJLkomDXFc_APw,3241
84
+ crypticorn/trade/client/api_client.py,sha256=QFMMs_EPtc0_kS2uIhGPfBVbabN0nI7hyJ98FfeVa7s,27528
85
+ crypticorn/trade/client/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
86
+ crypticorn/trade/client/configuration.py,sha256=i6US_tKRg9asIQwARr9mXtJyhATuvSu5vumscOTRqCg,17933
87
+ crypticorn/trade/client/exceptions.py,sha256=upZXBQh1bx93N8JIPJh89j67pArS4oxcCmZ_cfdK2XU,6471
88
+ crypticorn/trade/client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
+ crypticorn/trade/client/rest.py,sha256=88DaQixyRu5OiYCPrSmUfZg5CK6-Qj5xv8FNbw3yzyM,9421
90
+ crypticorn/trade/client/api/__init__.py,sha256=s0PaWLA2MkjhypdxW0p_cb5Oxr3Bsds-3-x2HMA9Gtk,669
91
+ crypticorn/trade/client/api/api_keys_api.py,sha256=rA_FN5e1rmcaYjQC-ntk8A9gJntyai1oFLCOl7Obd3U,53921
92
+ crypticorn/trade/client/api/bots_api.py,sha256=X2qppDqJ_XRcUSlIFJpWoRAc6c3JodC_feWeVMJl1O4,44115
93
+ crypticorn/trade/client/api/exchanges_api.py,sha256=bN-WrYOjlCs4mTChkKlmM45WptJkkkh7Ny3zoQ4G81A,10898
94
+ crypticorn/trade/client/api/futures_trading_panel_api.py,sha256=OQBCOZjsywFHpIS25gl6_FC5zTE_PORnMAReOrQANuQ,53610
95
+ crypticorn/trade/client/api/notifications_api.py,sha256=zlgW01-iAM_cdjGYuKThjV3BC5JV4LlKXhVUjuUxdug,65207
96
+ crypticorn/trade/client/api/orders_api.py,sha256=O7CUT0yARw0aE2tEumXp0b3zoDXhWEs_yswQHTtjzhk,11841
97
+ crypticorn/trade/client/api/status_api.py,sha256=iQ3GeojJ1FMEmKihgDkdIxJAbttVO7m8HAax1zcg1ZE,10020
98
+ crypticorn/trade/client/api/strategies_api.py,sha256=XQiSOpDSgMC0_gi_KtZvFx0Lpj_8ejoaKL3Kjq3_I1I,11910
99
+ crypticorn/trade/client/api/trading_actions_api.py,sha256=B9div3_yrd0JjzCG3eFnxteIS4aSd-ZeRcWJ5nxNbas,33969
100
+ crypticorn/trade/client/models/__init__.py,sha256=Sg6eh8BbEwF2FG7FphlBkCuWV93UcZjgZ5B0lIGF7B4,1995
101
+ crypticorn/trade/client/models/action_model.py,sha256=nHfTRpdZk2c5P9apDzjppgRszP2DtDq_589NgYeItIo,9224
102
+ crypticorn/trade/client/models/api_error_identifier.py,sha256=LKcH6vRnpPxIWnzbhICAsx4D5uN_OsOf3BzplmYKhOE,3402
103
+ crypticorn/trade/client/models/api_key_model.py,sha256=dpJPvuSqr7DoO_bapBH7gpO7EW3WlesIANy1grIJ6dI,4911
104
+ crypticorn/trade/client/models/bot_model.py,sha256=ME32DpruVjZauo9MfhaP0UEMeULJ37Fz7t9qmZRWsSk,4726
105
+ crypticorn/trade/client/models/exchange.py,sha256=UdNrCO_0L8ZFmuVsBgtEjV71UpRdi2I0XW-YeDyb7zw,746
106
+ crypticorn/trade/client/models/execution_ids.py,sha256=dJt4Qjg0B1TdeL3fI0_ZNGMZgYX_KBwIbzwxSWgSCao,2877
107
+ crypticorn/trade/client/models/futures_balance.py,sha256=VJ2Cdm5qdvzQwaF0sR2tIoWhb5MDQAvWOOVl_lyijNc,4012
108
+ crypticorn/trade/client/models/futures_trading_action.py,sha256=A3JO5ifaxm-xBRlMosMFAoOe-KkM1Bx6FDdGFDVQUhs,8836
109
+ crypticorn/trade/client/models/http_validation_error.py,sha256=3SRsszhn2w2qVZO9FhNR2M0ozNUGeWvPF-ywzE5ehCg,3013
110
+ crypticorn/trade/client/models/margin_mode.py,sha256=u96KDpDFRM0MIs4xbXzDOT-wn6uO73wBGZthoTP1MuE,765
111
+ crypticorn/trade/client/models/market_type.py,sha256=ppUr4WJnAiuZEZkD1WnM-oKi4vKx0ykXweAXAyfPTCk,745
112
+ crypticorn/trade/client/models/notification_model.py,sha256=rUikEYx7hbFzpo0GQY47wHts9C0Jc_7UfDoJ3IUAoWk,4358
113
+ crypticorn/trade/client/models/notification_type.py,sha256=Cq7GDV6BwBxttohb7NMdC0nWx1-Igdq4pUDYY8CCiu0,803
114
+ crypticorn/trade/client/models/order_model.py,sha256=bzTTUyQMGxNC0DqT2epDHOZbAwsLU3Q6o0j5uajf_5s,11303
115
+ crypticorn/trade/client/models/order_status.py,sha256=V13eUjWXoZn5TD0Eyl2Q7XL9Ih6zkOUyCPOhNQ7UyTk,840
116
+ crypticorn/trade/client/models/post_futures_action.py,sha256=AdD6sQxuNUSglNUwXosTYcBdtYYqIrIvHtYcyEm3nvA,3003
117
+ crypticorn/trade/client/models/strategy_exchange_info.py,sha256=sNATmx0U6T6weg-T3vYsr1JaqgcG-36qdfuBKqpWY9Q,2834
118
+ crypticorn/trade/client/models/strategy_model.py,sha256=2C2ToLDm2mMYP9Gk2lzGaULoBt0tVsl5AjkaPplIvWU,4834
119
+ crypticorn/trade/client/models/tpsl.py,sha256=6Ue5uRCkMm1dUSr7xT4Y9308ZsjoZwIQ74koZGBAF6c,4180
120
+ crypticorn/trade/client/models/trading_action_type.py,sha256=eH7sFKbFojxqMdtmqq_FOrVVZ6jEOwK-uRPBBWQdeUw,845
121
+ crypticorn/trade/client/models/update_notification.py,sha256=7Aw4z98ANT6D5octUmz5UXe6EC7_Mk8ax679bjjCkXk,2988
122
+ crypticorn/trade/client/models/validation_error.py,sha256=hMZJHRMZuiByzCvD7zyR5HVzlzJSnLKcMnybUalQvgI,3105
123
+ crypticorn/trade/client/models/validation_error_loc_inner.py,sha256=wHiW_qKw46E2pUdOnesgpdnuqpTX9IQTaEOVDgph5_E,4885
124
+ crypticorn-1.0.2rc2.dist-info/LICENSE.md,sha256=4QRTsg__j9b8qUNkL1jcDlrOMViv5B7wJF3p7khs-M0,1053
125
+ crypticorn-1.0.2rc2.dist-info/METADATA,sha256=-JVX691iYZHKknke7psUIAPqoEs0Sy0O-6Hwgdsi23Y,1973
126
+ crypticorn-1.0.2rc2.dist-info/WHEEL,sha256=beeZ86-EfXScwlR_HKu4SllMC9wUEj_8Z_4FJ3egI2w,91
127
+ crypticorn-1.0.2rc2.dist-info/top_level.txt,sha256=EP3NY216qIBYfmvGl0L2Zc9ItP0DjGSkiYqd9xJwGcM,11
128
+ crypticorn-1.0.2rc2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.0.0)
2
+ Generator: setuptools (76.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5