crypticorn 2.16.0__py3-none-any.whl → 2.17.0__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 (164) hide show
  1. crypticorn/__init__.py +2 -2
  2. crypticorn/auth/client/api/admin_api.py +397 -13
  3. crypticorn/auth/client/api/auth_api.py +3610 -341
  4. crypticorn/auth/client/api/service_api.py +249 -7
  5. crypticorn/auth/client/api/user_api.py +2295 -179
  6. crypticorn/auth/client/api/wallet_api.py +1468 -81
  7. crypticorn/auth/client/configuration.py +2 -2
  8. crypticorn/auth/client/models/create_api_key_request.py +2 -1
  9. crypticorn/auth/client/models/get_api_keys200_response_inner.py +2 -1
  10. crypticorn/auth/client/rest.py +23 -4
  11. crypticorn/auth/main.py +8 -5
  12. crypticorn/cli/init.py +1 -1
  13. crypticorn/cli/templates/.env.docker.temp +3 -0
  14. crypticorn/cli/templates/.env.example.temp +4 -0
  15. crypticorn/cli/templates/Dockerfile +5 -2
  16. crypticorn/client.py +226 -59
  17. crypticorn/common/__init__.py +1 -0
  18. crypticorn/common/auth.py +45 -14
  19. crypticorn/common/decorators.py +1 -2
  20. crypticorn/common/enums.py +0 -2
  21. crypticorn/common/errors.py +10 -0
  22. crypticorn/common/metrics.py +30 -0
  23. crypticorn/common/middleware.py +94 -1
  24. crypticorn/common/pagination.py +252 -20
  25. crypticorn/common/router/admin_router.py +2 -2
  26. crypticorn/common/router/status_router.py +40 -2
  27. crypticorn/common/scopes.py +2 -2
  28. crypticorn/common/warnings.py +7 -0
  29. crypticorn/dex/__init__.py +6 -0
  30. crypticorn/dex/client/__init__.py +49 -0
  31. crypticorn/dex/client/api/__init__.py +6 -0
  32. crypticorn/dex/client/api/admin_api.py +2986 -0
  33. crypticorn/dex/client/api/signals_api.py +1798 -0
  34. crypticorn/dex/client/api/status_api.py +892 -0
  35. crypticorn/dex/client/api_client.py +758 -0
  36. crypticorn/dex/client/api_response.py +20 -0
  37. crypticorn/dex/client/configuration.py +620 -0
  38. crypticorn/dex/client/exceptions.py +220 -0
  39. crypticorn/dex/client/models/__init__.py +30 -0
  40. crypticorn/dex/client/models/api_error_identifier.py +121 -0
  41. crypticorn/dex/client/models/api_error_level.py +37 -0
  42. crypticorn/dex/client/models/api_error_type.py +37 -0
  43. crypticorn/dex/client/models/exception_detail.py +117 -0
  44. crypticorn/dex/client/models/log_level.py +38 -0
  45. crypticorn/dex/client/models/paginated_response_signal_with_token.py +134 -0
  46. crypticorn/dex/client/models/risk.py +86 -0
  47. crypticorn/dex/client/models/signal_overview_stats.py +158 -0
  48. crypticorn/dex/client/models/signal_volume.py +84 -0
  49. crypticorn/dex/client/models/signal_with_token.py +163 -0
  50. crypticorn/dex/client/models/token_data.py +127 -0
  51. crypticorn/dex/client/models/token_detail.py +116 -0
  52. crypticorn/dex/client/py.typed +0 -0
  53. crypticorn/dex/client/rest.py +217 -0
  54. crypticorn/dex/main.py +1 -0
  55. crypticorn/hive/client/api/admin_api.py +1173 -47
  56. crypticorn/hive/client/api/data_api.py +499 -17
  57. crypticorn/hive/client/api/models_api.py +1595 -87
  58. crypticorn/hive/client/api/status_api.py +397 -16
  59. crypticorn/hive/client/api_client.py +0 -5
  60. crypticorn/hive/client/models/api_error_identifier.py +1 -1
  61. crypticorn/hive/client/models/coin_info.py +1 -1
  62. crypticorn/hive/client/models/exception_detail.py +1 -1
  63. crypticorn/hive/client/models/target_info.py +1 -1
  64. crypticorn/hive/client/rest.py +23 -4
  65. crypticorn/hive/main.py +99 -25
  66. crypticorn/hive/utils.py +2 -2
  67. crypticorn/klines/client/api/admin_api.py +1173 -47
  68. crypticorn/klines/client/api/change_in_timeframe_api.py +269 -11
  69. crypticorn/klines/client/api/funding_rates_api.py +315 -11
  70. crypticorn/klines/client/api/ohlcv_data_api.py +390 -11
  71. crypticorn/klines/client/api/status_api.py +397 -16
  72. crypticorn/klines/client/api/symbols_api.py +216 -11
  73. crypticorn/klines/client/api/udf_api.py +1268 -51
  74. crypticorn/klines/client/api_client.py +0 -5
  75. crypticorn/klines/client/models/api_error_identifier.py +3 -1
  76. crypticorn/klines/client/models/exception_detail.py +1 -1
  77. crypticorn/klines/client/models/ohlcv.py +1 -1
  78. crypticorn/klines/client/models/symbol_group.py +1 -1
  79. crypticorn/klines/client/models/udf_config.py +1 -1
  80. crypticorn/klines/client/rest.py +23 -4
  81. crypticorn/klines/main.py +89 -12
  82. crypticorn/metrics/client/api/admin_api.py +1173 -47
  83. crypticorn/metrics/client/api/exchanges_api.py +1370 -145
  84. crypticorn/metrics/client/api/indicators_api.py +622 -17
  85. crypticorn/metrics/client/api/logs_api.py +296 -11
  86. crypticorn/metrics/client/api/marketcap_api.py +1207 -67
  87. crypticorn/metrics/client/api/markets_api.py +343 -11
  88. crypticorn/metrics/client/api/quote_currencies_api.py +228 -11
  89. crypticorn/metrics/client/api/status_api.py +397 -16
  90. crypticorn/metrics/client/api/tokens_api.py +382 -15
  91. crypticorn/metrics/client/api_client.py +0 -5
  92. crypticorn/metrics/client/configuration.py +4 -2
  93. crypticorn/metrics/client/models/exception_detail.py +1 -1
  94. crypticorn/metrics/client/models/exchange_mapping.py +1 -1
  95. crypticorn/metrics/client/models/marketcap_ranking.py +1 -1
  96. crypticorn/metrics/client/models/marketcap_symbol_ranking.py +1 -1
  97. crypticorn/metrics/client/models/ohlcv.py +1 -1
  98. crypticorn/metrics/client/rest.py +23 -4
  99. crypticorn/metrics/main.py +113 -19
  100. crypticorn/pay/client/api/admin_api.py +1585 -57
  101. crypticorn/pay/client/api/now_payments_api.py +961 -39
  102. crypticorn/pay/client/api/payments_api.py +562 -17
  103. crypticorn/pay/client/api/products_api.py +880 -30
  104. crypticorn/pay/client/api/status_api.py +397 -16
  105. crypticorn/pay/client/api_client.py +0 -5
  106. crypticorn/pay/client/configuration.py +2 -2
  107. crypticorn/pay/client/models/api_error_identifier.py +7 -7
  108. crypticorn/pay/client/models/exception_detail.py +1 -1
  109. crypticorn/pay/client/models/now_create_invoice_req.py +1 -1
  110. crypticorn/pay/client/models/now_create_invoice_res.py +1 -1
  111. crypticorn/pay/client/models/product.py +1 -1
  112. crypticorn/pay/client/models/product_create.py +1 -1
  113. crypticorn/pay/client/models/product_update.py +1 -1
  114. crypticorn/pay/client/models/scope.py +1 -0
  115. crypticorn/pay/client/rest.py +23 -4
  116. crypticorn/pay/main.py +10 -6
  117. crypticorn/trade/client/__init__.py +11 -1
  118. crypticorn/trade/client/api/__init__.py +0 -1
  119. crypticorn/trade/client/api/admin_api.py +1184 -55
  120. crypticorn/trade/client/api/api_keys_api.py +1678 -162
  121. crypticorn/trade/client/api/bots_api.py +7563 -187
  122. crypticorn/trade/client/api/exchanges_api.py +565 -19
  123. crypticorn/trade/client/api/notifications_api.py +1290 -116
  124. crypticorn/trade/client/api/orders_api.py +393 -55
  125. crypticorn/trade/client/api/status_api.py +397 -13
  126. crypticorn/trade/client/api/strategies_api.py +1133 -77
  127. crypticorn/trade/client/api/trading_actions_api.py +786 -65
  128. crypticorn/trade/client/models/__init__.py +11 -0
  129. crypticorn/trade/client/models/actions_count.py +88 -0
  130. crypticorn/trade/client/models/api_error_identifier.py +1 -0
  131. crypticorn/trade/client/models/bot.py +7 -18
  132. crypticorn/trade/client/models/bot_create.py +17 -1
  133. crypticorn/trade/client/models/bot_update.py +17 -1
  134. crypticorn/trade/client/models/exchange.py +6 -1
  135. crypticorn/trade/client/models/exchange_key.py +1 -1
  136. crypticorn/trade/client/models/exchange_key_balance.py +111 -0
  137. crypticorn/trade/client/models/exchange_key_create.py +17 -1
  138. crypticorn/trade/client/models/exchange_key_update.py +17 -1
  139. crypticorn/trade/client/models/execution_ids.py +1 -1
  140. crypticorn/trade/client/models/futures_balance.py +27 -25
  141. crypticorn/trade/client/models/notification.py +17 -1
  142. crypticorn/trade/client/models/notification_create.py +18 -2
  143. crypticorn/trade/client/models/notification_update.py +17 -1
  144. crypticorn/trade/client/models/orders_count.py +88 -0
  145. crypticorn/trade/client/models/paginated_response_futures_trading_action.py +134 -0
  146. crypticorn/trade/client/models/paginated_response_order.py +134 -0
  147. crypticorn/trade/client/models/pn_l.py +95 -0
  148. crypticorn/trade/client/models/post_futures_action.py +1 -1
  149. crypticorn/trade/client/models/spot_balance.py +109 -0
  150. crypticorn/trade/client/models/strategy.py +22 -4
  151. crypticorn/trade/client/models/strategy_create.py +23 -5
  152. crypticorn/trade/client/models/strategy_exchange_info.py +16 -4
  153. crypticorn/trade/client/models/strategy_update.py +19 -3
  154. crypticorn/trade/client/models/tpsl.py +4 -19
  155. crypticorn/trade/client/models/tpsl_create.py +6 -19
  156. crypticorn/trade/client/rest.py +23 -4
  157. crypticorn/trade/main.py +15 -12
  158. {crypticorn-2.16.0.dist-info → crypticorn-2.17.0.dist-info}/METADATA +65 -20
  159. {crypticorn-2.16.0.dist-info → crypticorn-2.17.0.dist-info}/RECORD +163 -128
  160. crypticorn/trade/client/api/futures_trading_panel_api.py +0 -1285
  161. {crypticorn-2.16.0.dist-info → crypticorn-2.17.0.dist-info}/WHEEL +0 -0
  162. {crypticorn-2.16.0.dist-info → crypticorn-2.17.0.dist-info}/entry_points.txt +0 -0
  163. {crypticorn-2.16.0.dist-info → crypticorn-2.17.0.dist-info}/licenses/LICENSE +0 -0
  164. {crypticorn-2.16.0.dist-info → crypticorn-2.17.0.dist-info}/top_level.txt +0 -0
