1use serde::{Deserialize, Serialize};
4
5use super::macros::string_enum;
6use super::{
7 AccountUnits, ClientExtensions, DateTime, DecimalNumber, InstrumentName, OrderId, PriceValue,
8 StopLossOrder, TakeProfitOrder, TradeId, TrailingStopLossOrder, TransactionId,
9};
10
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
15#[non_exhaustive]
16pub struct Trade {
17 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
19 pub id: Option<TradeId>,
20
21 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
23 pub instrument: Option<InstrumentName>,
24
25 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
27 pub price: Option<PriceValue>,
28
29 #[serde(rename = "openTime", skip_serializing_if = "Option::is_none")]
31 pub open_time: Option<DateTime>,
32
33 #[serde(rename = "state", skip_serializing_if = "Option::is_none")]
35 pub state: Option<TradeState>,
36
37 #[serde(rename = "initialUnits", skip_serializing_if = "Option::is_none")]
40 pub initial_units: Option<DecimalNumber>,
41
42 #[serde(
46 rename = "initialMarginRequired",
47 skip_serializing_if = "Option::is_none"
48 )]
49 pub initial_margin_required: Option<AccountUnits>,
50
51 #[serde(rename = "currentUnits", skip_serializing_if = "Option::is_none")]
54 pub current_units: Option<DecimalNumber>,
55
56 #[serde(rename = "realizedPL", skip_serializing_if = "Option::is_none")]
58 pub realized_pl: Option<AccountUnits>,
59
60 #[serde(rename = "unrealizedPL", skip_serializing_if = "Option::is_none")]
62 pub unrealized_pl: Option<AccountUnits>,
63
64 #[serde(rename = "marginUsed", skip_serializing_if = "Option::is_none")]
66 pub margin_used: Option<AccountUnits>,
67
68 #[serde(rename = "averageClosePrice", skip_serializing_if = "Option::is_none")]
71 pub average_close_price: Option<PriceValue>,
72
73 #[serde(
75 rename = "closingTransactionIDs",
76 default,
77 skip_serializing_if = "Vec::is_empty"
78 )]
79 pub closing_transaction_ids: Vec<TransactionId>,
80
81 #[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
83 pub financing: Option<AccountUnits>,
84
85 #[serde(rename = "closeTime", skip_serializing_if = "Option::is_none")]
88 pub close_time: Option<DateTime>,
89
90 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
92 pub client_extensions: Option<ClientExtensions>,
93
94 #[serde(rename = "takeProfitOrder", skip_serializing_if = "Option::is_none")]
96 pub take_profit_order: Option<TakeProfitOrder>,
97
98 #[serde(rename = "stopLossOrder", skip_serializing_if = "Option::is_none")]
100 pub stop_loss_order: Option<StopLossOrder>,
101
102 #[serde(
104 rename = "trailingStopLossOrder",
105 skip_serializing_if = "Option::is_none"
106 )]
107 pub trailing_stop_loss_order: Option<TrailingStopLossOrder>,
108
109 #[serde(rename = "dividendAdjustment", skip_serializing_if = "Option::is_none")]
112 pub dividend_adjustment: Option<DecimalNumber>,
113
114 #[serde(rename = "trueUnrealizedPL", skip_serializing_if = "Option::is_none")]
118 pub true_unrealized_pl: Option<DecimalNumber>,
119}
120
121#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
124#[non_exhaustive]
125pub struct TradeSummary {
126 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
128 pub id: Option<TradeId>,
129
130 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
132 pub instrument: Option<InstrumentName>,
133
134 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
136 pub price: Option<PriceValue>,
137
138 #[serde(rename = "openTime", skip_serializing_if = "Option::is_none")]
140 pub open_time: Option<DateTime>,
141
142 #[serde(rename = "state", skip_serializing_if = "Option::is_none")]
144 pub state: Option<TradeState>,
145
146 #[serde(rename = "initialUnits", skip_serializing_if = "Option::is_none")]
149 pub initial_units: Option<DecimalNumber>,
150
151 #[serde(
155 rename = "initialMarginRequired",
156 skip_serializing_if = "Option::is_none"
157 )]
158 pub initial_margin_required: Option<AccountUnits>,
159
160 #[serde(rename = "currentUnits", skip_serializing_if = "Option::is_none")]
163 pub current_units: Option<DecimalNumber>,
164
165 #[serde(rename = "realizedPL", skip_serializing_if = "Option::is_none")]
167 pub realized_pl: Option<AccountUnits>,
168
169 #[serde(rename = "unrealizedPL", skip_serializing_if = "Option::is_none")]
171 pub unrealized_pl: Option<AccountUnits>,
172
173 #[serde(rename = "marginUsed", skip_serializing_if = "Option::is_none")]
175 pub margin_used: Option<AccountUnits>,
176
177 #[serde(rename = "averageClosePrice", skip_serializing_if = "Option::is_none")]
180 pub average_close_price: Option<PriceValue>,
181
182 #[serde(
184 rename = "closingTransactionIDs",
185 default,
186 skip_serializing_if = "Vec::is_empty"
187 )]
188 pub closing_transaction_ids: Vec<TransactionId>,
189
190 #[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
192 pub financing: Option<AccountUnits>,
193
194 #[serde(rename = "closeTime", skip_serializing_if = "Option::is_none")]
197 pub close_time: Option<DateTime>,
198
199 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
201 pub client_extensions: Option<ClientExtensions>,
202
203 #[serde(rename = "takeProfitOrderID", skip_serializing_if = "Option::is_none")]
206 pub take_profit_order_id: Option<OrderId>,
207
208 #[serde(rename = "stopLossOrderID", skip_serializing_if = "Option::is_none")]
211 pub stop_loss_order_id: Option<OrderId>,
212
213 #[serde(
216 rename = "trailingStopLossOrderID",
217 skip_serializing_if = "Option::is_none"
218 )]
219 pub trailing_stop_loss_order_id: Option<OrderId>,
220
221 #[serde(rename = "dividendAdjustment", skip_serializing_if = "Option::is_none")]
224 pub dividend_adjustment: Option<DecimalNumber>,
225
226 #[serde(rename = "trueUnrealizedPL", skip_serializing_if = "Option::is_none")]
230 pub true_unrealized_pl: Option<DecimalNumber>,
231}
232
233#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
235#[non_exhaustive]
236pub struct CalculatedTradeState {
237 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
239 pub id: Option<TradeId>,
240
241 #[serde(rename = "unrealizedPL", skip_serializing_if = "Option::is_none")]
243 pub unrealized_pl: Option<AccountUnits>,
244
245 #[serde(rename = "marginUsed", skip_serializing_if = "Option::is_none")]
247 pub margin_used: Option<AccountUnits>,
248}
249
250string_enum! {
251 pub enum TradePL {
253 Positive => "POSITIVE",
254 Negative => "NEGATIVE",
255 Zero => "ZERO",
256 }
257}
258
259string_enum! {
260 pub enum TradeState {
262 Open => "OPEN",
263 Closed => "CLOSED",
264 CloseWhenTradeable => "CLOSE_WHEN_TRADEABLE",
265 }
266}
267
268string_enum! {
269 pub enum TradeStateFilter {
271 Open => "OPEN",
272 Closed => "CLOSED",
273 CloseWhenTradeable => "CLOSE_WHEN_TRADEABLE",
274 All => "ALL",
275 }
276}
277
278#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
282#[non_exhaustive]
283pub struct TradeOpen {
284 #[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
286 pub trade_id: Option<TradeId>,
287
288 #[serde(rename = "units", skip_serializing_if = "Option::is_none")]
290 pub units: Option<DecimalNumber>,
291
292 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
294 pub price: Option<PriceValue>,
295
296 #[serde(
299 rename = "guaranteedExecutionFee",
300 skip_serializing_if = "Option::is_none"
301 )]
302 pub guaranteed_execution_fee: Option<AccountUnits>,
303
304 #[serde(rename = "clientExtensions", skip_serializing_if = "Option::is_none")]
306 pub client_extensions: Option<ClientExtensions>,
307
308 #[serde(rename = "halfSpreadCost", skip_serializing_if = "Option::is_none")]
311 pub half_spread_cost: Option<AccountUnits>,
312
313 #[serde(
317 rename = "initialMarginRequired",
318 skip_serializing_if = "Option::is_none"
319 )]
320 pub initial_margin_required: Option<AccountUnits>,
321
322 #[serde(
326 rename = "quoteGuaranteedExecutionFee",
327 skip_serializing_if = "Option::is_none"
328 )]
329 pub quote_guaranteed_execution_fee: Option<DecimalNumber>,
330
331 #[serde(
335 rename = "guaranteedExecutionFeeHomeConversionCost",
336 skip_serializing_if = "Option::is_none"
337 )]
338 pub guaranteed_execution_fee_home_conversion_cost: Option<DecimalNumber>,
339}
340
341#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
346#[non_exhaustive]
347pub struct TradeReduce {
348 #[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
350 pub trade_id: Option<TradeId>,
351
352 #[serde(rename = "units", skip_serializing_if = "Option::is_none")]
354 pub units: Option<DecimalNumber>,
355
356 #[serde(rename = "price", skip_serializing_if = "Option::is_none")]
359 pub price: Option<PriceValue>,
360
361 #[serde(rename = "realizedPL", skip_serializing_if = "Option::is_none")]
363 pub realized_pl: Option<AccountUnits>,
364
365 #[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
367 pub financing: Option<AccountUnits>,
368
369 #[serde(
372 rename = "guaranteedExecutionFee",
373 skip_serializing_if = "Option::is_none"
374 )]
375 pub guaranteed_execution_fee: Option<AccountUnits>,
376
377 #[serde(rename = "halfSpreadCost", skip_serializing_if = "Option::is_none")]
381 pub half_spread_cost: Option<AccountUnits>,
382
383 #[serde(rename = "baseFinancing", skip_serializing_if = "Option::is_none")]
387 pub base_financing: Option<DecimalNumber>,
388
389 #[serde(
393 rename = "quoteGuaranteedExecutionFee",
394 skip_serializing_if = "Option::is_none"
395 )]
396 pub quote_guaranteed_execution_fee: Option<DecimalNumber>,
397
398 #[serde(rename = "financingRate", skip_serializing_if = "Option::is_none")]
402 pub financing_rate: Option<DecimalNumber>,
403
404 #[serde(rename = "homeConversionCost", skip_serializing_if = "Option::is_none")]
408 pub home_conversion_cost: Option<DecimalNumber>,
409
410 #[serde(
414 rename = "plHomeConversionCost",
415 skip_serializing_if = "Option::is_none"
416 )]
417 pub pl_home_conversion_cost: Option<DecimalNumber>,
418
419 #[serde(
423 rename = "baseFinancingHomeConversionCost",
424 skip_serializing_if = "Option::is_none"
425 )]
426 pub base_financing_home_conversion_cost: Option<DecimalNumber>,
427
428 #[serde(
432 rename = "guaranteedExecutionFeeHomeConversionCost",
433 skip_serializing_if = "Option::is_none"
434 )]
435 pub guaranteed_execution_fee_home_conversion_cost: Option<DecimalNumber>,
436}
437
438#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
441#[non_exhaustive]
442pub struct OpenTradeFinancing {
443 #[serde(rename = "tradeID", skip_serializing_if = "Option::is_none")]
445 pub trade_id: Option<TradeId>,
446
447 #[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
449 pub financing: Option<AccountUnits>,
450
451 #[serde(rename = "baseFinancing", skip_serializing_if = "Option::is_none")]
455 pub base_financing: Option<DecimalNumber>,
456
457 #[serde(rename = "financingRate", skip_serializing_if = "Option::is_none")]
460 pub financing_rate: Option<DecimalNumber>,
461
462 #[serde(rename = "homeConversionCost", skip_serializing_if = "Option::is_none")]
466 pub home_conversion_cost: Option<DecimalNumber>,
467
468 #[serde(
472 rename = "baseHomeConversionCost",
473 skip_serializing_if = "Option::is_none"
474 )]
475 pub base_home_conversion_cost: Option<DecimalNumber>,
476}