degiroasync.core’s documentation
Contains core data structures and helpers for degiroasync.
- Key structures that are reused regularly through degiroasync API the below:
Credentials
SessionCore
ORDER
PRODUCT
TRANSACTION
POSITION
ResponseError
Check out their respective documentation for more details.
- exception degiroasync.core.BadCredentialsError
Error raised when web API returns a badCredentials error. This is a specialized class of ReponseError.
- class degiroasync.core.Config
- exception degiroasync.core.ContextError
Raised when unexpected or incorrect context is detected.
Example: when some required Session attributes are missing.
- class degiroasync.core.Credentials(username: str, password: str, totp_secret: str | None = None, one_time_password: str | None = None)
Holds credentials for Web API.
If 2FA is enabled on the account, either totp_secret or one_time_password must be provided for the login to be successful.
totp_secret can be obtained in a 2FA editor/app (e.g. andOTP) in the ‘Secret’ field.
If use of one_time_password is chosen instead, be mindful that login must be called promptly as one_time_password expires frequently.
- class degiroasync.core.ORDER
Constants for orders in web API.
- class ACTION(value)
- BUY
Use when placing a _BUY_ order on a product.
- SELL:
Use when placing a _SELL_ order on a product.
Check ORDER.TYPE for types of orders.
For use with checkOrder HTTP endpoint - or check_order degiroasync API calls.
- class STATUS(value)
- CONFIRMED
The order was accepted by the platform.
- REJECTED
The order was not accepted by the platform.
- PENDING
The order is ‘PENDING’ on the web trader.
- class TIME(value)
- DAY
This is the “Day” option in the web trader. Order placed for one day only: it expires at the end of the day it was created.
- PERMANENT
This is the “GTC” option in the web trader. This order sticks until it has been executed. Be careful that occasionally Degiro cancels Permanent orders due to various events.
- class TYPE(value)
- LIMITED
This is the “Limit” field value of “Order type” in the web trader.
- MARKET
This is the “Market” field value of “Order type” in the web trader.
- STOP_LOSS
This is the “Stop Loss” field value of “Order type” in the web trader.
- STOP_LIMITED
This is the “Stop Limited” field value of “Order type” in the web trader.
- AMOUNT
This is the “Amount” field value of “Order type” in the web trader. It’s used for investment funds.
- class degiroasync.core.PAClient
- exception degiroasync.core.ResponseError
Raised when bad response has been received from server.
- class degiroasync.core.SessionCore(config: 'Optional[Config]' = None, client: 'Optional[PAClient]' = None, _max_requests_default: 'int' = 40, _period_seconds_default: 'int' = 1, _cookies: 'Optional[httpx.Cookies]' = None, _http_client: 'Optional[ThrottlingClient]' = None)
- update_throttling(max_requests: int = 20, period_seconds: float = 1)
Update throttling parameters. No limit if max_requests <= 0.
Note: going over 40 requests per second seems to trigger API bans.
- Parameters:
max_requests – Maximum number of requests per period_seconds before throttling. If <= 0, no limit.
period_seconds – Period on which to count requests.
- degiroasync.core.camelcase_dict_to_snake(dict_in: Dict[str, Any], /, recursive: bool = True) Dict[str, Any]
Convert keys of dictionary with str keys from camelCase to snake_case.
This does not care for structures with depth: values dictionaries will not be updated to snake_case.
>>> d = {'fooBar': 2, 'camelCase': {'camelCase': 1}} >>> camelcase_dict_to_snake(d) {'foo_bar': 2, 'camel_case': {'camel_case': 1}} >>> camelcase_dict_to_snake(d, recursive=False) {'foo_bar': 2, 'camel_case': {'camelCase': 1}}
- degiroasync.core.camelcase_to_snake(text: str) str
Convert a camelCase text to snake_case.
This helper replace any capitalized character by its lowered version preceded by ‘_’.
This helper does not check that input text is camel case or not.
>>> s = 'iAmCamelCase' >>> camelcase_to_snake(s) 'i_am_camel_case' >>> # Ignore fully uppercase text. >>> camelcase_to_snake("ALL_CAPS") 'ALL_CAPS'
- degiroasync.core.check_session_client(session: SessionCore) CustomJSONWrapper
Raise an exception if session.client is not set
- degiroasync.core.check_session_config(session: SessionCore) CustomJSONWrapper
Raise an exception if session.config is not set
- degiroasync.core.join_url(*sections)
Helper to build urls, with slightly different behavior from urllib.parse.urljoin, see example below.
>>> join_url('https://foo.bar', '/rest/of/url') 'https://foo.bar/rest/of/url' >>> join_url('https://foo.bar/product', '/rest/of/url') 'https://foo.bar/product/rest/of/url' >>> join_url('https://foo.bar/product/', '/rest/of/url') 'https://foo.bar/product/rest/of/url' >>> # We need this helper because of below ... # urllib.parse.urljoin behavior that is not suitable ... # for our purpose. >>> import urllib.parse >>> urllib.parse.urljoin('https://foo.bar/product', '/rest//of/url') 'https://foo.bar/rest/of/url'
- degiroasync.core.lru_cache_timed(func: Callable | None = None, /, maxsize: int = 128, typed: bool = False, seconds: float | None = None)
Time-sensitive LRU cache that works with async functions.
>>> @lru_cache_timed(seconds=120) ... async def foo(): ... asyncio.sleep(1) ... return 1 ... >>> import time >>> start = time.time() >>> await foo() 1 >>> time.time() - start > 1 True >>> start = time.time() >>> await foo() 1 >>> time.time() - start < .1 True
- degiroasync.core.set_params(obj: Any, attributes_list: Iterable[Dict[str, str]], ignore_error=False) Any
This is a helper to translate Degiro-format params to a Python object.
Set params on obj.
params is expected to be an iterable of dict with ‘isAdded’, ‘name’, ‘value’. See below for an example.
- ```
- [
- {‘isAdded’: True,
‘name’: ‘id’, ‘value’: ‘8614787’},
- {‘isAdded’: True,
‘name’: ‘positionType’, ‘value’: ‘PRODUCT’},
- {‘isAdded’: True,
‘name’: ‘size’, ‘value’: 100},
- {‘isAdded’: True,
‘name’: ‘price’, ‘value’: 73.0},
- {‘isAdded’: True,
‘name’: ‘value’, ‘value’: 7300.0},
- {‘isAdded’: True,
‘name’: ‘accruedInterest’},
- {‘isAdded’: True,
‘name’: ‘plBase’, ‘value’: {‘EUR’: -6717.901595272}},
- {‘isAdded’: True,
‘name’: ‘todayPlBase’, ‘value’: {‘EUR’: -7300.0}},
- {‘isAdded’: True,
‘name’: ‘portfolioValueCorrection’, ‘value’: 0},
- {‘isAdded’: True,
‘name’: ‘breakEvenPrice’, ‘value’: 68.01},
- {‘isAdded’: True,
‘name’: ‘averageFxRate’, ‘value’: 1},
- {‘isAdded’: True,
‘name’: ‘realizedProductPl’, ‘value’: 97.098302728},
- {‘isAdded’: True,
‘name’: ‘realizedFxPl’, ‘value’: 0},
- {‘isAdded’: True,
‘name’: ‘todayRealizedProductPl’, ‘value’: 0.0},
- {‘isAdded’: True,
‘name’: ‘todayRealizedFxPl’, ‘value’: 0}
]