@@ -14,6 +14,7 @@ Do not edit the class manually.
14
14
 
15
15
 
16
16
  # import models into model package
17
+ from crypticorn.trade.client.models.actions_count import ActionsCount
17
18
  from crypticorn.trade.client.models.api_error_identifier import ApiErrorIdentifier
18
19
  from crypticorn.trade.client.models.api_error_level import ApiErrorLevel
19
20
  from crypticorn.trade.client.models.api_error_type import ApiErrorType
@@ -24,6 +25,7 @@ from crypticorn.trade.client.models.bot_update import BotUpdate
24
25
  from crypticorn.trade.client.models.exception_detail import ExceptionDetail
25
26
  from crypticorn.trade.client.models.exchange import Exchange
26
27
  from crypticorn.trade.client.models.exchange_key import ExchangeKey
28
+ from crypticorn.trade.client.models.exchange_key_balance import ExchangeKeyBalance
27
29
  from crypticorn.trade.client.models.exchange_key_create import ExchangeKeyCreate
28
30
  from crypticorn.trade.client.models.exchange_key_update import ExchangeKeyUpdate
29
31
  from crypticorn.trade.client.models.execution_ids import ExecutionIds
@@ -40,7 +42,16 @@ from crypticorn.trade.client.models.notification_create import NotificationCreat
40
42
  from crypticorn.trade.client.models.notification_update import NotificationUpdate
