crypticorn 2.13.0__py3-none-any.whl → 2.13.2__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/auth/client/models/create_user_request.py +4 -16
- crypticorn/auth/main.py +8 -0
- crypticorn/client.py +24 -21
- crypticorn/common/auth.py +44 -12
- crypticorn/common/errors.py +78 -75
- crypticorn/hive/client/configuration.py +2 -2
- crypticorn/hive/client/models/api_error_identifier.py +2 -2
- crypticorn/hive/main.py +9 -5
- crypticorn/klines/client/models/api_error_identifier.py +1 -1
- crypticorn/klines/main.py +7 -0
- crypticorn/metrics/client/models/api_error_identifier.py +1 -1
- crypticorn/metrics/main.py +8 -3
- crypticorn/pay/client/api/products_api.py +228 -1
- crypticorn/pay/client/configuration.py +2 -2
- crypticorn/pay/client/models/api_error_identifier.py +7 -3
- crypticorn/pay/main.py +7 -0
- crypticorn/trade/client/__init__.py +1 -0
- crypticorn/trade/client/api/strategies_api.py +296 -26
- crypticorn/trade/client/api/trading_actions_api.py +4 -4
- crypticorn/trade/client/models/__init__.py +1 -0
- crypticorn/trade/client/models/api_error_identifier.py +6 -2
- crypticorn/trade/client/models/futures_trading_action.py +23 -37
- crypticorn/trade/client/models/futures_trading_action_create.py +28 -42
- crypticorn/trade/client/models/order.py +40 -34
- crypticorn/trade/client/models/spot_trading_action_create.py +10 -25
- crypticorn/trade/client/models/strategy_exchange_info.py +3 -3
- crypticorn/trade/client/models/tpsl.py +7 -16
- crypticorn/trade/client/models/tpsl_create.py +103 -0
- crypticorn/trade/main.py +8 -2
- {crypticorn-2.13.0.dist-info → crypticorn-2.13.2.dist-info}/METADATA +30 -3
- {crypticorn-2.13.0.dist-info → crypticorn-2.13.2.dist-info}/RECORD +35 -34
- {crypticorn-2.13.0.dist-info → crypticorn-2.13.2.dist-info}/WHEEL +0 -0
- {crypticorn-2.13.0.dist-info → crypticorn-2.13.2.dist-info}/entry_points.txt +0 -0
- {crypticorn-2.13.0.dist-info → crypticorn-2.13.2.dist-info}/licenses/LICENSE +0 -0
- {crypticorn-2.13.0.dist-info → crypticorn-2.13.2.dist-info}/top_level.txt +0 -0
crypticorn/common/errors.py
CHANGED
@@ -23,20 +23,31 @@ class ApiErrorType(StrEnum):
|
|
23
23
|
"""error that does not need to be handled or does not affect the program or is a placeholder."""
|
24
24
|
|
25
25
|
|
26
|
+
class ApiErrorLevel(StrEnum):
|
27
|
+
"""Level of the API error."""
|
28
|
+
|
29
|
+
ERROR = "error"
|
30
|
+
INFO = "info"
|
31
|
+
SUCCESS = "success"
|
32
|
+
WARNING = "warning"
|
33
|
+
|
34
|
+
|
26
35
|
class ApiErrorIdentifier(StrEnum):
|
27
36
|
"""Unique identifier of the API error."""
|
28
37
|
|
29
38
|
ALLOCATION_BELOW_EXPOSURE = "allocation_below_current_exposure"
|
30
39
|
ALLOCATION_BELOW_MINIMUM = "allocation_below_min_amount"
|
40
|
+
ALLOCATION_LIMIT_EXCEEDED = "allocation_limit_exceeded"
|
31
41
|
BLACK_SWAN = "black_swan"
|
32
42
|
BOT_ALREADY_DELETED = "bot_already_deleted"
|
33
|
-
BOT_DISABLED = "bot_disabled"
|
34
43
|
BOT_STOPPING_COMPLETED = "bot_stopping_completed"
|
35
44
|
BOT_STOPPING_STARTED = "bot_stopping_started"
|
36
45
|
CANCELLED_OPEN_ORDER = "cancelled_open_order"
|
37
46
|
CLIENT_ORDER_ID_REPEATED = "client_order_id_already_exists"
|
38
47
|
CONTENT_TYPE_ERROR = "invalid_content_type"
|
39
48
|
DELETE_BOT_ERROR = "delete_bot_error"
|
49
|
+
EXCHANGE_HTTP_ERROR = "exchange_http_request_error"
|
50
|
+
EXCHANGE_INVALID_PARAMETER = "exchange_invalid_parameter"
|
40
51
|
EXCHANGE_INVALID_SIGNATURE = "exchange_invalid_signature"
|
41
52
|
EXCHANGE_INVALID_TIMESTAMP = "exchange_invalid_timestamp"
|
42
53
|
EXCHANGE_IP_RESTRICTED = "exchange_ip_address_is_not_authorized"
|
@@ -55,7 +66,6 @@ class ApiErrorIdentifier(StrEnum):
|
|
55
66
|
FAILED_OPEN_ORDER = "open_order_expired"
|
56
67
|
FORBIDDEN = "forbidden"
|
57
68
|
HEDGE_MODE_NOT_ACTIVE = "hedge_mode_not_active"
|
58
|
-
HTTP_ERROR = "http_request_error"
|
59
69
|
INSUFFICIENT_BALANCE = "insufficient_balance"
|
60
70
|
INSUFFICIENT_MARGIN = "insufficient_margin"
|
61
71
|
INSUFFICIENT_SCOPES = "insufficient_scopes"
|
@@ -64,13 +74,13 @@ class ApiErrorIdentifier(StrEnum):
|
|
64
74
|
INVALID_DATA_REQUEST = "invalid_data"
|
65
75
|
INVALID_DATA_RESPONSE = "invalid_data_response"
|
66
76
|
INVALID_EXCHANGE_KEY = "invalid_exchange_key"
|
67
|
-
INVALID_MARGIN_MODE = "invalid_margin_mode"
|
68
77
|
INVALID_MODEL_NAME = "invalid_model_name"
|
69
|
-
INVALID_PARAMETER = "invalid_parameter_provided"
|
70
78
|
LEVERAGE_EXCEEDED = "leverage_limit_exceeded"
|
71
79
|
LIQUIDATION_PRICE_VIOLATION = "order_violates_liquidation_price_constraints"
|
72
80
|
MARGIN_MODE_CLASH = "margin_mode_clash"
|
73
81
|
NAME_NOT_UNIQUE = "name_not_unique"
|
82
|
+
NO_API_KEY = "no_api_key"
|
83
|
+
NO_BEARER = "no_bearer"
|
74
84
|
NO_CREDENTIALS = "no_credentials"
|
75
85
|
NOW_API_DOWN = "now_api_down"
|
76
86
|
OBJECT_ALREADY_EXISTS = "object_already_exists"
|
@@ -96,14 +106,13 @@ class ApiErrorIdentifier(StrEnum):
|
|
96
106
|
RISK_LIMIT_EXCEEDED = "risk_limit_exceeded"
|
97
107
|
RPC_TIMEOUT = "rpc_timeout"
|
98
108
|
SETTLEMENT_IN_PROGRESS = "system_settlement_in_process"
|
99
|
-
STRATEGY_ALREADY_EXISTS = "strategy_already_exists"
|
100
109
|
STRATEGY_DISABLED = "strategy_disabled"
|
101
110
|
STRATEGY_LEVERAGE_MISMATCH = "strategy_leverage_mismatch"
|
102
111
|
STRATEGY_NOT_SUPPORTING_EXCHANGE = "strategy_not_supporting_exchange"
|
103
112
|
SUCCESS = "success"
|
104
113
|
SYMBOL_NOT_FOUND = "symbol_does_not_exist"
|
105
114
|
TRADING_ACTION_EXPIRED = "trading_action_expired"
|
106
|
-
TRADING_ACTION_SKIPPED_BOT_STOPPING = "
|
115
|
+
TRADING_ACTION_SKIPPED_BOT_STOPPING = "trading_action_skipped_bot_stopping"
|
107
116
|
TRADING_LOCKED = "trading_has_been_locked"
|
108
117
|
TRADING_SUSPENDED = "trading_is_suspended"
|
109
118
|
UNKNOWN_ERROR = "unknown_error_occurred"
|
@@ -114,15 +123,6 @@ class ApiErrorIdentifier(StrEnum):
|
|
114
123
|
return getattr(ApiError, self.name)
|
115
124
|
|
116
125
|
|
117
|
-
class ApiErrorLevel(StrEnum):
|
118
|
-
"""Level of the API error."""
|
119
|
-
|
120
|
-
ERROR = "error"
|
121
|
-
INFO = "info"
|
122
|
-
SUCCESS = "success"
|
123
|
-
WARNING = "warning"
|
124
|
-
|
125
|
-
|
126
126
|
class ApiError(Enum, metaclass=ApiErrorFallback):
|
127
127
|
# Fallback to UNKNOWN_ERROR for error codes not yet published to PyPI.
|
128
128
|
"""Crypticorn API error enumeration."""
|
@@ -137,9 +137,14 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
137
137
|
ApiErrorType.USER_ERROR,
|
138
138
|
ApiErrorLevel.ERROR,
|
139
139
|
)
|
140
|
+
ALLOCATION_LIMIT_EXCEEDED = (
|
141
|
+
ApiErrorIdentifier.ALLOCATION_LIMIT_EXCEEDED,
|
142
|
+
ApiErrorType.NO_ERROR,
|
143
|
+
ApiErrorLevel.INFO,
|
144
|
+
)
|
140
145
|
BLACK_SWAN = (
|
141
146
|
ApiErrorIdentifier.BLACK_SWAN,
|
142
|
-
ApiErrorType.
|
147
|
+
ApiErrorType.EXCHANGE_ERROR,
|
143
148
|
ApiErrorLevel.INFO,
|
144
149
|
)
|
145
150
|
BOT_ALREADY_DELETED = (
|
@@ -147,20 +152,15 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
147
152
|
ApiErrorType.USER_ERROR,
|
148
153
|
ApiErrorLevel.INFO,
|
149
154
|
)
|
150
|
-
BOT_DISABLED = (
|
151
|
-
ApiErrorIdentifier.BOT_DISABLED,
|
152
|
-
ApiErrorType.USER_ERROR,
|
153
|
-
ApiErrorLevel.WARNING,
|
154
|
-
)
|
155
155
|
BOT_STOPPING_COMPLETED = (
|
156
156
|
ApiErrorIdentifier.BOT_STOPPING_COMPLETED,
|
157
157
|
ApiErrorType.NO_ERROR,
|
158
|
-
ApiErrorLevel.
|
158
|
+
ApiErrorLevel.SUCCESS,
|
159
159
|
)
|
160
160
|
BOT_STOPPING_STARTED = (
|
161
161
|
ApiErrorIdentifier.BOT_STOPPING_STARTED,
|
162
162
|
ApiErrorType.NO_ERROR,
|
163
|
-
ApiErrorLevel.
|
163
|
+
ApiErrorLevel.SUCCESS,
|
164
164
|
)
|
165
165
|
CANCELLED_OPEN_ORDER = (
|
166
166
|
ApiErrorIdentifier.CANCELLED_OPEN_ORDER,
|
@@ -182,6 +182,16 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
182
182
|
ApiErrorType.SERVER_ERROR,
|
183
183
|
ApiErrorLevel.ERROR,
|
184
184
|
)
|
185
|
+
EXCHANGE_HTTP_ERROR = (
|
186
|
+
ApiErrorIdentifier.EXCHANGE_HTTP_ERROR,
|
187
|
+
ApiErrorType.EXCHANGE_ERROR,
|
188
|
+
ApiErrorLevel.ERROR,
|
189
|
+
)
|
190
|
+
EXCHANGE_INVALID_PARAMETER = (
|
191
|
+
ApiErrorIdentifier.EXCHANGE_INVALID_PARAMETER,
|
192
|
+
ApiErrorType.SERVER_ERROR,
|
193
|
+
ApiErrorLevel.ERROR,
|
194
|
+
)
|
185
195
|
EXCHANGE_INVALID_SIGNATURE = (
|
186
196
|
ApiErrorIdentifier.EXCHANGE_INVALID_SIGNATURE,
|
187
197
|
ApiErrorType.SERVER_ERROR,
|
@@ -194,7 +204,7 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
194
204
|
)
|
195
205
|
EXCHANGE_IP_RESTRICTED = (
|
196
206
|
ApiErrorIdentifier.EXCHANGE_IP_RESTRICTED,
|
197
|
-
ApiErrorType.
|
207
|
+
ApiErrorType.USER_ERROR,
|
198
208
|
ApiErrorLevel.ERROR,
|
199
209
|
)
|
200
210
|
EXCHANGE_KEY_ALREADY_EXISTS = (
|
@@ -204,7 +214,7 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
204
214
|
)
|
205
215
|
EXCHANGE_KEY_IN_USE = (
|
206
216
|
ApiErrorIdentifier.EXCHANGE_KEY_IN_USE,
|
207
|
-
ApiErrorType.
|
217
|
+
ApiErrorType.USER_ERROR,
|
208
218
|
ApiErrorLevel.ERROR,
|
209
219
|
)
|
210
220
|
EXCHANGE_MAINTENANCE = (
|
@@ -214,7 +224,7 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
214
224
|
)
|
215
225
|
EXCHANGE_RATE_LIMIT = (
|
216
226
|
ApiErrorIdentifier.EXCHANGE_RATE_LIMIT,
|
217
|
-
ApiErrorType.
|
227
|
+
ApiErrorType.SERVER_ERROR,
|
218
228
|
ApiErrorLevel.ERROR,
|
219
229
|
)
|
220
230
|
EXCHANGE_PERMISSION_DENIED = (
|
@@ -272,11 +282,6 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
272
282
|
ApiErrorType.USER_ERROR,
|
273
283
|
ApiErrorLevel.ERROR,
|
274
284
|
)
|
275
|
-
HTTP_ERROR = (
|
276
|
-
ApiErrorIdentifier.HTTP_ERROR,
|
277
|
-
ApiErrorType.EXCHANGE_ERROR,
|
278
|
-
ApiErrorLevel.ERROR,
|
279
|
-
)
|
280
285
|
INSUFFICIENT_BALANCE = (
|
281
286
|
ApiErrorIdentifier.INSUFFICIENT_BALANCE,
|
282
287
|
ApiErrorType.USER_ERROR,
|
@@ -309,7 +314,7 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
309
314
|
)
|
310
315
|
INVALID_DATA_RESPONSE = (
|
311
316
|
ApiErrorIdentifier.INVALID_DATA_RESPONSE,
|
312
|
-
ApiErrorType.
|
317
|
+
ApiErrorType.SERVER_ERROR,
|
313
318
|
ApiErrorLevel.ERROR,
|
314
319
|
)
|
315
320
|
INVALID_EXCHANGE_KEY = (
|
@@ -317,21 +322,11 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
317
322
|
ApiErrorType.USER_ERROR,
|
318
323
|
ApiErrorLevel.ERROR,
|
319
324
|
)
|
320
|
-
INVALID_MARGIN_MODE = (
|
321
|
-
ApiErrorIdentifier.INVALID_MARGIN_MODE,
|
322
|
-
ApiErrorType.SERVER_ERROR,
|
323
|
-
ApiErrorLevel.ERROR,
|
324
|
-
)
|
325
325
|
INVALID_MODEL_NAME = (
|
326
326
|
ApiErrorIdentifier.INVALID_MODEL_NAME,
|
327
327
|
ApiErrorType.USER_ERROR,
|
328
328
|
ApiErrorLevel.ERROR,
|
329
329
|
)
|
330
|
-
INVALID_PARAMETER = (
|
331
|
-
ApiErrorIdentifier.INVALID_PARAMETER,
|
332
|
-
ApiErrorType.SERVER_ERROR,
|
333
|
-
ApiErrorLevel.ERROR,
|
334
|
-
)
|
335
330
|
LEVERAGE_EXCEEDED = (
|
336
331
|
ApiErrorIdentifier.LEVERAGE_EXCEEDED,
|
337
332
|
ApiErrorType.SERVER_ERROR,
|
@@ -352,6 +347,16 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
352
347
|
ApiErrorType.USER_ERROR,
|
353
348
|
ApiErrorLevel.ERROR,
|
354
349
|
)
|
350
|
+
NO_API_KEY = (
|
351
|
+
ApiErrorIdentifier.NO_API_KEY,
|
352
|
+
ApiErrorType.USER_ERROR,
|
353
|
+
ApiErrorLevel.ERROR,
|
354
|
+
)
|
355
|
+
NO_BEARER = (
|
356
|
+
ApiErrorIdentifier.NO_BEARER,
|
357
|
+
ApiErrorType.USER_ERROR,
|
358
|
+
ApiErrorLevel.ERROR,
|
359
|
+
)
|
355
360
|
NO_CREDENTIALS = (
|
356
361
|
ApiErrorIdentifier.NO_CREDENTIALS,
|
357
362
|
ApiErrorType.USER_ERROR,
|
@@ -364,18 +369,18 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
364
369
|
)
|
365
370
|
OBJECT_ALREADY_EXISTS = (
|
366
371
|
ApiErrorIdentifier.OBJECT_ALREADY_EXISTS,
|
367
|
-
ApiErrorType.
|
372
|
+
ApiErrorType.USER_ERROR,
|
368
373
|
ApiErrorLevel.ERROR,
|
369
374
|
)
|
370
375
|
OBJECT_CREATED = (
|
371
376
|
ApiErrorIdentifier.OBJECT_CREATED,
|
372
|
-
ApiErrorType.
|
373
|
-
ApiErrorLevel.
|
377
|
+
ApiErrorType.NO_ERROR,
|
378
|
+
ApiErrorLevel.SUCCESS,
|
374
379
|
)
|
375
380
|
OBJECT_DELETED = (
|
376
381
|
ApiErrorIdentifier.OBJECT_DELETED,
|
377
|
-
ApiErrorType.
|
378
|
-
ApiErrorLevel.
|
382
|
+
ApiErrorType.NO_ERROR,
|
383
|
+
ApiErrorLevel.SUCCESS,
|
379
384
|
)
|
380
385
|
OBJECT_LOCKED = (
|
381
386
|
ApiErrorIdentifier.OBJECT_LOCKED,
|
@@ -384,13 +389,13 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
384
389
|
)
|
385
390
|
OBJECT_NOT_FOUND = (
|
386
391
|
ApiErrorIdentifier.OBJECT_NOT_FOUND,
|
387
|
-
ApiErrorType.
|
392
|
+
ApiErrorType.USER_ERROR,
|
388
393
|
ApiErrorLevel.ERROR,
|
389
394
|
)
|
390
395
|
OBJECT_UPDATED = (
|
391
396
|
ApiErrorIdentifier.OBJECT_UPDATED,
|
392
|
-
ApiErrorType.
|
393
|
-
ApiErrorLevel.
|
397
|
+
ApiErrorType.NO_ERROR,
|
398
|
+
ApiErrorLevel.SUCCESS,
|
394
399
|
)
|
395
400
|
ORDER_ALREADY_FILLED = (
|
396
401
|
ApiErrorIdentifier.ORDER_ALREADY_FILLED,
|
@@ -429,13 +434,13 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
429
434
|
)
|
430
435
|
ORPHAN_OPEN_ORDER = (
|
431
436
|
ApiErrorIdentifier.ORPHAN_OPEN_ORDER,
|
432
|
-
ApiErrorType.
|
433
|
-
ApiErrorLevel.
|
437
|
+
ApiErrorType.NO_ERROR,
|
438
|
+
ApiErrorLevel.WARNING,
|
434
439
|
)
|
435
440
|
ORPHAN_CLOSE_ORDER = (
|
436
441
|
ApiErrorIdentifier.ORPHAN_CLOSE_ORDER,
|
437
442
|
ApiErrorType.NO_ERROR,
|
438
|
-
ApiErrorLevel.
|
443
|
+
ApiErrorLevel.WARNING,
|
439
444
|
)
|
440
445
|
POSITION_LIMIT_EXCEEDED = (
|
441
446
|
ApiErrorIdentifier.POSITION_LIMIT_EXCEEDED,
|
@@ -445,7 +450,7 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
445
450
|
POSITION_NOT_FOUND = (
|
446
451
|
ApiErrorIdentifier.POSITION_NOT_FOUND,
|
447
452
|
ApiErrorType.NO_ERROR,
|
448
|
-
ApiErrorLevel.
|
453
|
+
ApiErrorLevel.WARNING,
|
449
454
|
)
|
450
455
|
POSITION_SUSPENDED = (
|
451
456
|
ApiErrorIdentifier.POSITION_SUSPENDED,
|
@@ -477,15 +482,10 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
477
482
|
ApiErrorType.EXCHANGE_ERROR,
|
478
483
|
ApiErrorLevel.ERROR,
|
479
484
|
)
|
480
|
-
STRATEGY_ALREADY_EXISTS = (
|
481
|
-
ApiErrorIdentifier.STRATEGY_ALREADY_EXISTS,
|
482
|
-
ApiErrorType.USER_ERROR,
|
483
|
-
ApiErrorLevel.ERROR,
|
484
|
-
)
|
485
485
|
STRATEGY_DISABLED = (
|
486
486
|
ApiErrorIdentifier.STRATEGY_DISABLED,
|
487
|
-
ApiErrorType.
|
488
|
-
ApiErrorLevel.
|
487
|
+
ApiErrorType.NO_ERROR,
|
488
|
+
ApiErrorLevel.WARNING,
|
489
489
|
)
|
490
490
|
STRATEGY_LEVERAGE_MISMATCH = (
|
491
491
|
ApiErrorIdentifier.STRATEGY_LEVERAGE_MISMATCH,
|
@@ -494,8 +494,8 @@ class ApiError(Enum, metaclass=ApiErrorFallback):
|
|
494
494
|
)
|
495
495
|
STRATEGY_NOT_SUPPORTING_EXCHANGE = (
|
496
496
|
ApiErrorIdentifier.STRATEGY_NOT_SUPPORTING_EXCHANGE,
|
497
|
-
ApiErrorType.
|
498
|
-
ApiErrorLevel.
|
497
|
+
ApiErrorType.NO_ERROR,
|
498
|
+
ApiErrorLevel.WARNING,
|
499
499
|
)
|
500
500
|
SUCCESS = (ApiErrorIdentifier.SUCCESS, ApiErrorType.NO_ERROR, ApiErrorLevel.SUCCESS)
|
501
501
|
SYMBOL_NOT_FOUND = (
|
@@ -585,6 +585,14 @@ class StatusCodeMapper:
|
|
585
585
|
status.HTTP_401_UNAUTHORIZED,
|
586
586
|
status.WS_1008_POLICY_VIOLATION,
|
587
587
|
),
|
588
|
+
ApiError.NO_API_KEY: (
|
589
|
+
status.HTTP_401_UNAUTHORIZED,
|
590
|
+
status.WS_1008_POLICY_VIOLATION,
|
591
|
+
),
|
592
|
+
ApiError.NO_BEARER: (
|
593
|
+
status.HTTP_401_UNAUTHORIZED,
|
594
|
+
status.WS_1008_POLICY_VIOLATION,
|
595
|
+
),
|
588
596
|
ApiError.INSUFFICIENT_SCOPES: (
|
589
597
|
status.HTTP_403_FORBIDDEN,
|
590
598
|
status.WS_1008_POLICY_VIOLATION,
|
@@ -643,10 +651,6 @@ class StatusCodeMapper:
|
|
643
651
|
status.HTTP_409_CONFLICT,
|
644
652
|
status.WS_1008_POLICY_VIOLATION,
|
645
653
|
),
|
646
|
-
ApiError.STRATEGY_ALREADY_EXISTS: (
|
647
|
-
status.HTTP_409_CONFLICT,
|
648
|
-
status.WS_1008_POLICY_VIOLATION,
|
649
|
-
),
|
650
654
|
ApiError.NAME_NOT_UNIQUE: (
|
651
655
|
status.HTTP_409_CONFLICT,
|
652
656
|
status.WS_1008_POLICY_VIOLATION,
|
@@ -728,15 +732,15 @@ class StatusCodeMapper:
|
|
728
732
|
status.HTTP_400_BAD_REQUEST,
|
729
733
|
status.WS_1008_POLICY_VIOLATION,
|
730
734
|
),
|
731
|
-
ApiError.
|
735
|
+
ApiError.ALLOCATION_LIMIT_EXCEEDED: (
|
732
736
|
status.HTTP_400_BAD_REQUEST,
|
733
737
|
status.WS_1008_POLICY_VIOLATION,
|
734
738
|
),
|
735
|
-
ApiError.
|
739
|
+
ApiError.ALLOCATION_BELOW_MINIMUM: (
|
736
740
|
status.HTTP_400_BAD_REQUEST,
|
737
741
|
status.WS_1008_POLICY_VIOLATION,
|
738
742
|
),
|
739
|
-
ApiError.
|
743
|
+
ApiError.BLACK_SWAN: (
|
740
744
|
status.HTTP_400_BAD_REQUEST,
|
741
745
|
status.WS_1008_POLICY_VIOLATION,
|
742
746
|
),
|
@@ -768,7 +772,7 @@ class StatusCodeMapper:
|
|
768
772
|
status.HTTP_400_BAD_REQUEST,
|
769
773
|
status.WS_1008_POLICY_VIOLATION,
|
770
774
|
),
|
771
|
-
ApiError.
|
775
|
+
ApiError.EXCHANGE_HTTP_ERROR: (
|
772
776
|
status.HTTP_400_BAD_REQUEST,
|
773
777
|
status.WS_1008_POLICY_VIOLATION,
|
774
778
|
),
|
@@ -776,16 +780,15 @@ class StatusCodeMapper:
|
|
776
780
|
status.HTTP_400_BAD_REQUEST,
|
777
781
|
status.WS_1008_POLICY_VIOLATION,
|
778
782
|
),
|
779
|
-
ApiError.INSUFFICIENT_MARGIN:
|
780
|
-
ApiError.INVALID_EXCHANGE_KEY: (
|
783
|
+
ApiError.INSUFFICIENT_MARGIN: (
|
781
784
|
status.HTTP_400_BAD_REQUEST,
|
782
785
|
status.WS_1008_POLICY_VIOLATION,
|
783
786
|
),
|
784
|
-
ApiError.
|
787
|
+
ApiError.INVALID_EXCHANGE_KEY: (
|
785
788
|
status.HTTP_400_BAD_REQUEST,
|
786
789
|
status.WS_1008_POLICY_VIOLATION,
|
787
790
|
),
|
788
|
-
ApiError.
|
791
|
+
ApiError.EXCHANGE_INVALID_PARAMETER: (
|
789
792
|
status.HTTP_400_BAD_REQUEST,
|
790
793
|
status.WS_1008_POLICY_VIOLATION,
|
791
794
|
),
|
@@ -215,7 +215,7 @@ class Configuration:
|
|
215
215
|
debug: Optional[bool] = None,
|
216
216
|
) -> None:
|
217
217
|
"""Constructor"""
|
218
|
-
self._base_path = "
|
218
|
+
self._base_path = "https://api.crypticorn.dev/v1/hive" if host is None else host
|
219
219
|
"""Default Base url
|
220
220
|
"""
|
221
221
|
self.server_index = 0 if server_index is None and host is None else server_index
|
@@ -557,7 +557,7 @@ class Configuration:
|
|
557
557
|
"""
|
558
558
|
return [
|
559
559
|
{
|
560
|
-
"url": "
|
560
|
+
"url": "https://api.crypticorn.dev/v1/hive",
|
561
561
|
"description": "No description provided",
|
562
562
|
}
|
563
563
|
]
|
@@ -68,13 +68,13 @@ class ApiErrorIdentifier(str, Enum):
|
|
68
68
|
INVALID_EXCHANGE_KEY = "invalid_exchange_key"
|
69
69
|
INVALID_MARGIN_MODE = "invalid_margin_mode"
|
70
70
|
INVALID_MODEL_NAME = "invalid_model_name"
|
71
|
-
INVALID_PARAMETER_PROVIDED = "
|
71
|
+
INVALID_PARAMETER_PROVIDED = "exchange_invalid_parameter"
|
72
72
|
LEVERAGE_LIMIT_EXCEEDED = "leverage_limit_exceeded"
|
73
73
|
ORDER_VIOLATES_LIQUIDATION_PRICE_CONSTRAINTS = (
|
74
74
|
"order_violates_liquidation_price_constraints"
|
75
75
|
)
|
76
76
|
MARGIN_MODE_CLASH = "margin_mode_clash"
|
77
|
-
|
77
|
+
NAME_NOT_UNIQUE = "name_not_unique"
|
78
78
|
NO_CREDENTIALS = "no_credentials"
|
79
79
|
NOW_API_DOWN = "now_api_down"
|
80
80
|
OBJECT_ALREADY_EXISTS = "object_already_exists"
|
crypticorn/hive/main.py
CHANGED
@@ -1,21 +1,24 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
import os
|
1
3
|
import asyncio
|
2
4
|
from pathlib import Path
|
3
|
-
import
|
5
|
+
from typing import TYPE_CHECKING, Optional
|
4
6
|
from crypticorn.hive import (
|
5
7
|
ApiClient,
|
6
8
|
Configuration,
|
7
9
|
ModelsApi,
|
8
10
|
DataApi,
|
9
11
|
StatusApi,
|
10
|
-
Configuration,
|
11
12
|
AdminApi,
|
12
13
|
DataVersion,
|
13
14
|
FeatureSize,
|
14
15
|
)
|
15
16
|
from crypticorn.hive.utils import download_file
|
16
|
-
from typing import Optional
|
17
17
|
from pydantic import StrictInt
|
18
18
|
|
19
|
+
if TYPE_CHECKING:
|
20
|
+
from aiohttp import ClientSession
|
21
|
+
|
19
22
|
|
20
23
|
class DataApiWrapper(DataApi):
|
21
24
|
"""
|
@@ -82,11 +85,12 @@ class HiveClient:
|
|
82
85
|
config_class = Configuration
|
83
86
|
|
84
87
|
def __init__(
|
85
|
-
self,
|
86
|
-
config: Configuration,
|
88
|
+
self, config: Configuration, http_client: Optional[ClientSession] = None
|
87
89
|
):
|
88
90
|
self.config = config
|
89
91
|
self.base_client = ApiClient(configuration=self.config)
|
92
|
+
if http_client is not None:
|
93
|
+
self.base_client.rest_client.pool_manager = http_client
|
90
94
|
# Instantiate all the endpoint clients
|
91
95
|
self.models = ModelsApi(self.base_client)
|
92
96
|
self.data = DataApiWrapper(self.base_client)
|
@@ -68,7 +68,7 @@ class ApiErrorIdentifier(str, Enum):
|
|
68
68
|
INVALID_EXCHANGE_KEY = "invalid_exchange_key"
|
69
69
|
INVALID_MARGIN_MODE = "invalid_margin_mode"
|
70
70
|
INVALID_MODEL_NAME = "invalid_model_name"
|
71
|
-
INVALID_PARAMETER_PROVIDED = "
|
71
|
+
INVALID_PARAMETER_PROVIDED = "exchange_invalid_parameter"
|
72
72
|
LEVERAGE_LIMIT_EXCEEDED = "leverage_limit_exceeded"
|
73
73
|
ORDER_VIOLATES_LIQUIDATION_PRICE_CONSTRAINTS = (
|
74
74
|
"order_violates_liquidation_price_constraints"
|
crypticorn/klines/main.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
from __future__ import annotations
|
2
|
+
from typing import TYPE_CHECKING, Optional
|
2
3
|
from crypticorn.klines import (
|
3
4
|
ApiClient,
|
4
5
|
Configuration,
|
@@ -10,6 +11,9 @@ from crypticorn.klines import (
|
|
10
11
|
)
|
11
12
|
from crypticorn.common import optional_import
|
12
13
|
|
14
|
+
if TYPE_CHECKING:
|
15
|
+
from aiohttp import ClientSession
|
16
|
+
|
13
17
|
|
14
18
|
class KlinesClient:
|
15
19
|
"""
|
@@ -21,9 +25,12 @@ class KlinesClient:
|
|
21
25
|
def __init__(
|
22
26
|
self,
|
23
27
|
config: Configuration,
|
28
|
+
http_client: Optional[ClientSession] = None,
|
24
29
|
):
|
25
30
|
self.config = config
|
26
31
|
self.base_client = ApiClient(configuration=self.config)
|
32
|
+
if http_client is not None:
|
33
|
+
self.base_client.rest_client.pool_manager = http_client
|
27
34
|
# Instantiate all the endpoint clients
|
28
35
|
self.funding = FundingRatesApiWrapper(self.base_client)
|
29
36
|
self.ohlcv = OHLCVDataApiWrapper(self.base_client)
|
@@ -70,7 +70,7 @@ class ApiErrorIdentifier(str, Enum):
|
|
70
70
|
INVALID_EXCHANGE_KEY = "invalid_exchange_key"
|
71
71
|
INVALID_MARGIN_MODE = "invalid_margin_mode"
|
72
72
|
INVALID_MODEL_NAME = "invalid_model_name"
|
73
|
-
INVALID_PARAMETER_PROVIDED = "
|
73
|
+
INVALID_PARAMETER_PROVIDED = "exchange_invalid_parameter"
|
74
74
|
LEVERAGE_LIMIT_EXCEEDED = "leverage_limit_exceeded"
|
75
75
|
ORDER_VIOLATES_LIQUIDATION_PRICE_CONSTRAINTS = (
|
76
76
|
"order_violates_liquidation_price_constraints"
|
crypticorn/metrics/main.py
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
from __future__ import annotations
|
2
|
+
from typing import TYPE_CHECKING, Optional
|
3
|
+
from crypticorn.common import optional_import
|
2
4
|
from crypticorn.metrics import (
|
3
5
|
ApiClient,
|
4
6
|
Configuration,
|
@@ -12,7 +14,9 @@ from crypticorn.metrics import (
|
|
12
14
|
AdminApi,
|
13
15
|
QuoteCurrenciesApi,
|
14
16
|
)
|
15
|
-
|
17
|
+
|
18
|
+
if TYPE_CHECKING:
|
19
|
+
from aiohttp import ClientSession
|
16
20
|
|
17
21
|
|
18
22
|
class MetricsClient:
|
@@ -23,11 +27,12 @@ class MetricsClient:
|
|
23
27
|
config_class = Configuration
|
24
28
|
|
25
29
|
def __init__(
|
26
|
-
self,
|
27
|
-
config: Configuration,
|
30
|
+
self, config: Configuration, http_client: Optional[ClientSession] = None
|
28
31
|
):
|
29
32
|
self.config = config
|
30
33
|
self.base_client = ApiClient(configuration=self.config)
|
34
|
+
if http_client is not None:
|
35
|
+
self.base_client.rest_client.pool_manager = http_client
|
31
36
|
# Instantiate all the endpoint clients
|
32
37
|
self.status = StatusApi(self.base_client)
|
33
38
|
self.indicators = IndicatorsApi(self.base_client)
|