crypticorn 2.17.0rc4__py3-none-any.whl → 2.17.0rc6__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 (151) hide show
  1. crypticorn/auth/client/api/admin_api.py +6 -26
  2. crypticorn/auth/client/api/auth_api.py +36 -148
  3. crypticorn/auth/client/api/service_api.py +3 -16
  4. crypticorn/auth/client/api/user_api.py +33 -136
  5. crypticorn/auth/client/api/wallet_api.py +18 -76
  6. crypticorn/auth/client/api_client.py +0 -5
  7. crypticorn/auth/client/models/add_wallet_request.py +1 -1
  8. crypticorn/auth/client/models/authorize_user_request.py +1 -1
  9. crypticorn/auth/client/models/create_api_key_request.py +1 -1
  10. crypticorn/auth/client/models/create_user_request.py +1 -1
  11. crypticorn/auth/client/models/get_api_keys200_response_inner.py +1 -1
  12. crypticorn/auth/client/models/list_wallets200_response_balances_inner_sale_round.py +1 -1
  13. crypticorn/auth/client/models/list_wallets200_response_balances_inner_wallet.py +1 -1
  14. crypticorn/auth/client/models/list_wallets200_response_balances_inner_wallet_vesting_wallets_inner.py +1 -1
  15. crypticorn/auth/client/models/list_wallets200_response_data_inner.py +1 -1
  16. crypticorn/auth/client/models/logout_default_response.py +1 -1
  17. crypticorn/auth/client/models/oauth_callback200_response_user.py +1 -1
  18. crypticorn/auth/client/models/refresh_token_info200_response_user_session.py +1 -1
  19. crypticorn/auth/client/models/rotate_tokens200_response.py +1 -1
  20. crypticorn/auth/client/models/token_info200_response.py +1 -1
  21. crypticorn/auth/client/models/update_user_request.py +1 -1
  22. crypticorn/auth/client/models/user_by_username200_response.py +1 -1
  23. crypticorn/auth/client/models/verify200_response.py +1 -1
  24. crypticorn/auth/client/models/verify_email200_response_auth.py +1 -1
  25. crypticorn/auth/client/models/verify_email200_response_auth_auth.py +1 -1
  26. crypticorn/auth/client/models/whoami200_response.py +1 -1
  27. crypticorn/cli/init.py +1 -1
  28. crypticorn/cli/templates/.env.docker.temp +3 -0
  29. crypticorn/cli/templates/.env.example.temp +4 -0
  30. crypticorn/cli/templates/Dockerfile +5 -2
  31. crypticorn/client.py +0 -1
  32. crypticorn/common/auth.py +31 -4
  33. crypticorn/common/decorators.py +1 -2
  34. crypticorn/common/enums.py +0 -2
  35. crypticorn/common/errors.py +10 -0
  36. crypticorn/common/metrics.py +1 -1
  37. crypticorn/common/middleware.py +0 -1
  38. crypticorn/common/pagination.py +116 -24
  39. crypticorn/common/router/admin_router.py +1 -11
  40. crypticorn/common/router/status_router.py +33 -2
  41. crypticorn/common/scopes.py +2 -2
  42. crypticorn/common/utils.py +1 -2
  43. crypticorn/dex/__init__.py +6 -0
  44. crypticorn/dex/client/__init__.py +49 -0
  45. crypticorn/dex/client/api/__init__.py +6 -0
  46. crypticorn/dex/client/api/admin_api.py +2983 -0
  47. crypticorn/dex/client/api/signals_api.py +1794 -0
  48. crypticorn/dex/client/api/status_api.py +889 -0
  49. crypticorn/dex/client/api_client.py +753 -0
  50. crypticorn/dex/client/api_response.py +20 -0
  51. crypticorn/dex/client/configuration.py +620 -0
  52. crypticorn/dex/client/exceptions.py +220 -0
  53. crypticorn/dex/client/models/__init__.py +30 -0
  54. crypticorn/dex/client/models/api_error_identifier.py +121 -0
  55. crypticorn/dex/client/models/api_error_level.py +37 -0
  56. crypticorn/dex/client/models/api_error_type.py +37 -0
  57. crypticorn/dex/client/models/exception_detail.py +117 -0
  58. crypticorn/dex/client/models/log_level.py +38 -0
  59. crypticorn/dex/client/models/paginated_response_signal_with_token.py +134 -0
  60. crypticorn/dex/client/models/risk.py +86 -0
  61. crypticorn/dex/client/models/signal_overview_stats.py +156 -0
  62. crypticorn/dex/client/models/signal_volume.py +84 -0
  63. crypticorn/dex/client/models/signal_with_token.py +163 -0
  64. crypticorn/dex/client/models/token_data.py +127 -0
  65. crypticorn/dex/client/models/token_detail.py +116 -0
  66. crypticorn/dex/client/py.typed +0 -0
  67. crypticorn/dex/client/rest.py +217 -0
  68. crypticorn/dex/main.py +1 -0
  69. crypticorn/hive/client/api/admin_api.py +18 -75
  70. crypticorn/hive/client/api/data_api.py +6 -28
  71. crypticorn/hive/client/api/models_api.py +22 -88
  72. crypticorn/hive/client/api/status_api.py +6 -27
  73. crypticorn/hive/client/api_client.py +0 -5
  74. crypticorn/hive/client/models/coin_info.py +1 -1
  75. crypticorn/hive/client/models/exception_detail.py +1 -1
  76. crypticorn/hive/client/models/target_info.py +1 -1
  77. crypticorn/hive/utils.py +2 -2
  78. crypticorn/klines/client/api/admin_api.py +18 -75
  79. crypticorn/klines/client/api/change_in_timeframe_api.py +3 -16
  80. crypticorn/klines/client/api/funding_rates_api.py +3 -16
  81. crypticorn/klines/client/api/ohlcv_data_api.py +3 -16
  82. crypticorn/klines/client/api/status_api.py +6 -27
  83. crypticorn/klines/client/api/symbols_api.py +3 -16
  84. crypticorn/klines/client/api/udf_api.py +18 -74
  85. crypticorn/klines/client/api_client.py +0 -5
  86. crypticorn/klines/client/models/exception_detail.py +1 -1
  87. crypticorn/klines/client/models/ohlcv.py +1 -1
  88. crypticorn/klines/client/models/symbol_group.py +1 -1
  89. crypticorn/klines/client/models/udf_config.py +1 -1
  90. crypticorn/metrics/client/api/admin_api.py +18 -75
  91. crypticorn/metrics/client/api/exchanges_api.py +12 -52
  92. crypticorn/metrics/client/api/indicators_api.py +6 -28
  93. crypticorn/metrics/client/api/logs_api.py +3 -16
  94. crypticorn/metrics/client/api/marketcap_api.py +12 -52
  95. crypticorn/metrics/client/api/markets_api.py +3 -16
  96. crypticorn/metrics/client/api/quote_currencies_api.py +3 -16
  97. crypticorn/metrics/client/api/status_api.py +6 -27
  98. crypticorn/metrics/client/api/tokens_api.py +6 -26
  99. crypticorn/metrics/client/api_client.py +0 -5
  100. crypticorn/metrics/client/models/exception_detail.py +1 -1
  101. crypticorn/metrics/client/models/exchange_mapping.py +1 -1
  102. crypticorn/metrics/client/models/marketcap_ranking.py +1 -1
  103. crypticorn/metrics/client/models/marketcap_symbol_ranking.py +1 -1
  104. crypticorn/metrics/client/models/ohlcv.py +1 -1
  105. crypticorn/pay/client/api/admin_api.py +21 -87
  106. crypticorn/pay/client/api/now_payments_api.py +15 -64
  107. crypticorn/pay/client/api/payments_api.py +6 -28
  108. crypticorn/pay/client/api/products_api.py +12 -52
  109. crypticorn/pay/client/api/status_api.py +6 -27
  110. crypticorn/pay/client/api_client.py +0 -5
  111. crypticorn/pay/client/models/exception_detail.py +1 -1
  112. crypticorn/pay/client/models/now_create_invoice_req.py +1 -1
  113. crypticorn/pay/client/models/now_create_invoice_res.py +1 -1
  114. crypticorn/pay/client/models/product.py +1 -1
  115. crypticorn/pay/client/models/product_create.py +1 -1
  116. crypticorn/pay/client/models/product_update.py +1 -1
  117. crypticorn/trade/client/__init__.py +15 -0
  118. crypticorn/trade/client/api/admin_api.py +43 -107
  119. crypticorn/trade/client/api/api_keys_api.py +207 -184
  120. crypticorn/trade/client/api/bots_api.py +6557 -240
  121. crypticorn/trade/client/api/exchanges_api.py +9 -36
  122. crypticorn/trade/client/api/notifications_api.py +18 -72
  123. crypticorn/trade/client/api/orders_api.py +220 -115
  124. crypticorn/trade/client/api/status_api.py +6 -24
  125. crypticorn/trade/client/api/strategies_api.py +15 -60
  126. crypticorn/trade/client/api/trading_actions_api.py +431 -112
  127. crypticorn/trade/client/models/__init__.py +15 -0
  128. crypticorn/trade/client/models/bot.py +7 -18
  129. crypticorn/trade/client/models/bot_create.py +17 -1
  130. crypticorn/trade/client/models/bot_update.py +17 -1
  131. crypticorn/trade/client/models/exchange_key_create.py +17 -1
  132. crypticorn/trade/client/models/exchange_key_update.py +17 -1
  133. crypticorn/trade/client/models/notification.py +17 -1
  134. crypticorn/trade/client/models/notification_create.py +17 -1
  135. crypticorn/trade/client/models/notification_update.py +17 -1
  136. crypticorn/trade/client/models/orders_count.py +88 -0
  137. crypticorn/trade/client/models/paginated_response_futures_trading_action.py +134 -0
  138. crypticorn/trade/client/models/paginated_response_order.py +134 -0
  139. crypticorn/trade/client/models/paginated_response_union_futures_trading_action_spot_trading_action.py +141 -0
  140. crypticorn/trade/client/models/paginated_response_union_futures_trading_action_spot_trading_action_data_inner.py +165 -0
  141. crypticorn/trade/client/models/pn_l.py +95 -0
  142. crypticorn/trade/client/models/spot_trading_action.py +207 -0
  143. crypticorn/trade/client/models/strategy.py +17 -1
  144. crypticorn/trade/client/models/strategy_create.py +17 -1
  145. crypticorn/trade/client/models/strategy_update.py +17 -1
  146. {crypticorn-2.17.0rc4.dist-info → crypticorn-2.17.0rc6.dist-info}/METADATA +3 -3
  147. {crypticorn-2.17.0rc4.dist-info → crypticorn-2.17.0rc6.dist-info}/RECORD +151 -116
  148. {crypticorn-2.17.0rc4.dist-info → crypticorn-2.17.0rc6.dist-info}/WHEEL +0 -0
  149. {crypticorn-2.17.0rc4.dist-info → crypticorn-2.17.0rc6.dist-info}/entry_points.txt +0 -0
  150. {crypticorn-2.17.0rc4.dist-info → crypticorn-2.17.0rc6.dist-info}/licenses/LICENSE +0 -0
  151. {crypticorn-2.17.0rc4.dist-info → crypticorn-2.17.0rc6.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,207 @@
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, StrictBool, StrictInt, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional
22
+ from crypticorn.trade.client.models.market_type import MarketType
23
+ from crypticorn.trade.client.models.tpsl import TPSL
24
+ from crypticorn.trade.client.models.trading_action_type import TradingActionType
25
+ from typing import Optional, Set
26
+ from typing_extensions import Self
27
+
28
+
29
+ class SpotTradingAction(BaseModel):
30
+ """
31
+ Model for spot trading actions
32
+ """ # noqa: E501
33
+
34
+ created_at: Optional[StrictInt] = Field(
35
+ default=None, description="Timestamp of creation"
36
+ )
37
+ updated_at: Optional[StrictInt] = Field(
38
+ default=None, description="Timestamp of last update"
39
+ )
40
+ id: Optional[StrictStr] = Field(
41
+ default=None, description="Unique identifier for the resource"
42
+ )
43
+ execution_id: Optional[StrictStr] = None
44
+ open_order_execution_id: Optional[StrictStr] = None
45
+ action_type: TradingActionType = Field(description="The type of action.")
46
+ market_type: MarketType = Field(description="The type of market the action is for.")
47
+ strategy_id: StrictStr = Field(description="UID for the strategy.")
48
+ symbol: StrictStr = Field(
49
+ description="Trading symbol or asset pair in format: 'symbol/quote_currency' (see market service for valid symbols)"
50
+ )
51
+ is_limit: Optional[StrictBool] = None
52
+ limit_price: Optional[StrictStr] = None
53
+ allocation: StrictStr = Field(
54
+ description="How much of bot's balance to use for the order (for open actions). How much of the reference open order (open_order_execution_id) to close (for close actions). 0=0%, 1=100%."
55
+ )
56
+ take_profit: Optional[List[TPSL]] = None
57
+ stop_loss: Optional[List[TPSL]] = None
58
+ expiry_timestamp: Optional[StrictInt] = None
59
+ __properties: ClassVar[List[str]] = [
60
+ "created_at",
61
+ "updated_at",
62
+ "id",
63
+ "execution_id",
64
+ "open_order_execution_id",
65
+ "action_type",
66
+ "market_type",
67
+ "strategy_id",
68
+ "symbol",
69
+ "is_limit",
70
+ "limit_price",
71
+ "allocation",
72
+ "take_profit",
73
+ "stop_loss",
74
+ "expiry_timestamp",
75
+ ]
76
+
77
+ model_config = ConfigDict(
78
+ populate_by_name=True,
79
+ validate_assignment=True,
80
+ protected_namespaces=(),
81
+ )
82
+
83
+ def to_str(self) -> str:
84
+ """Returns the string representation of the model using alias"""
85
+ return pprint.pformat(self.model_dump(by_alias=True))
86
+
87
+ def to_json(self) -> str:
88
+ """Returns the JSON representation of the model using alias"""
89
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
90
+ return json.dumps(self.to_dict())
91
+
92
+ @classmethod
93
+ def from_json(cls, json_str: str) -> Optional[Self]:
94
+ """Create an instance of SpotTradingAction from a JSON string"""
95
+ return cls.from_dict(json.loads(json_str))
96
+
97
+ def to_dict(self) -> Dict[str, Any]:
98
+ """Return the dictionary representation of the model using alias.
99
+
100
+ This has the following differences from calling pydantic's
101
+ `self.model_dump(by_alias=True)`:
102
+
103
+ * `None` is only added to the output dict for nullable fields that
104
+ were set at model initialization. Other fields with value `None`
105
+ are ignored.
106
+ """
107
+ excluded_fields: Set[str] = set([])
108
+
109
+ _dict = self.model_dump(
110
+ by_alias=True,
111
+ exclude=excluded_fields,
112
+ exclude_none=True,
113
+ )
114
+ # override the default output from pydantic by calling `to_dict()` of each item in take_profit (list)
115
+ _items = []
116
+ if self.take_profit:
117
+ for _item_take_profit in self.take_profit:
118
+ if _item_take_profit:
119
+ _items.append(_item_take_profit.to_dict())
120
+ _dict["take_profit"] = _items
121
+ # override the default output from pydantic by calling `to_dict()` of each item in stop_loss (list)
122
+ _items = []
123
+ if self.stop_loss:
124
+ for _item_stop_loss in self.stop_loss:
125
+ if _item_stop_loss:
126
+ _items.append(_item_stop_loss.to_dict())
127
+ _dict["stop_loss"] = _items
128
+ # set to None if execution_id (nullable) is None
129
+ # and model_fields_set contains the field
130
+ if self.execution_id is None and "execution_id" in self.model_fields_set:
131
+ _dict["execution_id"] = None
132
+
133
+ # set to None if open_order_execution_id (nullable) is None
134
+ # and model_fields_set contains the field
135
+ if (
136
+ self.open_order_execution_id is None
137
+ and "open_order_execution_id" in self.model_fields_set
138
+ ):
139
+ _dict["open_order_execution_id"] = None
140
+
141
+ # set to None if is_limit (nullable) is None
142
+ # and model_fields_set contains the field
143
+ if self.is_limit is None and "is_limit" in self.model_fields_set:
144
+ _dict["is_limit"] = None
145
+
146
+ # set to None if limit_price (nullable) is None
147
+ # and model_fields_set contains the field
148
+ if self.limit_price is None and "limit_price" in self.model_fields_set:
149
+ _dict["limit_price"] = None
150
+
151
+ # set to None if take_profit (nullable) is None
152
+ # and model_fields_set contains the field
153
+ if self.take_profit is None and "take_profit" in self.model_fields_set:
154
+ _dict["take_profit"] = None
155
+
156
+ # set to None if stop_loss (nullable) is None
157
+ # and model_fields_set contains the field
158
+ if self.stop_loss is None and "stop_loss" in self.model_fields_set:
159
+ _dict["stop_loss"] = None
160
+
161
+ # set to None if expiry_timestamp (nullable) is None
162
+ # and model_fields_set contains the field
163
+ if (
164
+ self.expiry_timestamp is None
165
+ and "expiry_timestamp" in self.model_fields_set
166
+ ):
167
+ _dict["expiry_timestamp"] = None
168
+
169
+ return _dict
170
+
171
+ @classmethod
172
+ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
173
+ """Create an instance of SpotTradingAction from a dict"""
174
+ if obj is None:
175
+ return None
176
+
177
+ if not isinstance(obj, dict):
178
+ return cls.model_validate(obj)
179
+
180
+ _obj = cls.model_validate(
181
+ {
182
+ "created_at": obj.get("created_at"),
183
+ "updated_at": obj.get("updated_at"),
184
+ "id": obj.get("id"),
185
+ "execution_id": obj.get("execution_id"),
186
+ "open_order_execution_id": obj.get("open_order_execution_id"),
187
+ "action_type": obj.get("action_type"),
188
+ "market_type": obj.get("market_type"),
189
+ "strategy_id": obj.get("strategy_id"),
190
+ "symbol": obj.get("symbol"),
191
+ "is_limit": obj.get("is_limit"),
192
+ "limit_price": obj.get("limit_price"),
193
+ "allocation": obj.get("allocation"),
194
+ "take_profit": (
195
+ [TPSL.from_dict(_item) for _item in obj["take_profit"]]
196
+ if obj.get("take_profit") is not None
197
+ else None
198
+ ),
199
+ "stop_loss": (
200
+ [TPSL.from_dict(_item) for _item in obj["stop_loss"]]
201
+ if obj.get("stop_loss") is not None
202
+ else None
203
+ ),
204
+ "expiry_timestamp": obj.get("expiry_timestamp"),
205
+ }
206
+ )
207
+ return _obj
@@ -61,6 +61,7 @@ class Strategy(BaseModel):
61
61
  description="Leverage for the strategy"
62
62
  )