41
43
  from crypticorn.trade.client.models.order import Order
42
44
  from crypticorn.trade.client.models.order_status import OrderStatus
45
+ from crypticorn.trade.client.models.orders_count import OrdersCount
46
+ from crypticorn.trade.client.models.paginated_response_futures_trading_action import (
47
+ PaginatedResponseFuturesTradingAction,
48
+ )
49
+ from crypticorn.trade.client.models.paginated_response_order import (
50
+ PaginatedResponseOrder,
51
+ )
52
+ from crypticorn.trade.client.models.pn_l import PnL
43
53
  from crypticorn.trade.client.models.post_futures_action import PostFuturesAction
54
+ from crypticorn.trade.client.models.spot_balance import SpotBalance
44
55
  from crypticorn.trade.client.models.spot_trading_action_create import (
45
56
  SpotTradingActionCreate,
46
57
  )
@@ -0,0 +1,88 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Trading API
5
+
6
+ API for automated trading and exchange interface. This API is used to trade on the exchange and manage bots, API keys, orders, and more.
7
+
8
+ The version of the OpenAPI document: 1.0.0
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictInt
21
+ from typing import Any, ClassVar, Dict, List
22
+ from typing import Optional, Set
23
+ from typing_extensions import Self
24
+
25
+
26
+ class ActionsCount(BaseModel):
27
+ """
28
+ The number of actions for a user by day
29
+ """ # noqa: E501
30
+
31
+ timestamp: StrictInt = Field(
32
+ description="Timestamp of the latest action for the day"
33
+ )
34
+ count: StrictInt = Field(description="The number of actions for the day")
35
+ __properties: ClassVar[List[str]] = ["timestamp", "count"]
36
+
37
+ model_config = ConfigDict(
38
+ populate_by_name=True,
39
+ validate_assignment=True,
40
+ protected_namespaces=(),
41
+ )
42
+
43
+ def to_str(self) -> str:
44
+ """Returns the string representation of the model using alias"""
45
+ return pprint.pformat(self.model_dump(by_alias=True))
46
+
47
+ def to_json(self) -> str:
48
+ """Returns the JSON representation of the model using alias"""
49
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
50
+ return json.dumps(self.to_dict())
51
+
52
+ @classmethod
53
+ def from_json(cls, json_str: str) -> Optional[Self]:
54
+ """Create an instance of ActionsCount from a JSON string"""
55
+ return cls.from_dict(json.loads(json_str))
56
+
57
+ def to_dict(self) -> Dict[str, Any]:
58
+ """Return the dictionary representation of the model using alias.
59
+
60
+ This has the following differences from calling pydantic's
61
+ `self.model_dump(by_alias=True)`:
62
+
63
+ * `None` is only added to the output dict for nullable fields that
64
+ were set at model initialization. Other fields with value `None`
65
+ are ignored.
66
+ """
67
+ excluded_fields: Set[str] = set([])
68
+
69
+ _dict = self.model_dump(
70
+ by_alias=True,
71
+ exclude=excluded_fields,
72
+ exclude_none=True,
73
+ )
74
+ return _dict
75
+
76
+ @classmethod
77
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
78
+ """Create an instance of ActionsCount from a dict"""
79
+ if obj is None:
80
+ return None
81
+
82
+ if not isinstance(obj, dict):
83
+ return cls.model_validate(obj)
84
+
85
+ _obj = cls.model_validate(
86
+ {"timestamp": obj.get("timestamp"), "count": obj.get("count")}
87
+ )
88
+ return _obj
@@ -65,6 +65,7 @@ class ApiErrorIdentifier(str, Enum):
65
65
  INSUFFICIENT_MARGIN = "insufficient_margin"
