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.
- crypticorn/__init__.py +3 -3
- crypticorn/client.py +722 -0
- crypticorn/hive/__init__.py +1 -0
- crypticorn/{api.py → hive/main.py} +6 -6
- crypticorn/hive/requirements.txt +4 -0
- crypticorn/{utils.py → hive/utils.py} +2 -2
- crypticorn/klines/__init__.py +2 -0
- crypticorn/klines/client/__init__.py +62 -0
- crypticorn/klines/client/api/__init__.py +9 -0
- crypticorn/klines/client/api/funding_rates_api.py +362 -0
- crypticorn/klines/client/api/health_check_api.py +281 -0
- crypticorn/klines/client/api/ohlcv_data_api.py +409 -0
- crypticorn/klines/client/api/symbols_api.py +308 -0
- crypticorn/klines/client/api/udf_api.py +1929 -0
- crypticorn/klines/client/api_client.py +797 -0
- crypticorn/klines/client/api_response.py +21 -0
- crypticorn/klines/client/configuration.py +565 -0
- crypticorn/klines/client/exceptions.py +216 -0
- crypticorn/klines/client/models/__init__.py +41 -0
- crypticorn/klines/client/models/base_response_health_check_response.py +108 -0
- crypticorn/klines/client/models/base_response_list_funding_rate_response.py +112 -0
- crypticorn/klines/client/models/base_response_list_str.py +104 -0
- crypticorn/klines/client/models/base_response_ohlcv_response.py +108 -0
- crypticorn/klines/client/models/error_response.py +101 -0
- crypticorn/{models/deleted.py → klines/client/models/exchange.py} +15 -11
- crypticorn/klines/client/models/funding_rate_response.py +92 -0
- crypticorn/klines/client/models/health_check_response.py +89 -0
- crypticorn/{models/create_api_key_response.py → klines/client/models/history_error_response.py} +12 -22
- crypticorn/klines/client/models/history_no_data_response.py +99 -0
- crypticorn/klines/client/models/history_success_response.py +99 -0
- crypticorn/klines/client/models/http_validation_error.py +95 -0
- crypticorn/klines/client/models/market.py +37 -0
- crypticorn/klines/client/models/ohlcv_response.py +98 -0
- crypticorn/klines/client/models/resolution.py +40 -0
- crypticorn/klines/client/models/response_get_history_udf_history_get.py +149 -0
- crypticorn/klines/client/models/search_symbol_response.py +97 -0
- crypticorn/klines/client/models/sort_direction.py +37 -0
- crypticorn/{models/futures_balance_error.py → klines/client/models/symbol_group_response.py} +12 -14
- crypticorn/klines/client/models/symbol_info_response.py +115 -0
- crypticorn/{models/id.py → klines/client/models/symbol_type.py} +13 -11
- crypticorn/klines/client/models/timeframe.py +40 -0
- crypticorn/klines/client/models/udf_config_response.py +121 -0
- crypticorn/klines/client/models/validation_error.py +99 -0
- crypticorn/{models/get_futures_balance200_response_inner.py → klines/client/models/validation_error_loc_inner.py} +39 -35
- crypticorn/klines/client/py.typed +0 -0
- crypticorn/klines/client/rest.py +257 -0
- crypticorn/klines/main.py +42 -0
- crypticorn/klines/requirements.txt +4 -0
- crypticorn/klines/test/__init__.py +0 -0
- crypticorn/klines/test/test_base_response_health_check_response.py +56 -0
- crypticorn/klines/test/test_base_response_list_funding_rate_response.py +59 -0
- crypticorn/klines/test/test_base_response_list_str.py +56 -0
- crypticorn/klines/test/test_base_response_ohlcv_response.py +72 -0
- crypticorn/klines/test/test_error_response.py +57 -0
- crypticorn/klines/test/test_exchange.py +56 -0
- crypticorn/klines/test/test_funding_rate_response.py +56 -0
- crypticorn/klines/test/test_funding_rates_api.py +38 -0
- crypticorn/klines/test/test_health_check_api.py +38 -0
- crypticorn/klines/test/test_health_check_response.py +52 -0
- crypticorn/klines/test/test_history_error_response.py +53 -0
- crypticorn/klines/test/test_history_no_data_response.py +69 -0
- crypticorn/klines/test/test_history_success_response.py +87 -0
- crypticorn/klines/test/test_http_validation_error.py +58 -0
- crypticorn/klines/test/test_market.py +33 -0
- crypticorn/klines/test/test_ohlcv_data_api.py +38 -0
- crypticorn/klines/test/test_ohlcv_response.py +86 -0
- crypticorn/klines/test/test_resolution.py +33 -0
- crypticorn/klines/test/test_response_get_history_udf_history_get.py +89 -0
- crypticorn/klines/test/test_search_symbol_response.py +62 -0
- crypticorn/klines/test/test_sort_direction.py +33 -0
- crypticorn/klines/test/test_symbol_group_response.py +53 -0
- crypticorn/klines/test/test_symbol_info_response.py +84 -0
- crypticorn/klines/test/test_symbol_type.py +54 -0
- crypticorn/klines/test/test_symbols_api.py +38 -0
- crypticorn/klines/test/test_timeframe.py +33 -0
- crypticorn/klines/test/test_udf_api.py +80 -0
- crypticorn/klines/test/test_udf_config_response.py +95 -0
- crypticorn/klines/test/test_validation_error.py +60 -0
- crypticorn/klines/test/test_validation_error_loc_inner.py +50 -0
- crypticorn/trade/__init__.py +2 -0
- crypticorn/trade/client/__init__.py +63 -0
- crypticorn/trade/client/api/__init__.py +13 -0
- crypticorn/trade/client/api/api_keys_api.py +1468 -0
- crypticorn/trade/client/api/bots_api.py +1211 -0
- crypticorn/trade/client/api/exchanges_api.py +297 -0
- crypticorn/trade/client/api/futures_trading_panel_api.py +1463 -0
- crypticorn/trade/client/api/notifications_api.py +1767 -0
- crypticorn/trade/client/api/orders_api.py +331 -0
- crypticorn/trade/client/api/status_api.py +278 -0
- crypticorn/trade/client/api/strategies_api.py +331 -0
- crypticorn/trade/client/api/trading_actions_api.py +898 -0
- crypticorn/trade/client/api_client.py +797 -0
- crypticorn/trade/client/api_response.py +21 -0
- crypticorn/trade/client/configuration.py +574 -0
- crypticorn/trade/client/exceptions.py +216 -0
- crypticorn/trade/client/models/__init__.py +38 -0
- crypticorn/{models → trade/client/models}/action_model.py +17 -20
- crypticorn/{models → trade/client/models}/api_error_identifier.py +3 -1
- crypticorn/{models → trade/client/models}/api_key_model.py +5 -8
- crypticorn/{models → trade/client/models}/bot_model.py +15 -11
- crypticorn/{models → trade/client/models}/futures_trading_action.py +12 -12
- crypticorn/{models → trade/client/models}/http_validation_error.py +1 -1
- crypticorn/{models → trade/client/models}/notification_model.py +8 -6
- crypticorn/{models → trade/client/models}/order_model.py +12 -15
- crypticorn/{models → trade/client/models}/post_futures_action.py +1 -1
- crypticorn/{models → trade/client/models}/strategy_exchange_info.py +1 -1
- crypticorn/{models → trade/client/models}/strategy_model.py +6 -2
- crypticorn/{models → trade/client/models}/validation_error.py +1 -1
- crypticorn/trade/client/py.typed +0 -0
- crypticorn/trade/client/rest.py +257 -0
- crypticorn/trade/main.py +39 -0
- crypticorn/trade/requirements.txt +4 -0
- crypticorn-1.0.2rc2.dist-info/METADATA +47 -0
- crypticorn-1.0.2rc2.dist-info/RECORD +128 -0
- {crypticorn-1.0.1.dist-info → crypticorn-1.0.2rc2.dist-info}/WHEEL +1 -1
- crypticorn/models/__init__.py +0 -31
- crypticorn/models/modified.py +0 -87
- crypticorn-1.0.1.dist-info/METADATA +0 -40
- crypticorn-1.0.1.dist-info/RECORD +0 -38
- /crypticorn/{models → trade/client/models}/exchange.py +0 -0
- /crypticorn/{models → trade/client/models}/execution_ids.py +0 -0
- /crypticorn/{models → trade/client/models}/futures_balance.py +0 -0
- /crypticorn/{models → trade/client/models}/margin_mode.py +0 -0
- /crypticorn/{models → trade/client/models}/market_type.py +0 -0
- /crypticorn/{models → trade/client/models}/notification_type.py +0 -0
- /crypticorn/{models → trade/client/models}/order_status.py +0 -0
- /crypticorn/{models → trade/client/models}/tpsl.py +0 -0
- /crypticorn/{models → trade/client/models}/trading_action_type.py +0 -0
- /crypticorn/{models → trade/client/models}/update_notification.py +0 -0
- /crypticorn/{models → trade/client/models}/validation_error_loc_inner.py +0 -0
- {crypticorn-1.0.1.dist-info → crypticorn-1.0.2rc2.dist-info}/LICENSE.md +0 -0
- {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", "
|
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)
|
crypticorn/trade/main.py
ADDED
@@ -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,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,,
|