#[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, Eq, Hash)]
#[non_exhaustive]
pub enum TradeState {
Open,
Closed,
CloseWhenTradeable,
Unknown(String),
}
impl TradeState {
pub fn as_str(&self) -> &str {
match self {
Self::Open => "OPEN",
Self::Closed => "CLOSED",
Self::CloseWhenTradeable => "CLOSE_WHEN_TRADEABLE",
Self::Unknown(value) => value,
}
}
}
impl Serialize for TradeState {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for TradeState {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = String::deserialize(deserializer)?;
Ok(match value.as_str() {
"OPEN" => Self::Open,
"CLOSED" => Self::Closed,
"CLOSE_WHEN_TRADEABLE" => Self::CloseWhenTradeable,
_ => Self::Unknown(value),
})
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum TradeStateFilter {
Open,
Closed,
CloseWhenTradeable,
All,
Unknown(String),
}
impl TradeStateFilter {
pub fn as_str(&self) -> &str {
match self {
Self::Open => "OPEN",
Self::Closed => "CLOSED",
Self::CloseWhenTradeable => "CLOSE_WHEN_TRADEABLE",
Self::All => "ALL",
Self::Unknown(value) => value,
}
}
}
impl Serialize for TradeStateFilter {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for TradeStateFilter {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = String::deserialize(deserializer)?;
Ok(match value.as_str() {
"OPEN" => Self::Open,
"CLOSED" => Self::Closed,
"CLOSE_WHEN_TRADEABLE" => Self::CloseWhenTradeable,
"ALL" => Self::All,
_ => Self::Unknown(value),
})
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Trade {
#[serde(rename = "id", default, skip_serializing_if = "Option::is_none")]
pub id: Option<TradeID>,
#[serde(
rename = "instrument",
default,
skip_serializing_if = "Option::is_none"
)]
pub instrument: Option<InstrumentName>,
#[serde(rename = "price", default, skip_serializing_if = "Option::is_none")]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub price: Option<Decimal>,
#[serde(rename = "openTime", default, skip_serializing_if = "Option::is_none")]
pub open_time: Option<Timestamp>,
#[serde(rename = "state", default, skip_serializing_if = "Option::is_none")]
pub state: Option<TradeState>,
#[serde(
rename = "initialUnits",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub initial_units: Option<Decimal>,
#[serde(
rename = "initialMarginRequired",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub initial_margin_required: Option<Decimal>,
#[serde(
rename = "currentUnits",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub current_units: Option<Decimal>,
#[serde(
rename = "realizedPL",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub realized_pl: Option<Decimal>,
#[serde(
rename = "unrealizedPL",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub unrealized_pl: Option<Decimal>,
#[serde(
rename = "marginUsed",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub margin_used: Option<Decimal>,
#[serde(
rename = "averageClosePrice",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub average_close_price: Option<Decimal>,
#[serde(
rename = "closingTransactionIDs",
default,
skip_serializing_if = "Option::is_none"
)]
pub closing_transaction_ids: Option<Vec<TransactionID>>,
#[serde(rename = "financing", default, skip_serializing_if = "Option::is_none")]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub financing: Option<Decimal>,
#[serde(
rename = "dividendAdjustment",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub dividend_adjustment: Option<Decimal>,
#[serde(rename = "closeTime", default, skip_serializing_if = "Option::is_none")]
pub close_time: Option<Timestamp>,
#[serde(
rename = "clientExtensions",
default,
skip_serializing_if = "Option::is_none"
)]
pub client_extensions: Option<ClientExtensions>,
#[serde(
rename = "takeProfitOrder",
default,
skip_serializing_if = "Option::is_none"
)]
pub take_profit_order: Option<TakeProfitOrder>,
#[serde(
rename = "stopLossOrder",
default,
skip_serializing_if = "Option::is_none"
)]
pub stop_loss_order: Option<StopLossOrder>,
#[serde(
rename = "trailingStopLossOrder",
default,
skip_serializing_if = "Option::is_none"
)]
pub trailing_stop_loss_order: Option<TrailingStopLossOrder>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TradeSummary {
#[serde(rename = "id", default, skip_serializing_if = "Option::is_none")]
pub id: Option<TradeID>,
#[serde(
rename = "instrument",
default,
skip_serializing_if = "Option::is_none"
)]
pub instrument: Option<InstrumentName>,
#[serde(rename = "price", default, skip_serializing_if = "Option::is_none")]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub price: Option<Decimal>,
#[serde(rename = "openTime", default, skip_serializing_if = "Option::is_none")]
pub open_time: Option<Timestamp>,
#[serde(rename = "state", default, skip_serializing_if = "Option::is_none")]
pub state: Option<TradeState>,
#[serde(
rename = "initialUnits",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub initial_units: Option<Decimal>,
#[serde(
rename = "initialMarginRequired",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub initial_margin_required: Option<Decimal>,
#[serde(
rename = "currentUnits",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub current_units: Option<Decimal>,
#[serde(
rename = "realizedPL",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub realized_pl: Option<Decimal>,
#[serde(
rename = "unrealizedPL",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub unrealized_pl: Option<Decimal>,
#[serde(
rename = "marginUsed",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub margin_used: Option<Decimal>,
#[serde(
rename = "averageClosePrice",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub average_close_price: Option<Decimal>,
#[serde(
rename = "closingTransactionIDs",
default,
skip_serializing_if = "Option::is_none"
)]
pub closing_transaction_ids: Option<Vec<TransactionID>>,
#[serde(rename = "financing", default, skip_serializing_if = "Option::is_none")]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub financing: Option<Decimal>,
#[serde(
rename = "dividendAdjustment",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub dividend_adjustment: Option<Decimal>,
#[serde(rename = "closeTime", default, skip_serializing_if = "Option::is_none")]
pub close_time: Option<Timestamp>,
#[serde(
rename = "clientExtensions",
default,
skip_serializing_if = "Option::is_none"
)]
pub client_extensions: Option<ClientExtensions>,
#[serde(
rename = "takeProfitOrderID",
default,
skip_serializing_if = "Option::is_none"
)]
pub take_profit_order_id: Option<OrderID>,
#[serde(
rename = "stopLossOrderID",
default,
skip_serializing_if = "Option::is_none"
)]
pub stop_loss_order_id: Option<OrderID>,
#[serde(
rename = "guaranteedStopLossOrderID",
default,
skip_serializing_if = "Option::is_none"
)]
pub guaranteed_stop_loss_order_id: Option<OrderID>,
#[serde(
rename = "trailingStopLossOrderID",
default,
skip_serializing_if = "Option::is_none"
)]
pub trailing_stop_loss_order_id: Option<OrderID>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CalculatedTradeState {
#[serde(rename = "id", default, skip_serializing_if = "Option::is_none")]
pub id: Option<TradeID>,
#[serde(
rename = "unrealizedPL",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub unrealized_pl: Option<Decimal>,
#[serde(
rename = "marginUsed",
default,
skip_serializing_if = "Option::is_none"
)]
#[serde(deserialize_with = "crate::decimal_wire::optional_number_or_string")]
pub margin_used: Option<Decimal>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum TradePL {
Positive,
Negative,
Zero,
Unknown(String),
}
impl TradePL {
pub fn as_str(&self) -> &str {
match self {
Self::Positive => "POSITIVE",
Self::Negative => "NEGATIVE",
Self::Zero => "ZERO",
Self::Unknown(value) => value,
}
}
}
impl Serialize for TradePL {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for TradePL {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = String::deserialize(deserializer)?;
Ok(match value.as_str() {
"POSITIVE" => Self::Positive,
"NEGATIVE" => Self::Negative,
"ZERO" => Self::Zero,
_ => Self::Unknown(value),
})
}
}