66
66
  INSUFFICIENT_SCOPES = "insufficient_scopes"
67
67
  INVALID_API_KEY = "invalid_api_key"
68
+ INVALID_BASIC_AUTH = "invalid_basic_auth"
68
69
  INVALID_BEARER = "invalid_bearer"
69
70
  INVALID_DATA = "invalid_data"
70
71
  INVALID_DATA_RESPONSE = "invalid_data_response"
@@ -18,8 +18,7 @@ import re # noqa: F401
18
18
  import json
19
19
 
20
20
  from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr
21
- from typing import Any, ClassVar, Dict, List, Optional, Union
22
- from typing_extensions import Annotated
21
+ from typing import Any, ClassVar, Dict, List, Optional
23
22
  from crypticorn.trade.client.models.api_error_identifier import ApiErrorIdentifier
24
23
  from crypticorn.trade.client.models.bot_status import BotStatus
25
24
  from typing import Optional, Set
@@ -49,22 +48,12 @@ class Bot(BaseModel):
49
48
  )
50
49
  api_key_id: StrictStr = Field(description="UID for the API key")
51
50
  status_code: Optional[ApiErrorIdentifier] = None
52
- current_allocation: Optional[
53
- Union[
54
- Annotated[float, Field(strict=True, ge=0.0)],
55
- Annotated[int, Field(strict=True, ge=0)],
56
- ]
57
- ] = Field(
58
- default=0,
51
+ current_allocation: Optional[StrictStr] = Field(
52
+ default="0",
59
53
  description="Initial allocation for the bot + accumulated PnL of the orders after the last allocation change",
60
54
  )
61
- current_exposure: Optional[
62
- Union[
63
- Annotated[float, Field(strict=True, ge=0.0)],
64
- Annotated[int, Field(strict=True, ge=0)],
65
- ]
66
- ] = Field(
67
- default=0,
55
+ current_exposure: Optional[StrictStr] = Field(
56
+ default="0",
68
57
  description="Current exposure of the bot, aka. the sum of the absolute values of the open positions",
69
58
  )
70
59
  __properties: ClassVar[List[str]] = [
@@ -150,12 +139,12 @@ class Bot(BaseModel):
150
139
  "current_allocation": (
151
140
  obj.get("current_allocation")
152
141
  if obj.get("current_allocation") is not None
153
- else 0
142
+ else "0"
154
143
  ),
155
144
  "current_exposure": (
156
145
  obj.get("current_exposure")
157
146
  if obj.get("current_exposure") is not None
158
- else 0
147
+ else "0"
159
148
  ),
160
149
  }
161
150
  )
@@ -36,6 +36,7 @@ class BotCreate(BaseModel):
36
36
  description="UID for the trading strategy used by the bot"
37
37
  )
