use super::{ClientExtensions, StopLossOrder, TakeProfitOrder, TrailingStopLossOrder};
use crate::ids::{InstrumentName, OrderID, TradeID, TransactionID};
use crate::timestamp::Timestamp;
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
provider_enum! {
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum TradeState {
Open => "OPEN",
Closed => "CLOSED",
CloseWhenTradeable => "CLOSE_WHEN_TRADEABLE",
;
Unknown(String),
}
}
provider_enum! {
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum TradeStateFilter {
Open => "OPEN",
Closed => "CLOSED",
CloseWhenTradeable => "CLOSE_WHEN_TRADEABLE",
All => "ALL",
;
Unknown(String),
}
}
#[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>,
}
provider_enum! {
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum TradePL {
Positive => "POSITIVE",
Negative => "NEGATIVE",
Zero => "ZERO",
;
Unknown(String),
}
}