1use serde::{Deserialize, Serialize};
4
5use super::macros::string_enum;
6use super::{
7 AccountFinancingMode, AccountUnits, DecimalNumber, HomeConversionFactors, InstrumentName,
8 OpenTradeFinancing, PriceValue, TradeId,
9};
10
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
13#[non_exhaustive]
14pub struct Position {
15 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
17 pub instrument: Option<InstrumentName>,
18
19 #[serde(rename = "pl", skip_serializing_if = "Option::is_none")]
21 pub pl: Option<AccountUnits>,
22
23 #[serde(rename = "unrealizedPL", skip_serializing_if = "Option::is_none")]
26 pub unrealized_pl: Option<AccountUnits>,
27
28 #[serde(rename = "marginUsed", skip_serializing_if = "Option::is_none")]
30 pub margin_used: Option<AccountUnits>,
31
32 #[serde(rename = "resettablePL", skip_serializing_if = "Option::is_none")]
35 pub resettable_pl: Option<AccountUnits>,
36
37 #[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
40 pub financing: Option<AccountUnits>,
41
42 #[serde(rename = "commission", skip_serializing_if = "Option::is_none")]
45 pub commission: Option<AccountUnits>,
46
47 #[serde(
50 rename = "guaranteedExecutionFees",
51 skip_serializing_if = "Option::is_none"
52 )]
53 pub guaranteed_execution_fees: Option<AccountUnits>,
54
55 #[serde(rename = "long", skip_serializing_if = "Option::is_none")]
57 pub long: Option<PositionSide>,
58
59 #[serde(rename = "short", skip_serializing_if = "Option::is_none")]
61 pub short: Option<PositionSide>,
62
63 #[serde(rename = "dividendAdjustment", skip_serializing_if = "Option::is_none")]
66 pub dividend_adjustment: Option<DecimalNumber>,
67
68 #[serde(rename = "trueUnrealizedPL", skip_serializing_if = "Option::is_none")]
72 pub true_unrealized_pl: Option<DecimalNumber>,
73}
74
75#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
77#[non_exhaustive]
78pub struct PositionSide {
79 #[serde(rename = "units", skip_serializing_if = "Option::is_none")]
82 pub units: Option<DecimalNumber>,
83
84 #[serde(rename = "averagePrice", skip_serializing_if = "Option::is_none")]
87 pub average_price: Option<PriceValue>,
88
89 #[serde(rename = "tradeIDs", default, skip_serializing_if = "Vec::is_empty")]
91 pub trade_ids: Vec<TradeId>,
92
93 #[serde(rename = "pl", skip_serializing_if = "Option::is_none")]
96 pub pl: Option<AccountUnits>,
97
98 #[serde(rename = "unrealizedPL", skip_serializing_if = "Option::is_none")]
101 pub unrealized_pl: Option<AccountUnits>,
102
103 #[serde(rename = "resettablePL", skip_serializing_if = "Option::is_none")]
106 pub resettable_pl: Option<AccountUnits>,
107
108 #[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
111 pub financing: Option<AccountUnits>,
112
113 #[serde(
117 rename = "guaranteedExecutionFees",
118 skip_serializing_if = "Option::is_none"
119 )]
120 pub guaranteed_execution_fees: Option<AccountUnits>,
121
122 #[serde(rename = "dividendAdjustment", skip_serializing_if = "Option::is_none")]
125 pub dividend_adjustment: Option<DecimalNumber>,
126
127 #[serde(rename = "trueUnrealizedPL", skip_serializing_if = "Option::is_none")]
131 pub true_unrealized_pl: Option<DecimalNumber>,
132}
133
134#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
136#[non_exhaustive]
137pub struct CalculatedPositionState {
138 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
140 pub instrument: Option<InstrumentName>,
141
142 #[serde(rename = "netUnrealizedPL", skip_serializing_if = "Option::is_none")]
144 pub net_unrealized_pl: Option<AccountUnits>,
145
146 #[serde(rename = "longUnrealizedPL", skip_serializing_if = "Option::is_none")]
148 pub long_unrealized_pl: Option<AccountUnits>,
149
150 #[serde(rename = "shortUnrealizedPL", skip_serializing_if = "Option::is_none")]
152 pub short_unrealized_pl: Option<AccountUnits>,
153
154 #[serde(rename = "marginUsed", skip_serializing_if = "Option::is_none")]
156 pub margin_used: Option<AccountUnits>,
157}
158
159string_enum! {
160 pub enum PositionAggregationMode {
163 AbsoluteSum => "ABSOLUTE_SUM",
164 MaximalSide => "MAXIMAL_SIDE",
165 NetSum => "NET_SUM",
166 }
167}
168
169#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
172#[non_exhaustive]
173pub struct PositionFinancing {
174 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
177 pub instrument: Option<InstrumentName>,
178
179 #[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
181 pub financing: Option<AccountUnits>,
182
183 #[serde(
185 rename = "openTradeFinancings",
186 default,
187 skip_serializing_if = "Vec::is_empty"
188 )]
189 pub open_trade_financings: Vec<OpenTradeFinancing>,
190
191 #[serde(rename = "baseFinancing", skip_serializing_if = "Option::is_none")]
195 pub base_financing: Option<DecimalNumber>,
196
197 #[serde(
199 rename = "accountFinancingMode",
200 skip_serializing_if = "Option::is_none"
201 )]
202 pub account_financing_mode: Option<AccountFinancingMode>,
203
204 #[serde(
206 rename = "homeConversionFactors",
207 skip_serializing_if = "Option::is_none"
208 )]
209 pub home_conversion_factors: Option<HomeConversionFactors>,
210
211 #[serde(rename = "homeConversionCost", skip_serializing_if = "Option::is_none")]
215 pub home_conversion_cost: Option<DecimalNumber>,
216
217 #[serde(
221 rename = "baseHomeConversionCost",
222 skip_serializing_if = "Option::is_none"
223 )]
224 pub base_home_conversion_cost: Option<DecimalNumber>,
225}
226
227#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
230#[non_exhaustive]
231pub struct OpenTradeDividendAdjustment {
232 #[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
235 pub trade_id: Option<String>,
236
237 #[serde(rename = "dividendAdjustment", skip_serializing_if = "Option::is_none")]
240 pub dividend_adjustment: Option<DecimalNumber>,
241
242 #[serde(
245 rename = "quoteDividendAdjustment",
246 skip_serializing_if = "Option::is_none"
247 )]
248 pub quote_dividend_adjustment: Option<DecimalNumber>,
249
250 #[serde(rename = "homeConversionCost", skip_serializing_if = "Option::is_none")]
254 pub home_conversion_cost: Option<DecimalNumber>,
255}