38
38
  api_key_id: StrictStr = Field(description="UID for the API key")
39
+ additional_properties: Dict[str, Any] = {}
39
40
  __properties: ClassVar[List[str]] = [
40
41
  "name",
41
42
  "allocation",
@@ -73,14 +74,24 @@ class BotCreate(BaseModel):
73
74
  * `None` is only added to the output dict for nullable fields that
74
75
  were set at model initialization. Other fields with value `None`
75
76
  are ignored.
77
+ * Fields in `self.additional_properties` are added to the output dict.
76
78
  """
77
- excluded_fields: Set[str] = set([])
79
+ excluded_fields: Set[str] = set(
80
+ [
81
+ "additional_properties",
82
+ ]
83
+ )
78
84
 
79
85
  _dict = self.model_dump(
80
86
  by_alias=True,
81
87
  exclude=excluded_fields,
82
88
  exclude_none=True,
83
89
  )
90
+ # puts key-value pairs in additional_properties in the top level
91
+ if self.additional_properties is not None:
92
+ for _key, _value in self.additional_properties.items():
93
+ _dict[_key] = _value
94
+
84
95
  return _dict
85
96
 
86
97
  @classmethod
@@ -101,4 +112,9 @@ class BotCreate(BaseModel):
101
112
  "api_key_id": obj.get("api_key_id"),
102
113
  }
103
114
  )
115
+ # store additional fields in additional_properties
116
+ for _key in obj.keys():
117
+ if _key not in cls.__properties:
118
+ _obj.additional_properties[_key] = obj.get(_key)
119
+
104
120
  return _obj
@@ -32,6 +32,7 @@ class BotUpdate(BaseModel):
32
32
  name: Optional[StrictStr] = None
33
33
  allocation: Optional[StrictInt] = None
34
34
  status: Optional[BotStatus] = None
35
+ additional_properties: Dict[str, Any] = {}
35
36
  __properties: ClassVar[List[str]] = ["name", "allocation", "status"]
36
37
 
37
38
  model_config = ConfigDict(
@@ -63,14 +64,24 @@ class BotUpdate(BaseModel):
63
64
  * `None` is only added to the output dict for nullable fields that
64
65
  were set at model initialization. Other fields with value `None`
65
66
  are ignored.
67
+ * Fields in `self.additional_properties` are added to the output dict.
66
68
  """
67
- excluded_fields: Set[str] = set([])
69
+ excluded_fields: Set[str] = set(
70
+ [
71
+ "additional_properties",
72
+ ]
73
+ )
68
74
 
69
75
  _dict = self.model_dump(
70
76
  by_alias=True,
71
77
  exclude=excluded_fields,
72
78
  exclude_none=True,
73
79
  )
80
+ # puts key-value pairs in additional_properties in the top level
81
+ if self.additional_properties is not None:
82
+ for _key, _value in self.additional_properties.items():
83
+ _dict[_key] = _value
84
+
74
85
  # set to None if name (nullable) is None
75
86
  # and model_fields_set contains the field
76
87
  if self.name is None and "name" in self.model_fields_set:
@@ -104,4 +115,9 @@ class BotUpdate(BaseModel):
104
115
  "status": obj.get("status"),
105
116
  }
106
117
  )
118
+ # store additional fields in additional_properties
119
+ for _key in obj.keys():
120
+ if _key not in cls.__properties:
121
+ _obj.additional_properties[_key] = obj.get(_key)
122
+
107
123
  return _obj
@@ -20,7 +20,7 @@ from typing_extensions import Self
20
20
 
21
21
  class Exchange(str, Enum):
22
22
  """
23
- Supported exchanges for trading
23
+ All exchanges used in the crypticorn ecosystem. Refer to the APIs for support for a specific usecase (data, trading, etc.).
24
24
  """
25
25
 
26
26
  """
@@ -28,7 +28,12 @@ class Exchange(str, Enum):
28
28
  """
29
29
  KUCOIN = "kucoin"
30
30
  BINGX = "bingx"
31
+ BINANCE = "binance"
32
+ BYBIT = "bybit"
31
33
  HYPERLIQUID = "hyperliquid"
