from __future__ import annotations
from pydantic import BaseModel, Field
[docs]
class InstrumentSearchParams(BaseModel):
fields: str | None = None
search_text: str | None = None
internal_symbol_full: str | None = None
page_size: int | None = None
page_number: int | None = None
sort: str | None = None
[docs]
class InstrumentSearchItem(BaseModel):
"""A single item from the ``/market-data/search`` endpoint.
The search API reliably returns ``instrument_id`` and
``internal_symbol_full``. Most other fields (``displayname``,
``exchange_id``, ``symbol``, etc.) are **not populated** by the API
and will keep their default values. Use
:class:`InstrumentDisplayData` (via ``get_instruments()``) for full
display metadata.
"""
model_config = {"extra": "allow"}
instrument_id: int = Field(alias="instrumentId")
symbol: str = ""
displayname: str = ""
instrument_type_id: int = Field(0, alias="instrumentTypeID")
exchange_id: int = Field(0, alias="exchangeID")
is_open: bool = Field(False, alias="isOpen")
is_currently_tradable: bool = Field(False, alias="isCurrentlyTradable")
is_buy_enabled: bool = Field(False, alias="isBuyEnabled")
is_delisted: bool = Field(False, alias="isDelisted")
is_exchange_open: bool = Field(False, alias="isExchangeOpen")
current_rate: float = Field(0.0, alias="currentRate")
daily_price_change: float = Field(0.0, alias="dailyPriceChange")
abs_daily_price_change: float = Field(0.0, alias="absDailyPriceChange")
weekly_price_change: float = Field(0.0, alias="weeklyPriceChange")
monthly_price_change: float = Field(0.0, alias="monthlyPriceChange")
three_month_price_change: float = Field(0.0, alias="threeMonthPriceChange")
six_month_price_change: float = Field(0.0, alias="sixMonthPriceChange")
one_year_price_change: float = Field(0.0, alias="oneYearPriceChange")
internal_asset_class_id: int = Field(0, alias="internalAssetClassId")
internal_asset_class_name: str = Field("", alias="internalAssetClassName")
logo_35x35: str = Field("", alias="logo35x35")
logo_50x50: str = Field("", alias="logo50x50")
internal_symbol_full: str = Field("", alias="internalSymbolFull")
logo_150x150: str = Field("", alias="logo150x150")
[docs]
class InstrumentSearchResponse(BaseModel):
items: list[InstrumentSearchItem] = []
page: int = 0
page_size: int = Field(0, alias="pageSize")
total_items: int = Field(0, alias="totalItems")
[docs]
class InstrumentImage(BaseModel):
instrument_id: int = Field(alias="instrumentID")
width: int | None = None
height: int | None = None
uri: str | None = None
background_color: str | None = Field(None, alias="backgroundColor")
text_color: str | None = Field(None, alias="textColor")
[docs]
class InstrumentDisplayData(BaseModel):
model_config = {"extra": "allow"}
instrument_id: int = Field(alias="instrumentID")
instrument_display_name: str = Field(alias="instrumentDisplayName")
instrument_type_id: int = Field(alias="instrumentTypeID")
exchange_id: int = Field(alias="exchangeID")
symbol_full: str = Field(alias="symbolFull")
instrument_type_sub_category_id: int | None = Field(None, alias="instrumentTypeSubCategoryID")
price_source: str = Field("", alias="priceSource")
has_expiration_date: bool = Field(False, alias="hasExpirationDate")
is_internal_instrument: bool = Field(False, alias="isInternalInstrument")
images: list[InstrumentImage] = []
[docs]
class InstrumentsResponse(BaseModel):
instrument_display_datas: list[InstrumentDisplayData] = Field(default_factory=list, alias="instrumentDisplayDatas")
[docs]
class GetInstrumentsParams(BaseModel):
instrument_ids: list[int] | None = None
exchange_ids: list[int] | None = None
stocks_industry_ids: list[int] | None = None
instrument_type_ids: list[int] | None = None
[docs]
class InstrumentRate(BaseModel):
model_config = {"extra": "allow"}
instrument_id: int = Field(alias="instrumentID")
ask: float
bid: float
last_execution: float = Field(0.0, alias="lastExecution")
conversion_rate_ask: float = Field(0.0, alias="conversionRateAsk")
conversion_rate_bid: float = Field(0.0, alias="conversionRateBid")
date: str = ""
unit_margin: float = Field(0.0, alias="unitMargin")
unit_margin_ask: float = Field(0.0, alias="unitMarginAsk")
unit_margin_bid: float = Field(0.0, alias="unitMarginBid")
price_rate_id: int = Field(0, alias="priceRateID")
bid_discounted: float = Field(0.0, alias="bidDiscounted")
ask_discounted: float = Field(0.0, alias="askDiscounted")
unit_margin_bid_discounted: float = Field(0.0, alias="unitMarginBidDiscounted")
unit_margin_ask_discounted: float = Field(0.0, alias="unitMarginAskDiscounted")
[docs]
class LiveRatesResponse(BaseModel):
rates: list[InstrumentRate] = []
[docs]
class Candle(BaseModel):
instrument_id: int = Field(alias="instrumentID")
from_date: str = Field(alias="fromDate")
open: float
high: float
low: float
close: float
volume: float | None = 0.0
[docs]
class CandleGroup(BaseModel):
instrument_id: int = Field(alias="instrumentId")
candles: list[Candle] = []
range_open: float = Field(0.0, alias="rangeOpen")
range_close: float = Field(0.0, alias="rangeClose")
range_high: float = Field(0.0, alias="rangeHigh")
range_low: float = Field(0.0, alias="rangeLow")
volume: float | None = 0.0
[docs]
class CandlesResponse(BaseModel):
interval: str = ""
candles: list[CandleGroup] = []
[docs]
class Exchange(BaseModel):
model_config = {"extra": "allow"}
exchange_id: int = Field(alias="exchangeID")
exchange_description: str = Field("", alias="exchangeDescription")
[docs]
class ExchangesResponse(BaseModel):
exchange_info: list[Exchange] = Field(default_factory=list, alias="exchangeInfo")
[docs]
class InstrumentType(BaseModel):
model_config = {"extra": "allow"}
instrument_type_id: int = Field(alias="instrumentTypeID")
instrument_type_description: str = Field("", alias="instrumentTypeDescription")
[docs]
class InstrumentTypesResponse(BaseModel):
instrument_types: list[InstrumentType] = Field(default_factory=list, alias="instrumentTypes")
[docs]
class StocksIndustry(BaseModel):
model_config = {"extra": "allow"}
stocks_industry_id: int = Field(alias="industryID")
name: str = Field("", alias="industryName")
[docs]
class StocksIndustriesResponse(BaseModel):
stocks_industries: list[StocksIndustry] = Field(default_factory=list, alias="stocksIndustries")
[docs]
class ClosingPriceInterval(BaseModel):
price: float
date: str = ""
[docs]
class ClosingPriceIntervals(BaseModel):
daily: ClosingPriceInterval
weekly: ClosingPriceInterval
monthly: ClosingPriceInterval
[docs]
class ClosingPrice(BaseModel):
model_config = {"extra": "allow"}
instrument_id: int = Field(alias="instrumentId")
official_closing_price: float = Field(alias="officialClosingPrice")
is_market_open: bool = Field(False, alias="isMarketOpen")
closing_prices: ClosingPriceIntervals = Field(alias="closingPrices")
[docs]
class ClosingPricesResponse(BaseModel):
closing_prices: list[ClosingPrice] = Field(default_factory=list)