use crate::ids::{InstrumentId, IssuerId, MarketId, TickSizeId};
use crate::models::shared::opt_arb_prec;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct FilterVal {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub count: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct FilterDetails {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub attribute: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent_filters: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub requires_expand: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub values: Option<Vec<FilterVal>>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct AttributeResult {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub filter_details: Option<FilterDetails>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub filterable: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub max: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub min: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub returnable: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sortable: Option<bool>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct AttributeResults {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub attributes: Option<Vec<AttributeResult>>,
pub attributes_count: i64,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct ExchangeInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exchange_country: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct MarketInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub identifier: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_id: Option<MarketId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_sub_id: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tick_size_id: Option<TickSizeId>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct InstrumentInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub clearing_place: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_group_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_id: Option<InstrumentId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_pawn_percentage: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_type_hierarchy: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub is_monthly_saveable: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub is_shortable: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub is_tradable: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub isin: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issuer_id: Option<IssuerId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issuer_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub long_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price_unit: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub symbol: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct PriceWithDecimals {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub decimals: Option<i32>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub price: Option<Decimal>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct DiffWithDecimals {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub decimals: Option<i32>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub diff: Option<Decimal>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct PriceInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ask: Option<PriceWithDecimals>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ask_volume: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bid: Option<PriceWithDecimals>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bid_volume: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub close: Option<PriceWithDecimals>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub diff: Option<DiffWithDecimals>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub diff_pct: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub high: Option<PriceWithDecimals>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last: Option<PriceWithDecimals>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub low: Option<PriceWithDecimals>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub open: Option<PriceWithDecimals>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub realtime: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub spread: Option<PriceWithDecimals>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub spread_pct: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tick_timestamp: Option<i64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub turnover: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub turnover_volume: Option<i64>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct CompanyInfo {
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub dividend_amount: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dividend_bonus_frequency: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dividend_currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dividend_date: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dividend_frequency: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub excluding_date: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub general_meeting_date: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub report_date: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub report_description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub report_type: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct HistoricalReturnsInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub realtime: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub yield_10y: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub yield_1m: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub yield_1w: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub yield_1y: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub yield_3m: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub yield_3y: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub yield_5y: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub yield_ytd: Option<Decimal>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct KeyRatiosInfo {
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub dividend_per_share: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub dividend_yield: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub eps: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub pb: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub pe: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub ps: Option<Decimal>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct StatisticalInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub number_of_owners: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub statistics_timestamp: Option<i64>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct Stocklist {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub company_info: Option<CompanyInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exchange_info: Option<ExchangeInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub historical_returns_info: Option<HistoricalReturnsInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_info: Option<InstrumentInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub key_ratios_info: Option<KeyRatiosInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_info: Option<MarketInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price_info: Option<PriceInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub statistical_info: Option<StatisticalInfo>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct StocklistResults {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub results: Option<Vec<Stocklist>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rows: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_hits: Option<i64>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct CertificateInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub static_high_risk: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub static_leverage: Option<Decimal>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct EtpInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub direction: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub first_trading_date: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_view: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub nordnet_markets: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub underlying_instrument_id: Option<InstrumentId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub underlying_name: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct KoCalcInfo {
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub ko_calc_conversion_ratio: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ko_calc_underlying_currency: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ko_calc_underlying_identifier: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ko_calc_underlying_market_id: Option<MarketId>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct KoInfo {
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub financial_level: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub stop_loss: Option<Decimal>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct PriceKoInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub indicative_high_risk: Option<bool>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub indicative_leverage: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub risk_buffer: Option<Decimal>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct BullBearEntity {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub certificate_info: Option<CertificateInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub etp_info: Option<EtpInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exchange_info: Option<ExchangeInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_info: Option<InstrumentInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_info: Option<MarketInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price_info: Option<PriceInfo>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct BullBearListResults {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub results: Option<Vec<BullBearEntity>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rows: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_hits: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub underlying_instrument_id: Option<InstrumentId>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct MinifutureEntity {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub etp_info: Option<EtpInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exchange_info: Option<ExchangeInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_info: Option<InstrumentInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ko_calc_info: Option<KoCalcInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ko_info: Option<KoInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_info: Option<MarketInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price_info: Option<PriceInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price_ko_info: Option<PriceKoInfo>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct MinifutureListResults {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub results: Option<Vec<MinifutureEntity>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rows: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_hits: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub underlying_instrument_id: Option<InstrumentId>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct UnlimitedTurboEntity {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub etp_info: Option<EtpInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exchange_info: Option<ExchangeInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_info: Option<InstrumentInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ko_calc_info: Option<KoCalcInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ko_info: Option<KoInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_info: Option<MarketInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price_info: Option<PriceInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price_ko_info: Option<PriceKoInfo>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct UnlimitedTurboListResults {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub results: Option<Vec<UnlimitedTurboEntity>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rows: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total_hits: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub underlying_instrument_id: Option<InstrumentId>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
pub struct DerivativeInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub contract_multiplier: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expire_date: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub start_date: Option<i64>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct OptionInfo {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exercise_type: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub risk_free_interest: Option<Decimal>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "opt_arb_prec"
)]
pub strike_price: Option<Decimal>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub underlying_instrument_id: Option<InstrumentId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub underlying_name: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct OptionlistEntity {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub derivative_info: Option<DerivativeInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exchange_info: Option<ExchangeInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instrument_info: Option<InstrumentInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub market_info: Option<MarketInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub option_info: Option<OptionInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub price_info: Option<PriceInfo>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct OptionlistPair {
pub call_option: OptionlistEntity,
pub put_option: OptionlistEntity,
#[serde(with = "rust_decimal::serde::arbitrary_precision")]
pub strike_price: Decimal,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
pub struct OptionListResults {
pub results: Vec<OptionlistPair>,
pub rows: i32,
pub total_hits: i64,
}