34
+ BITGET = "bitget"
35
+ GATEIO = "gateio"
36
+ BITSTAMP = "bitstamp"
32
37
 
33
38
  @classmethod
34
39
  def from_json(cls, json_str: str) -> Self:
@@ -26,7 +26,7 @@ from typing_extensions import Self
26
26
 
27
27
  class ExchangeKey(BaseModel):
28
28
  """
29
- Exchange key model not containing sensitive information for read operations.
29
+ Exchange API key model without sensitive credentials for safe read operations.
30
30
  """ # noqa: E501
31
31
 
32
32
  user_id: StrictStr = Field(description="UID for the user")
@@ -0,0 +1,111 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Trading API
5
+
6
+ API for automated trading and exchange interface. This API is used to trade on the exchange and manage bots, API keys, orders, and more.
7
+
8
+ The version of the OpenAPI document: 1.0.0
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr
21
+ from typing import Any, ClassVar, Dict, List
22
+ from crypticorn.trade.client.models.futures_balance import FuturesBalance
23
+ from crypticorn.trade.client.models.spot_balance import SpotBalance
24
+ from typing import Optional, Set
25
+ from typing_extensions import Self
26
+
27
+
28
+ class ExchangeKeyBalance(BaseModel):
29
+ """
30
+ Balance information for an exchange API key including futures and spot balances.
31
+ """ # noqa: E501
32
+
33
+ api_key_id: StrictStr = Field(description="API key ID.")
34
+ futures: FuturesBalance = Field(description="Futures balance information.")
35
+ spot: List[SpotBalance] = Field(description="Spot balance information.")
36
+ __properties: ClassVar[List[str]] = ["api_key_id", "futures", "spot"]
37
+
38
+ model_config = ConfigDict(
39
+ populate_by_name=True,
40
+ validate_assignment=True,
41
+ protected_namespaces=(),
42
+ )
43
+
44
+ def to_str(self) -> str:
45
+ """Returns the string representation of the model using alias"""
46
+ return pprint.pformat(self.model_dump(by_alias=True))
47
+
48
+ def to_json(self) -> str:
49
+ """Returns the JSON representation of the model using alias"""
50
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
51
+ return json.dumps(self.to_dict())
52
+
53
+ @classmethod
54
+ def from_json(cls, json_str: str) -> Optional[Self]:
55
+ """Create an instance of ExchangeKeyBalance from a JSON string"""
56
+ return cls.from_dict(json.loads(json_str))
57
+
58
+ def to_dict(self) -> Dict[str, Any]:
59
+ """Return the dictionary representation of the model using alias.
60
+
61
+ This has the following differences from calling pydantic's
62
+ `self.model_dump(by_alias=True)`:
63
+
64
+ * `None` is only added to the output dict for nullable fields that
65
+ were set at model initialization. Other fields with value `None`
66
+ are ignored.
67
+ """
68
+ excluded_fields: Set[str] = set([])
69
+
70
+ _dict = self.model_dump(
71
+ by_alias=True,
72
+ exclude=excluded_fields,
73
+ exclude_none=True,
74
+ )
75
+ # override the default output from pydantic by calling `to_dict()` of futures
76
+ if self.futures:
77
+ _dict["futures"] = self.futures.to_dict()
78
+ # override the default output from pydantic by calling `to_dict()` of each item in spot (list)
79
+ _items = []
80
+ if self.spot:
81
+ for _item_spot in self.spot:
82
+ if _item_spot:
83
+ _items.append(_item_spot.to_dict())
84
+ _dict["spot"] = _items
85
+ return _dict
86
+
87
+ @classmethod
88
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
89
+ """Create an instance of ExchangeKeyBalance from a dict"""
90
+ if obj is None:
91
+ return None
92
+
93
+ if not isinstance(obj, dict):
94
+ return cls.model_validate(obj)
95
+
96
+ _obj = cls.model_validate(
97
+ {
98
+ "api_key_id": obj.get("api_key_id"),
99
+ "futures": (
100
+ FuturesBalance.from_dict(obj["futures"])
101
+ if obj.get("futures") is not None
102
+ else None
103
+ ),
104
+ "spot": (
105
+ [SpotBalance.from_dict(_item) for _item in obj["spot"]]
106
+ if obj.get("spot") is not None
107
+ else None
108
+ ),
109
+ }
110
+ )
111
+ return _obj
@@ -34,6 +34,7 @@ class ExchangeKeyCreate(BaseModel):
34
34
  secret: StrictStr = Field(description="API secret")
35
35
  passphrase: Optional[StrictStr] = None
36
36
  exchange: Exchange = Field(description="The exchange the API key is for.")
