#[allow(unused_imports)]
use super::*;
#[allow(unused_imports)]
use crate::ids::*;
#[allow(unused_imports)]
use crate::timestamp::Timestamp;
#[allow(unused_imports)]
use rust_decimal::Decimal;
#[allow(unused_imports)]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Tag {
#[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
#[serde(rename = "name", default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum InstrumentType {
Currency,
Cfd,
Metal,
Unknown(String),
}
impl InstrumentType {
pub fn as_str(&self) -> &str {
match self {
Self::Currency => "CURRENCY",
Self::Cfd => "CFD",
Self::Metal => "METAL",
Self::Unknown(value) => value,
}
}
}
impl Serialize for InstrumentType {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for InstrumentType {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = String::deserialize(deserializer)?;
Ok(match value.as_str() {
"CURRENCY" => Self::Currency,
"CFD" => Self::Cfd,
"METAL" => Self::Metal,
_ => Self::Unknown(value),
})
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum DayOfWeek {
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Unknown(String),
}
impl DayOfWeek {
pub fn as_str(&self) -> &str {
match self {
Self::Sunday => "SUNDAY",
Self::Monday => "MONDAY",
Self::Tuesday => "TUESDAY",
Self::Wednesday => "WEDNESDAY",
Self::Thursday => "THURSDAY",
Self::Friday => "FRIDAY",
Self::Saturday => "SATURDAY",
Self::Unknown(value) => value,
}
}
}
impl Serialize for DayOfWeek {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for DayOfWeek {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = String::deserialize(deserializer)?;
Ok(match value.as_str() {
"SUNDAY" => Self::Sunday,
"MONDAY" => Self::Monday,
"TUESDAY" => Self::Tuesday,
"WEDNESDAY" => Self::Wednesday,
"THURSDAY" => Self::Thursday,
"FRIDAY" => Self::Friday,
"SATURDAY" => Self::Saturday,
_ => Self::Unknown(value),
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FinancingDayOfWeek {
#[serde(rename = "dayOfWeek", default, skip_serializing_if = "Option::is_none")]
pub day_of_week: Option<DayOfWeek>,
#[serde(
rename = "daysCharged",
default,
skip_serializing_if = "Option::is_none"
)]
pub days_charged: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InstrumentFinancing {
#[serde(rename = "longRate", default, skip_serializing_if = "Option::is_none")]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub long_rate: Option<Decimal>,
#[serde(rename = "shortRate", default, skip_serializing_if = "Option::is_none")]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub short_rate: Option<Decimal>,
#[serde(
rename = "financingDaysOfWeek",
default,
skip_serializing_if = "Option::is_none"
)]
pub financing_days_of_week: Option<Vec<FinancingDayOfWeek>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Instrument {
#[serde(rename = "name", default, skip_serializing_if = "Option::is_none")]
pub name: Option<InstrumentName>,
#[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
pub r#type: Option<InstrumentType>,
#[serde(
rename = "displayName",
default,
skip_serializing_if = "Option::is_none"
)]
pub display_name: Option<String>,
#[serde(
rename = "pipLocation",
default,
skip_serializing_if = "Option::is_none"
)]
pub pip_location: Option<i64>,
#[serde(
rename = "displayPrecision",
default,
skip_serializing_if = "Option::is_none"
)]
pub display_precision: Option<i64>,
#[serde(
rename = "tradeUnitsPrecision",
default,
skip_serializing_if = "Option::is_none"
)]
pub trade_units_precision: Option<i64>,
#[serde(
rename = "minimumTradeSize",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub minimum_trade_size: Option<Decimal>,
#[serde(
rename = "maximumTrailingStopDistance",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub maximum_trailing_stop_distance: Option<Decimal>,
#[serde(
rename = "minimumGuaranteedStopLossDistance",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub minimum_guaranteed_stop_loss_distance: Option<Decimal>,
#[serde(
rename = "minimumTrailingStopDistance",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub minimum_trailing_stop_distance: Option<Decimal>,
#[serde(
rename = "maximumPositionSize",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub maximum_position_size: Option<Decimal>,
#[serde(
rename = "maximumOrderUnits",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub maximum_order_units: Option<Decimal>,
#[serde(
rename = "marginRate",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub margin_rate: Option<Decimal>,
#[serde(
rename = "commission",
default,
skip_serializing_if = "Option::is_none"
)]
pub commission: Option<InstrumentCommission>,
#[serde(
rename = "guaranteedStopLossOrderMode",
default,
skip_serializing_if = "Option::is_none"
)]
pub guaranteed_stop_loss_order_mode: Option<GuaranteedStopLossOrderModeForInstrument>,
#[serde(
rename = "guaranteedStopLossOrderExecutionPremium",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub guaranteed_stop_loss_order_execution_premium: Option<Decimal>,
#[serde(
rename = "guaranteedStopLossOrderLevelRestriction",
default,
skip_serializing_if = "Option::is_none"
)]
pub guaranteed_stop_loss_order_level_restriction:
Option<GuaranteedStopLossOrderLevelRestriction>,
#[serde(rename = "financing", default, skip_serializing_if = "Option::is_none")]
pub financing: Option<InstrumentFinancing>,
#[serde(rename = "tags", default, skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<Tag>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum AcceptDatetimeFormat {
Unix,
Rfc3339,
Unknown(String),
}
impl AcceptDatetimeFormat {
pub fn as_str(&self) -> &str {
match self {
Self::Unix => "UNIX",
Self::Rfc3339 => "RFC3339",
Self::Unknown(value) => value,
}
}
}
impl Serialize for AcceptDatetimeFormat {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for AcceptDatetimeFormat {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = String::deserialize(deserializer)?;
Ok(match value.as_str() {
"UNIX" => Self::Unix,
"RFC3339" => Self::Rfc3339,
_ => Self::Unknown(value),
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InstrumentCommission {
#[serde(
rename = "commission",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub commission: Option<Decimal>,
#[serde(
rename = "unitsTraded",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub units_traded: Option<Decimal>,
#[serde(
rename = "minimumCommission",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub minimum_commission: Option<Decimal>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum GuaranteedStopLossOrderModeForInstrument {
Disabled,
Allowed,
Required,
Unknown(String),
}
impl GuaranteedStopLossOrderModeForInstrument {
pub fn as_str(&self) -> &str {
match self {
Self::Disabled => "DISABLED",
Self::Allowed => "ALLOWED",
Self::Required => "REQUIRED",
Self::Unknown(value) => value,
}
}
}
impl Serialize for GuaranteedStopLossOrderModeForInstrument {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for GuaranteedStopLossOrderModeForInstrument {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = String::deserialize(deserializer)?;
Ok(match value.as_str() {
"DISABLED" => Self::Disabled,
"ALLOWED" => Self::Allowed,
"REQUIRED" => Self::Required,
_ => Self::Unknown(value),
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GuaranteedStopLossOrderLevelRestriction {
#[serde(rename = "volume", default, skip_serializing_if = "Option::is_none")]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub volume: Option<Decimal>,
#[serde(
rename = "priceRange",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub price_range: Option<Decimal>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum Direction {
Long,
Short,
Unknown(String),
}
impl Direction {
pub fn as_str(&self) -> &str {
match self {
Self::Long => "LONG",
Self::Short => "SHORT",
Self::Unknown(value) => value,
}
}
}
impl Serialize for Direction {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for Direction {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = String::deserialize(deserializer)?;
Ok(match value.as_str() {
"LONG" => Self::Long,
"SHORT" => Self::Short,
_ => Self::Unknown(value),
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConversionFactor {
#[serde(rename = "factor", default, skip_serializing_if = "Option::is_none")]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub factor: Option<Decimal>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct HomeConversionFactors {
#[serde(
rename = "gainQuoteHome",
default,
skip_serializing_if = "Option::is_none"
)]
pub gain_quote_home: Option<ConversionFactor>,
#[serde(
rename = "lossQuoteHome",
default,
skip_serializing_if = "Option::is_none"
)]
pub loss_quote_home: Option<ConversionFactor>,
#[serde(
rename = "gainBaseHome",
default,
skip_serializing_if = "Option::is_none"
)]
pub gain_base_home: Option<ConversionFactor>,
#[serde(
rename = "lossBaseHome",
default,
skip_serializing_if = "Option::is_none"
)]
pub loss_base_home: Option<ConversionFactor>,
}