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.
- crypticorn/auth/client/api/admin_api.py +6 -26
- crypticorn/auth/client/api/auth_api.py +36 -148
- crypticorn/auth/client/api/service_api.py +3 -16
- crypticorn/auth/client/api/user_api.py +33 -136
- crypticorn/auth/client/api/wallet_api.py +18 -76
- crypticorn/auth/client/api_client.py +0 -5
- crypticorn/auth/client/models/add_wallet_request.py +1 -1
- crypticorn/auth/client/models/authorize_user_request.py +1 -1
- crypticorn/auth/client/models/create_api_key_request.py +1 -1
- crypticorn/auth/client/models/create_user_request.py +1 -1
- crypticorn/auth/client/models/get_api_keys200_response_inner.py +1 -1
- crypticorn/auth/client/models/list_wallets200_response_balances_inner_sale_round.py +1 -1
- crypticorn/auth/client/models/list_wallets200_response_balances_inner_wallet.py +1 -1
- crypticorn/auth/client/models/list_wallets200_response_balances_inner_wallet_vesting_wallets_inner.py +1 -1
- crypticorn/auth/client/models/list_wallets200_response_data_inner.py +1 -1
- crypticorn/auth/client/models/logout_default_response.py +1 -1
- crypticorn/auth/client/models/oauth_callback200_response_user.py +1 -1
- crypticorn/auth/client/models/refresh_token_info200_response_user_session.py +1 -1
- crypticorn/auth/client/models/rotate_tokens200_response.py +1 -1
- crypticorn/auth/client/models/token_info200_response.py +1 -1
- crypticorn/auth/client/models/update_user_request.py +1 -1
- crypticorn/auth/client/models/user_by_username200_response.py +1 -1
- crypticorn/auth/client/models/verify200_response.py +1 -1
- crypticorn/auth/client/models/verify_email200_response_auth.py +1 -1
- crypticorn/auth/client/models/verify_email200_response_auth_auth.py +1 -1
- crypticorn/auth/client/models/whoami200_response.py +1 -1
- crypticorn/cli/init.py +1 -1
- crypticorn/cli/templates/.env.docker.temp +3 -0
- crypticorn/cli/templates/.env.example.temp +4 -0
- crypticorn/cli/templates/Dockerfile +5 -2
- crypticorn/client.py +0 -1
- crypticorn/common/auth.py +31 -4
- crypticorn/common/decorators.py +1 -2
- crypticorn/common/enums.py +0 -2
- crypticorn/common/errors.py +10 -0
- crypticorn/common/metrics.py +1 -1
- crypticorn/common/middleware.py +0 -1
- crypticorn/common/pagination.py +116 -24
- crypticorn/common/router/admin_router.py +1 -11
- crypticorn/common/router/status_router.py +33 -2
- crypticorn/common/scopes.py +2 -2
- crypticorn/common/utils.py +1 -2
- crypticorn/dex/__init__.py +6 -0
- crypticorn/dex/client/__init__.py +49 -0
- crypticorn/dex/client/api/__init__.py +6 -0
- crypticorn/dex/client/api/admin_api.py +2983 -0
- crypticorn/dex/client/api/signals_api.py +1794 -0
- crypticorn/dex/client/api/status_api.py +889 -0
- crypticorn/dex/client/api_client.py +753 -0
- crypticorn/dex/client/api_response.py +20 -0
- crypticorn/dex/client/configuration.py +620 -0
- crypticorn/dex/client/exceptions.py +220 -0
- crypticorn/dex/client/models/__init__.py +30 -0
- crypticorn/dex/client/models/api_error_identifier.py +121 -0
- crypticorn/dex/client/models/api_error_level.py +37 -0
- crypticorn/dex/client/models/api_error_type.py +37 -0
- crypticorn/dex/client/models/exception_detail.py +117 -0
- crypticorn/dex/client/models/log_level.py +38 -0
- crypticorn/dex/client/models/paginated_response_signal_with_token.py +134 -0
- crypticorn/dex/client/models/risk.py +86 -0
- crypticorn/dex/client/models/signal_overview_stats.py +156 -0
- crypticorn/dex/client/models/signal_volume.py +84 -0
- crypticorn/dex/client/models/signal_with_token.py +163 -0
- crypticorn/dex/client/models/token_data.py +127 -0
- crypticorn/dex/client/models/token_detail.py +116 -0
- crypticorn/dex/client/py.typed +0 -0
- crypticorn/dex/client/rest.py +217 -0
- crypticorn/dex/main.py +1 -0
- crypticorn/hive/client/api/admin_api.py +18 -75
- crypticorn/hive/client/api/data_api.py +6 -28
- crypticorn/hive/client/api/models_api.py +22 -88
- crypticorn/hive/client/api/status_api.py +6 -27
- crypticorn/hive/client/api_client.py +0 -5
- crypticorn/hive/client/models/coin_info.py +1 -1
- crypticorn/hive/client/models/exception_detail.py +1 -1
- crypticorn/hive/client/models/target_info.py +1 -1
- crypticorn/hive/utils.py +2 -2
- crypticorn/klines/client/api/admin_api.py +18 -75
- crypticorn/klines/client/api/change_in_timeframe_api.py +3 -16
- crypticorn/klines/client/api/funding_rates_api.py +3 -16
- crypticorn/klines/client/api/ohlcv_data_api.py +3 -16
- crypticorn/klines/client/api/status_api.py +6 -27
- crypticorn/klines/client/api/symbols_api.py +3 -16
- crypticorn/klines/client/api/udf_api.py +18 -74
- crypticorn/klines/client/api_client.py +0 -5
- crypticorn/klines/client/models/exception_detail.py +1 -1
- crypticorn/klines/client/models/ohlcv.py +1 -1
- crypticorn/klines/client/models/symbol_group.py +1 -1
- crypticorn/klines/client/models/udf_config.py +1 -1
- crypticorn/metrics/client/api/admin_api.py +18 -75
- crypticorn/metrics/client/api/exchanges_api.py +12 -52
- crypticorn/metrics/client/api/indicators_api.py +6 -28
- crypticorn/metrics/client/api/logs_api.py +3 -16
- crypticorn/metrics/client/api/marketcap_api.py +12 -52
- crypticorn/metrics/client/api/markets_api.py +3 -16
- crypticorn/metrics/client/api/quote_currencies_api.py +3 -16
- crypticorn/metrics/client/api/status_api.py +6 -27
- crypticorn/metrics/client/api/tokens_api.py +6 -26
- crypticorn/metrics/client/api_client.py +0 -5
- crypticorn/metrics/client/models/exception_detail.py +1 -1
- crypticorn/metrics/client/models/exchange_mapping.py +1 -1
- crypticorn/metrics/client/models/marketcap_ranking.py +1 -1
- crypticorn/metrics/client/models/marketcap_symbol_ranking.py +1 -1
- crypticorn/metrics/client/models/ohlcv.py +1 -1
- crypticorn/pay/client/api/admin_api.py +21 -87
- crypticorn/pay/client/api/now_payments_api.py +15 -64
- crypticorn/pay/client/api/payments_api.py +6 -28
- crypticorn/pay/client/api/products_api.py +12 -52
- crypticorn/pay/client/api/status_api.py +6 -27
- crypticorn/pay/client/api_client.py +0 -5
- crypticorn/pay/client/models/exception_detail.py +1 -1
- crypticorn/pay/client/models/now_create_invoice_req.py +1 -1
- crypticorn/pay/client/models/now_create_invoice_res.py +1 -1
- crypticorn/pay/client/models/product.py +1 -1
- crypticorn/pay/client/models/product_create.py +1 -1
- crypticorn/pay/client/models/product_update.py +1 -1
- crypticorn/trade/client/__init__.py +15 -0
- crypticorn/trade/client/api/admin_api.py +43 -107
- crypticorn/trade/client/api/api_keys_api.py +207 -184
- crypticorn/trade/client/api/bots_api.py +6557 -240
- crypticorn/trade/client/api/exchanges_api.py +9 -36
- crypticorn/trade/client/api/notifications_api.py +18 -72
- crypticorn/trade/client/api/orders_api.py +220 -115
- crypticorn/trade/client/api/status_api.py +6 -24
- crypticorn/trade/client/api/strategies_api.py +15 -60
- crypticorn/trade/client/api/trading_actions_api.py +431 -112
- crypticorn/trade/client/models/__init__.py +15 -0
- crypticorn/trade/client/models/bot.py +7 -18
- crypticorn/trade/client/models/bot_create.py +17 -1
- crypticorn/trade/client/models/bot_update.py +17 -1
- crypticorn/trade/client/models/exchange_key_create.py +17 -1
- crypticorn/trade/client/models/exchange_key_update.py +17 -1
- crypticorn/trade/client/models/notification.py +17 -1
- crypticorn/trade/client/models/notification_create.py +17 -1
- crypticorn/trade/client/models/notification_update.py +17 -1
- crypticorn/trade/client/models/orders_count.py +88 -0
- crypticorn/trade/client/models/paginated_response_futures_trading_action.py +134 -0
- crypticorn/trade/client/models/paginated_response_order.py +134 -0
- crypticorn/trade/client/models/paginated_response_union_futures_trading_action_spot_trading_action.py +141 -0
- crypticorn/trade/client/models/paginated_response_union_futures_trading_action_spot_trading_action_data_inner.py +165 -0
- crypticorn/trade/client/models/pn_l.py +95 -0
- crypticorn/trade/client/models/spot_trading_action.py +207 -0
- crypticorn/trade/client/models/strategy.py +17 -1
- crypticorn/trade/client/models/strategy_create.py +17 -1
- crypticorn/trade/client/models/strategy_update.py +17 -1
- {crypticorn-2.17.0rc4.dist-info → crypticorn-2.17.0rc6.dist-info}/METADATA +3 -3
- {crypticorn-2.17.0rc4.dist-info → crypticorn-2.17.0rc6.dist-info}/RECORD +151 -116
- {crypticorn-2.17.0rc4.dist-info → crypticorn-2.17.0rc6.dist-info}/WHEEL +0 -0
- {crypticorn-2.17.0rc4.dist-info → crypticorn-2.17.0rc6.dist-info}/entry_points.txt +0 -0
- {crypticorn-2.17.0rc4.dist-info → crypticorn-2.17.0rc6.dist-info}/licenses/LICENSE +0 -0
- {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.
|
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.
|