37
+ additional_properties: Dict[str, Any] = {}
37
38
  __properties: ClassVar[List[str]] = [
38
39
  "label",
39
40
  "api_key",
@@ -71,14 +72,24 @@ class ExchangeKeyCreate(BaseModel):
71
72
  * `None` is only added to the output dict for nullable fields that
72
73
  were set at model initialization. Other fields with value `None`
73
74
  are ignored.
75
+ * Fields in `self.additional_properties` are added to the output dict.
74
76
  """
75
- excluded_fields: Set[str] = set([])
77
+ excluded_fields: Set[str] = set(
78
+ [
79
+ "additional_properties",
80
+ ]
81
+ )
76
82
 
77
83
  _dict = self.model_dump(
78
84
  by_alias=True,
79
85
  exclude=excluded_fields,
80
86
  exclude_none=True,
81
87
  )
88
+ # puts key-value pairs in additional_properties in the top level
89
+ if self.additional_properties is not None:
90
+ for _key, _value in self.additional_properties.items():
91
+ _dict[_key] = _value
92
+
82
93
  # set to None if passphrase (nullable) is None
83
94
  # and model_fields_set contains the field
84
95
  if self.passphrase is None and "passphrase" in self.model_fields_set:
@@ -104,4 +115,9 @@ class ExchangeKeyCreate(BaseModel):
104
115
  "exchange": obj.get("exchange"),
105
116
  }
106
117
  )
118
+ # store additional fields in additional_properties
119
+ for _key in obj.keys():
120
+ if _key not in cls.__properties:
121
+ _obj.additional_properties[_key] = obj.get(_key)
122
+
107
123
  return _obj
@@ -32,6 +32,7 @@ class ExchangeKeyUpdate(BaseModel):
32
32
  api_key: Optional[StrictStr] = None
33
33
  secret: Optional[StrictStr] = None
34
34
  passphrase: Optional[StrictStr] = None
35
+ additional_properties: Dict[str, Any] = {}
35
36
  __properties: ClassVar[List[str]] = ["label", "api_key", "secret", "passphrase"]
36
37
 
37
38
  model_config = ConfigDict(
@@ -63,14 +64,24 @@ class ExchangeKeyUpdate(BaseModel):
63
64
  * `None` is only added to the output dict for nullable fields that
64
65
  were set at model initialization. Other fields with value `None`
65
66
  are ignored.
67
+ * Fields in `self.additional_properties` are added to the output dict.
66
68
  """
67
- excluded_fields: Set[str] = set([])
69
+ excluded_fields: Set[str] = set(
70
+ [
71
+ "additional_properties",
72
+ ]
73
+ )
68
74
 
69
75
  _dict = self.model_dump(
70
76
  by_alias=True,
71
77
  exclude=excluded_fields,
72
78
  exclude_none=True,
73
79
  )
80
+ # puts key-value pairs in additional_properties in the top level
81
+ if self.additional_properties is not None:
82
+ for _key, _value in self.additional_properties.items():
83
+ _dict[_key] = _value
84
+
74
85
  # set to None if label (nullable) is None
75
86
  # and model_fields_set contains the field
76
87
  if self.label is None and "label" in self.model_fields_set:
@@ -110,4 +121,9 @@ class ExchangeKeyUpdate(BaseModel):
110
121
  "passphrase": obj.get("passphrase"),
111
122
  }
112
123
  )
124
+ # store additional fields in additional_properties
125
+ for _key in obj.keys():
126
+ if _key not in cls.__properties:
127
+ _obj.additional_properties[_key] = obj.get(_key)
128
+
113
129
  return _obj
@@ -25,7 +25,7 @@ from typing_extensions import Self
25
25
 
26
26
  class ExecutionIds(BaseModel):
27
27
  """
28
- ExecutionIds
28
+ Execution IDs for trading actions including main order and stop loss/take profit orders.
29
29
  """ # noqa: E501
30
30
 
31
31
  main: StrictStr = Field(description="Main execution ID.")
@@ -28,29 +28,35 @@ class FuturesBalance(BaseModel):
28
28
  Model for futures balance
