use crate::{
core::{
collateral::HasCurrency,
instrument::{AssetClass, Instrument},
trade::{Side, Trade},
},
currencies::currency::Currency,
indices::marketindex::MarketIndex,
time::{date::Date, daycounter::DayCounter},
};
#[derive(Clone)]
pub enum EuroOptionType {
Call,
Put,
}
#[derive(Clone)]
pub struct EquityEuropeanOption {
market_index: MarketIndex,
expiry_date: Date,
strike: f64,
option_type: EuroOptionType,
identifier: String,
day_counter: DayCounter,
currency: Currency,
}
pub struct EquityEuropeanOptionTrade {
instrument: EquityEuropeanOption,
notional: f64,
trade_date: Date,
side: Side,
}
impl EquityEuropeanOption {
#[must_use]
pub const fn new(
market_index: MarketIndex,
expiry_date: Date,
strike: f64,
option_type: EuroOptionType,
identifier: String,
) -> Self {
Self {
market_index,
expiry_date,
strike,
option_type,
identifier,
day_counter: DayCounter::Actual360,
currency: Currency::USD,
}
}
#[must_use]
pub const fn market_index(&self) -> &MarketIndex {
&self.market_index
}
#[must_use]
pub const fn expiry_date(&self) -> Date {
self.expiry_date
}
#[must_use]
pub const fn strike(&self) -> f64 {
self.strike
}
#[must_use]
pub const fn option_type(&self) -> &EuroOptionType {
&self.option_type
}
#[must_use]
pub const fn day_counter(&self) -> &DayCounter {
&self.day_counter
}
}
impl HasCurrency for EquityEuropeanOption {
fn currency(&self) -> Currency {
self.currency
}
}
impl EquityEuropeanOptionTrade {
#[must_use]
pub const fn new(
instrument: EquityEuropeanOption,
notional: f64,
trade_date: Date,
side: Side,
) -> Self {
Self {
instrument,
notional,
trade_date,
side,
}
}
#[must_use]
pub const fn notional(&self) -> f64 {
self.notional
}
}
impl Instrument for EquityEuropeanOption {
fn identifier(&self) -> String {
self.identifier.clone()
}
fn asset_class(&self) -> AssetClass {
AssetClass::Equity
}
}
impl Trade<EquityEuropeanOption> for EquityEuropeanOptionTrade {
fn instrument(&self) -> &EquityEuropeanOption {
&self.instrument
}
fn trade_date(&self) -> Date {
self.trade_date
}
fn side(&self) -> Side {
self.side
}
}