use serde::{Deserialize, Serialize};
use crate::models::macros::string_enum;
use crate::models::transaction::MarketOrderReason;
use crate::models::{
AccountFinancingMode, AccountId, AccountUnits, DateTime, DecimalNumber, HomeConversionFactors,
InstrumentName, OpenTradeDividendAdjustment, PositionFinancing, RequestId, TradeId,
TransactionId,
};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MarginCallEnterTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MarginCallExtendTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
#[serde(rename = "extensionNumber", skip_serializing_if = "Option::is_none")]
pub extension_number: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MarginCallExitTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
#[serde(rename = "reason", skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DelayedTradeClosureTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
#[serde(rename = "reason", skip_serializing_if = "Option::is_none")]
pub reason: Option<MarketOrderReason>,
#[serde(rename = "tradeIDs", skip_serializing_if = "Option::is_none")]
pub trade_ids: Option<TradeId>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DailyFinancingTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
#[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
pub financing: Option<AccountUnits>,
#[serde(rename = "accountBalance", skip_serializing_if = "Option::is_none")]
pub account_balance: Option<AccountUnits>,
#[serde(
rename = "accountFinancingMode",
skip_serializing_if = "Option::is_none"
)]
pub account_financing_mode: Option<AccountFinancingMode>,
#[serde(
rename = "positionFinancings",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub position_financings: Vec<PositionFinancing>,
#[serde(rename = "homeConversionCost", skip_serializing_if = "Option::is_none")]
pub home_conversion_cost: Option<DecimalNumber>,
#[serde(
rename = "baseHomeConversionCost",
skip_serializing_if = "Option::is_none"
)]
pub base_home_conversion_cost: Option<DecimalNumber>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DividendAdjustmentTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
#[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
pub instrument: Option<InstrumentName>,
#[serde(rename = "dividendAdjustment", skip_serializing_if = "Option::is_none")]
pub dividend_adjustment: Option<DecimalNumber>,
#[serde(
rename = "quoteDividendAdjustment",
skip_serializing_if = "Option::is_none"
)]
pub quote_dividend_adjustment: Option<DecimalNumber>,
#[serde(
rename = "homeConversionFactors",
skip_serializing_if = "Option::is_none"
)]
pub home_conversion_factors: Option<HomeConversionFactors>,
#[serde(rename = "accountBalance", skip_serializing_if = "Option::is_none")]
pub account_balance: Option<DecimalNumber>,
#[serde(
rename = "openTradeDividendAdjustments",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub open_trade_dividend_adjustments: Vec<OpenTradeDividendAdjustment>,
#[serde(rename = "homeConversionCost", skip_serializing_if = "Option::is_none")]
pub home_conversion_cost: Option<DecimalNumber>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ResetResettablePLTransaction {
#[serde(rename = "id", skip_serializing_if = "Option::is_none")]
pub id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
#[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
pub account_id: Option<AccountId>,
#[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
pub batch_id: Option<TransactionId>,
#[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
pub request_id: Option<RequestId>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LiquidityRegenerationSchedule {
#[serde(rename = "steps", default, skip_serializing_if = "Vec::is_empty")]
pub steps: Vec<LiquidityRegenerationScheduleStep>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LiquidityRegenerationScheduleStep {
#[serde(rename = "timestamp", skip_serializing_if = "Option::is_none")]
pub timestamp: Option<DateTime>,
#[serde(rename = "bidLiquidityUsed", skip_serializing_if = "Option::is_none")]
pub bid_liquidity_used: Option<DecimalNumber>,
#[serde(rename = "askLiquidityUsed", skip_serializing_if = "Option::is_none")]
pub ask_liquidity_used: Option<DecimalNumber>,
}
string_enum! {
pub enum TransactionType {
Create => "CREATE",
Close => "CLOSE",
Reopen => "REOPEN",
ClientConfigure => "CLIENT_CONFIGURE",
ClientConfigureReject => "CLIENT_CONFIGURE_REJECT",
TransferFunds => "TRANSFER_FUNDS",
TransferFundsReject => "TRANSFER_FUNDS_REJECT",
MarketOrder => "MARKET_ORDER",
MarketOrderReject => "MARKET_ORDER_REJECT",
FixedPriceOrder => "FIXED_PRICE_ORDER",
LimitOrder => "LIMIT_ORDER",
LimitOrderReject => "LIMIT_ORDER_REJECT",
StopOrder => "STOP_ORDER",
StopOrderReject => "STOP_ORDER_REJECT",
MarketIfTouchedOrder => "MARKET_IF_TOUCHED_ORDER",
MarketIfTouchedOrderReject => "MARKET_IF_TOUCHED_ORDER_REJECT",
TakeProfitOrder => "TAKE_PROFIT_ORDER",
TakeProfitOrderReject => "TAKE_PROFIT_ORDER_REJECT",
StopLossOrder => "STOP_LOSS_ORDER",
StopLossOrderReject => "STOP_LOSS_ORDER_REJECT",
TrailingStopLossOrder => "TRAILING_STOP_LOSS_ORDER",
TrailingStopLossOrderReject => "TRAILING_STOP_LOSS_ORDER_REJECT",
OrderFill => "ORDER_FILL",
OrderCancel => "ORDER_CANCEL",
OrderCancelReject => "ORDER_CANCEL_REJECT",
OrderClientExtensionsModify => "ORDER_CLIENT_EXTENSIONS_MODIFY",
OrderClientExtensionsModifyReject => "ORDER_CLIENT_EXTENSIONS_MODIFY_REJECT",
TradeClientExtensionsModify => "TRADE_CLIENT_EXTENSIONS_MODIFY",
TradeClientExtensionsModifyReject => "TRADE_CLIENT_EXTENSIONS_MODIFY_REJECT",
MarginCallEnter => "MARGIN_CALL_ENTER",
MarginCallExtend => "MARGIN_CALL_EXTEND",
MarginCallExit => "MARGIN_CALL_EXIT",
DelayedTradeClosure => "DELAYED_TRADE_CLOSURE",
DailyFinancing => "DAILY_FINANCING",
ResetResettablePl => "RESET_RESETTABLE_PL",
DividendAdjustment => "DIVIDEND_ADJUSTMENT",
}
}
string_enum! {
pub enum TransactionFilter {
Order => "ORDER",
Funding => "FUNDING",
Admin => "ADMIN",
Create => "CREATE",
Close => "CLOSE",
Reopen => "REOPEN",
ClientConfigure => "CLIENT_CONFIGURE",
ClientConfigureReject => "CLIENT_CONFIGURE_REJECT",
TransferFunds => "TRANSFER_FUNDS",
TransferFundsReject => "TRANSFER_FUNDS_REJECT",
MarketOrder => "MARKET_ORDER",
MarketOrderReject => "MARKET_ORDER_REJECT",
LimitOrder => "LIMIT_ORDER",
LimitOrderReject => "LIMIT_ORDER_REJECT",
StopOrder => "STOP_ORDER",
StopOrderReject => "STOP_ORDER_REJECT",
MarketIfTouchedOrder => "MARKET_IF_TOUCHED_ORDER",
MarketIfTouchedOrderReject => "MARKET_IF_TOUCHED_ORDER_REJECT",
TakeProfitOrder => "TAKE_PROFIT_ORDER",
TakeProfitOrderReject => "TAKE_PROFIT_ORDER_REJECT",
StopLossOrder => "STOP_LOSS_ORDER",
StopLossOrderReject => "STOP_LOSS_ORDER_REJECT",
TrailingStopLossOrder => "TRAILING_STOP_LOSS_ORDER",
TrailingStopLossOrderReject => "TRAILING_STOP_LOSS_ORDER_REJECT",
OneCancelsAllOrder => "ONE_CANCELS_ALL_ORDER",
OneCancelsAllOrderReject => "ONE_CANCELS_ALL_ORDER_REJECT",
OneCancelsAllOrderTriggered => "ONE_CANCELS_ALL_ORDER_TRIGGERED",
OrderFill => "ORDER_FILL",
OrderCancel => "ORDER_CANCEL",
OrderCancelReject => "ORDER_CANCEL_REJECT",
OrderClientExtensionsModify => "ORDER_CLIENT_EXTENSIONS_MODIFY",
OrderClientExtensionsModifyReject => "ORDER_CLIENT_EXTENSIONS_MODIFY_REJECT",
TradeClientExtensionsModify => "TRADE_CLIENT_EXTENSIONS_MODIFY",
TradeClientExtensionsModifyReject => "TRADE_CLIENT_EXTENSIONS_MODIFY_REJECT",
MarginCallEnter => "MARGIN_CALL_ENTER",
MarginCallExtend => "MARGIN_CALL_EXTEND",
MarginCallExit => "MARGIN_CALL_EXIT",
DelayedTradeClosure => "DELAYED_TRADE_CLOSURE",
DailyFinancing => "DAILY_FINANCING",
ResetResettablePl => "RESET_RESETTABLE_PL",
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct TransactionHeartbeat {
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
#[serde(rename = "lastTransactionID", skip_serializing_if = "Option::is_none")]
pub last_transaction_id: Option<TransactionId>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MT4TransactionHeartbeat {
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
#[serde(rename = "time", skip_serializing_if = "Option::is_none")]
pub time: Option<DateTime>,
}