29
29
  """ # noqa: E501
30
30
 
31
- api_key_id: StrictStr = Field(description="API key ID", alias="apiKeyId")
32
- asset: StrictStr = Field(description="Asset/Currency code")
33
- balance: Union[StrictFloat, StrictInt] = Field(description="Total balance/equity")
31
+ asset: StrictStr = Field(description="Asset the balance values are in")
32
+ equity: Union[StrictFloat, StrictInt] = Field(
33
+ description="Net asset value including unrealized profit and loss"
34
+ )
35
+ balance: Union[StrictFloat, StrictInt] = Field(
36
+ description="Actual account balance (equity - unrealized)"
37
+ )
34
38
  available: Union[StrictFloat, StrictInt] = Field(
35
39
  description="Available balance for trading/withdrawal"
36
40
  )
37
- unrealized_pnl: Union[StrictFloat, StrictInt] = Field(
38
- description="Unrealized profit and loss", alias="unrealizedPnl"
41
+ unrealized: Union[StrictFloat, StrictInt] = Field(
42
+ description="Unrealized profit and loss"
39
43
  )
40
- used_margin: Optional[Union[StrictFloat, StrictInt]] = Field(
41
- default=None, alias="usedMargin"
44
+ used: Union[StrictFloat, StrictInt] = Field(
45
+ description="Margin used in open positions"
42
46
  )
43
- frozen_amount: Optional[Union[StrictFloat, StrictInt]] = Field(
44
- default=None, alias="frozenAmount"
47
+ frozen: Union[StrictFloat, StrictInt] = Field(
48
+ description="Frozen funds not available for use"
45
49
  )
50
+ allocated: Optional[Union[StrictFloat, StrictInt]] = None
46
51
  __properties: ClassVar[List[str]] = [
47
- "apiKeyId",
48
52
  "asset",
53
+ "equity",
49
54
  "balance",
50
55
  "available",
51
- "unrealizedPnl",
52
- "usedMargin",
53
- "frozenAmount",
56
+ "unrealized",
57
+ "used",
58
+ "frozen",
59
+ "allocated",
54
60
  ]
55
61
 
56
62
  model_config = ConfigDict(
@@ -90,15 +96,10 @@ class FuturesBalance(BaseModel):
90
96
  exclude=excluded_fields,
91
97
  exclude_none=True,
92
98
  )
93
- # set to None if used_margin (nullable) is None
94
- # and model_fields_set contains the field
95
- if self.used_margin is None and "used_margin" in self.model_fields_set:
96
- _dict["usedMargin"] = None
97
-
98
- # set to None if frozen_amount (nullable) is None
99
+ # set to None if allocated (nullable) is None
99
100
  # and model_fields_set contains the field
100
- if self.frozen_amount is None and "frozen_amount" in self.model_fields_set:
101
- _dict["frozenAmount"] = None
101
+ if self.allocated is None and "allocated" in self.model_fields_set:
102
+ _dict["allocated"] = None
102
103
 
103
104
  return _dict
104
105
 
@@ -113,13 +114,14 @@ class FuturesBalance(BaseModel):
113
114
 
114
115
  _obj = cls.model_validate(
115
116
  {
116
- "apiKeyId": obj.get("apiKeyId"),
117
117
  "asset": obj.get("asset"),
118
+ "equity": obj.get("equity"),
118
119
  "balance": obj.get("balance"),
119
120
  "available": obj.get("available"),
120
- "unrealizedPnl": obj.get("unrealizedPnl"),
121
- "usedMargin": obj.get("usedMargin"),
122
- "frozenAmount": obj.get("frozenAmount"),
121
+ "unrealized": obj.get("unrealized"),
122
+ "used": obj.get("used"),
123
+ "frozen": obj.get("frozen"),
124
+ "allocated": obj.get("allocated"),
123
125
  }
124
126
  )
125
127
  return _obj
@@ -56,6 +56,7 @@ class Notification(BaseModel):
56
56
  type: ApiErrorType = Field(
57
57
  description="Type of the notification. Of type ApiErrorType"
58
58
  )
59
+ additional_properties: Dict[str, Any] = {}
59
60
  __properties: ClassVar[List[str]] = [
60
61
  "user_id",
61
62
  "created_at",
@@ -97,14 +98,24 @@ class Notification(BaseModel):
97
98
  * `None` is only added to the output dict for nullable fields that
98
99
  were set at model initialization. Other fields with value `None`
99
100
  are ignored.
101
+ * Fields in `self.additional_properties` are added to the output dict.
100
102
  """
101
- excluded_fields: Set[str] = set([])
103
+ excluded_fields: Set[str] = set(
104
+ [
105
+ "additional_properties",
106
+ ]
107
+ )
102
108
 
103
109
  _dict = self.model_dump(
104
110
  by_alias=True,
105
111
  exclude=excluded_fields,
106
112
  exclude_none=True,
107
113
  )
114
+ # puts key-value pairs in additional_properties in the top level
115
+ if self.additional_properties is not None:
116
+ for _key, _value in self.additional_properties.items():
117
+ _dict[_key] = _value
118
+
108
119
  return _dict
109
120
 
110
121
  @classmethod
@@ -129,4 +140,9 @@ class Notification(BaseModel):
129
140
  "type": obj.get("type"),
130
141
  }
131
142
  )
143
+ # store additional fields in additional_properties
144
+ for _key in obj.keys():
145
+ if _key not in cls.__properties:
146
+ _obj.additional_properties[_key] = obj.get(_key)
147
+
132
148
  return _obj