63
63
  market_type: MarketType = Field(description="Market of operation of the strategy")
64
+ additional_properties: Dict[str, Any] = {}
64
65
  __properties: ClassVar[List[str]] = [
65
66
  "created_at",
66
67
  "updated_at",
@@ -105,8 +106,13 @@ class Strategy(BaseModel):
105
106
  * `None` is only added to the output dict for nullable fields that
106
107
  were set at model initialization. Other fields with value `None`
107
108
  are ignored.
109
+ * Fields in `self.additional_properties` are added to the output dict.
108
110
  """
109
- excluded_fields: Set[str] = set([])
111
+ excluded_fields: Set[str] = set(
112
+ [
113
+ "additional_properties",
114
+ ]
115
+ )
110
116
 
111
117
  _dict = self.model_dump(
112
118
  by_alias=True,
@@ -120,6 +126,11 @@ class Strategy(BaseModel):
120
126
  if _item_exchanges:
121
127
  _items.append(_item_exchanges.to_dict())
122
128
  _dict["exchanges"] = _items
129
+ # puts key-value pairs in additional_properties in the top level
130
+ if self.additional_properties is not None:
131
+ for _key, _value in self.additional_properties.items():
132
+ _dict[_key] = _value
133
+
123
134
  # set to None if margin_mode (nullable) is None
124
135
  # and model_fields_set contains the field
125
136
  if self.margin_mode is None and "margin_mode" in self.model_fields_set:
@@ -159,4 +170,9 @@ class Strategy(BaseModel):
159
170
  "market_type": obj.get("market_type"),
160
171
  }
161
172
  )
173
+ # store additional fields in additional_properties
174
+ for _key in obj.keys():
175
+ if _key not in cls.__properties:
176
+ _obj.additional_properties[_key] = obj.get(_key)
177
+
162
178
  return _obj
@@ -52,6 +52,7 @@ class StrategyCreate(BaseModel):
52
52
  description="Leverage for the strategy"
53
53
  )
54
54
  market_type: MarketType = Field(description="Market of operation of the strategy")
55
+ additional_properties: Dict[str, Any] = {}
55
56
  __properties: ClassVar[List[str]] = [
56
57
  "name",
57
58
  "description",
@@ -93,8 +94,13 @@ class StrategyCreate(BaseModel):
93
94
  * `None` is only added to the output dict for nullable fields that
94
95
  were set at model initialization. Other fields with value `None`
95
96
  are ignored.
97
+ * Fields in `self.additional_properties` are added to the output dict.
96
98
  """
97
- excluded_fields: Set[str] = set([])
99
+ excluded_fields: Set[str] = set(
100
+ [
101
+ "additional_properties",
102
+ ]
103
+ )
98
104
 
99
105
  _dict = self.model_dump(
100
106
  by_alias=True,
@@ -108,6 +114,11 @@ class StrategyCreate(BaseModel):
108
114
  if _item_exchanges:
109
115
  _items.append(_item_exchanges.to_dict())
110
116
  _dict["exchanges"] = _items
117
+ # puts key-value pairs in additional_properties in the top level
118
+ if self.additional_properties is not None:
119
+ for _key, _value in self.additional_properties.items():
120
+ _dict[_key] = _value
121
+
111
122
  # set to None if margin_mode (nullable) is None
112
123
  # and model_fields_set contains the field
113
124
  if self.margin_mode is None and "margin_mode" in self.model_fields_set:
@@ -144,4 +155,9 @@ class StrategyCreate(BaseModel):
144
155
  "market_type": obj.get("market_type"),
145
156
  }
146
157
  )
158
+ # store additional fields in additional_properties
159
+ for _key in obj.keys():
160
+ if _key not in cls.__properties:
161
+ _obj.additional_properties[_key] = obj.get(_key)
162
+
147
163
  return _obj
@@ -40,6 +40,7 @@ class StrategyUpdate(BaseModel):
40
40
  Annotated[int, Field(le=1, strict=True, ge=0)],
41
41
  ]
42
42
  ] = None
43
+ additional_properties: Dict[str, Any] = {}
43
44
  __properties: ClassVar[List[str]] = [
44
45
  "name",
45
46
  "description",
@@ -77,8 +78,13 @@ class StrategyUpdate(BaseModel):
77
78
  * `None` is only added to the output dict for nullable fields that
78
79
  were set at model initialization. Other fields with value `None`
79
80
  are ignored.
81
+ * Fields in `self.additional_properties` are added to the output dict.
80
82
  """
81
- excluded_fields: Set[str] = set([])
83
+ excluded_fields: Set[str] = set(
84
+ [
85
+ "additional_properties",
86
+ ]
87
+ )
82
88
 
83
89
  _dict = self.model_dump(
84
90
  by_alias=True,
@@ -92,6 +98,11 @@ class StrategyUpdate(BaseModel):
92
98
  if _item_exchanges:
93
99
  _items.append(_item_exchanges.to_dict())
94
100
  _dict["exchanges"] = _items
101
+ # puts key-value pairs in additional_properties in the top level
102
+ if self.additional_properties is not None:
103
+ for _key, _value in self.additional_properties.items():
104
+ _dict[_key] = _value
105
+
95
106
  # set to None if name (nullable) is None
96
107
  # and model_fields_set contains the field
97
108
  if self.name is None and "name" in self.model_fields_set:
@@ -144,4 +155,9 @@ class StrategyUpdate(BaseModel):
144
155
  "performance_fee": obj.get("performance_fee"),
145
156
  }
146
157
  )
158
+ # store additional fields in additional_properties
159
+ for _key in obj.keys():
160
+ if _key not in cls.__properties:
161
+ _obj.additional_properties[_key] = obj.get(_key)
162
+
147
163
  return _obj
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crypticorn
3
- Version: 2.17.0rc4
3
+ Version: 2.17.0rc6
4
4
  Summary: Maximise Your Crypto Trading Profits with Machine Learning
5
5
  Author-email: Crypticorn <timon@crypticorn.com>
6
6
  License-Expression: MIT
@@ -272,6 +272,8 @@ async def main():
272
272
  ```
273
273
  If you don’t pass a session, `AsyncClient` will create and manage one internally. In that case, it will be automatically closed when using `async with` or when calling `await client.close()` manually.
274
274
 
275
+ **Note on Sync Client**: The `SyncClient` uses per-operation sessions (creates and closes a session for each API call) to ensure reliable synchronous behavior. Custom sessions are accepted but not used. This approach prevents event loop conflicts at the cost of slightly higher overhead per operation.
276
+
275
277
  ### Disable Logging
276
278
 
277
279
  In case you don't want any logging statements by the `crypticorn` logger to be logged to stdout, you can disable it with:
@@ -280,5 +282,3 @@ In case you don't want any logging statements by the `crypticorn` logger to be l
280
282
  from crypticorn.common import disable_logging
281
283
  disable_logging()
282
284
  ```
283
-
284
- **Note on Sync Client**: The `SyncClient` uses per-operation sessions (creates and closes a session for each API call) to ensure reliable synchronous behavior. Custom sessions are accepted but not used. This approach prevents event loop conflicts at the cost of slightly higher overhead per operation.