1use serde::{Deserialize, Serialize};
4
5use super::macros::string_enum;
6use super::transaction::Transaction;
7use super::{
8 AccountId, AccountUnits, CalculatedPositionState, CalculatedTradeState, Currency, DateTime,
9 DecimalNumber, DynamicOrderState, InstrumentName, Order, Position, TradeSummary, TransactionId,
10};
11
12#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
14#[non_exhaustive]
15pub struct AccountProperties {
16 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
18 pub id: Option<AccountId>,
19
20 #[serde(rename = "mt4AccountID", skip_serializing_if = "Option::is_none")]
23 pub mt4_account_id: Option<i64>,
24
25 #[serde(rename = "tags", default, skip_serializing_if = "Vec::is_empty")]
27 pub tags: Vec<String>,
28}
29
30#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
33#[non_exhaustive]
34pub struct AccountSummary {
35 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
37 pub id: Option<AccountId>,
38
39 #[serde(rename = "alias", skip_serializing_if = "Option::is_none")]
42 pub alias: Option<String>,
43
44 #[serde(rename = "currency", skip_serializing_if = "Option::is_none")]
46 pub currency: Option<Currency>,
47
48 #[serde(rename = "balance", skip_serializing_if = "Option::is_none")]
50 pub balance: Option<AccountUnits>,
51
52 #[serde(rename = "createdByUserID", skip_serializing_if = "Option::is_none")]
54 pub created_by_user_id: Option<i64>,
55
56 #[serde(rename = "createdTime", skip_serializing_if = "Option::is_none")]
58 pub created_time: Option<DateTime>,
59
60 #[serde(
62 rename = "guaranteedStopLossOrderMode",
63 skip_serializing_if = "Option::is_none"
64 )]
65 pub guaranteed_stop_loss_order_mode: Option<GuaranteedStopLossOrderMode>,
66
67 #[serde(rename = "pl", skip_serializing_if = "Option::is_none")]
69 pub pl: Option<AccountUnits>,
70
71 #[serde(rename = "resettablePL", skip_serializing_if = "Option::is_none")]
74 pub resettable_pl: Option<AccountUnits>,
75
76 #[serde(rename = "resettablePLTime", skip_serializing_if = "Option::is_none")]
78 pub resettable_pl_time: Option<DateTime>,
79
80 #[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
83 pub financing: Option<AccountUnits>,
84
85 #[serde(rename = "commission", skip_serializing_if = "Option::is_none")]
87 pub commission: Option<AccountUnits>,
88
89 #[serde(
92 rename = "guaranteedExecutionFees",
93 skip_serializing_if = "Option::is_none"
94 )]
95 pub guaranteed_execution_fees: Option<AccountUnits>,
96
97 #[serde(rename = "marginRate", skip_serializing_if = "Option::is_none")]
102 pub margin_rate: Option<DecimalNumber>,
103
104 #[serde(
107 rename = "marginCallEnterTime",
108 skip_serializing_if = "Option::is_none"
109 )]
110 pub margin_call_enter_time: Option<DateTime>,
111
112 #[serde(
114 rename = "marginCallExtensionCount",
115 skip_serializing_if = "Option::is_none"
116 )]
117 pub margin_call_extension_count: Option<i64>,
118
119 #[serde(
121 rename = "lastMarginCallExtensionTime",
122 skip_serializing_if = "Option::is_none"
123 )]
124 pub last_margin_call_extension_time: Option<DateTime>,
125
126 #[serde(rename = "openTradeCount", skip_serializing_if = "Option::is_none")]
128 pub open_trade_count: Option<i64>,
129
130 #[serde(rename = "openPositionCount", skip_serializing_if = "Option::is_none")]
132 pub open_position_count: Option<i64>,
133
134 #[serde(rename = "pendingOrderCount", skip_serializing_if = "Option::is_none")]
136 pub pending_order_count: Option<i64>,
137
138 #[serde(rename = "hedgingEnabled", skip_serializing_if = "Option::is_none")]
140 pub hedging_enabled: Option<bool>,
141
142 #[serde(
144 rename = "lastOrderFillTimestamp",
145 skip_serializing_if = "Option::is_none"
146 )]
147 pub last_order_fill_timestamp: Option<DateTime>,
148
149 #[serde(rename = "unrealizedPL", skip_serializing_if = "Option::is_none")]
152 pub unrealized_pl: Option<AccountUnits>,
153
154 #[serde(rename = "NAV", skip_serializing_if = "Option::is_none")]
157 pub nav: Option<AccountUnits>,
158
159 #[serde(rename = "marginUsed", skip_serializing_if = "Option::is_none")]
161 pub margin_used: Option<AccountUnits>,
162
163 #[serde(rename = "marginAvailable", skip_serializing_if = "Option::is_none")]
165 pub margin_available: Option<AccountUnits>,
166
167 #[serde(rename = "positionValue", skip_serializing_if = "Option::is_none")]
170 pub position_value: Option<AccountUnits>,
171
172 #[serde(
174 rename = "marginCloseoutUnrealizedPL",
175 skip_serializing_if = "Option::is_none"
176 )]
177 pub margin_closeout_unrealized_pl: Option<AccountUnits>,
178
179 #[serde(rename = "marginCloseoutNAV", skip_serializing_if = "Option::is_none")]
181 pub margin_closeout_nav: Option<AccountUnits>,
182
183 #[serde(
185 rename = "marginCloseoutMarginUsed",
186 skip_serializing_if = "Option::is_none"
187 )]
188 pub margin_closeout_margin_used: Option<AccountUnits>,
189
190 #[serde(
193 rename = "marginCloseoutPercent",
194 skip_serializing_if = "Option::is_none"
195 )]
196 pub margin_closeout_percent: Option<DecimalNumber>,
197
198 #[serde(
201 rename = "marginCloseoutPositionValue",
202 skip_serializing_if = "Option::is_none"
203 )]
204 pub margin_closeout_position_value: Option<DecimalNumber>,
205
206 #[serde(rename = "withdrawalLimit", skip_serializing_if = "Option::is_none")]
209 pub withdrawal_limit: Option<AccountUnits>,
210
211 #[serde(
213 rename = "marginCallMarginUsed",
214 skip_serializing_if = "Option::is_none"
215 )]
216 pub margin_call_margin_used: Option<AccountUnits>,
217
218 #[serde(rename = "marginCallPercent", skip_serializing_if = "Option::is_none")]
221 pub margin_call_percent: Option<DecimalNumber>,
222
223 #[serde(rename = "lastTransactionID", skip_serializing_if = "Option::is_none")]
225 pub last_transaction_id: Option<TransactionId>,
226
227 #[serde(rename = "dividendAdjustment", skip_serializing_if = "Option::is_none")]
230 pub dividend_adjustment: Option<DecimalNumber>,
231
232 #[serde(rename = "trueNAV", skip_serializing_if = "Option::is_none")]
236 pub true_nav: Option<DecimalNumber>,
237
238 #[serde(rename = "trueUnrealizedPL", skip_serializing_if = "Option::is_none")]
242 pub true_unrealized_pl: Option<DecimalNumber>,
243
244 #[serde(
248 rename = "lastDividendAdjustmentTimestamps",
249 default,
250 skip_serializing_if = "Vec::is_empty"
251 )]
252 pub last_dividend_adjustment_timestamps: Vec<DividendAdjustmentTimestamp>,
253}
254
255string_enum! {
256 pub enum GuaranteedStopLossOrderMode {
259 Disabled => "DISABLED",
260 Allowed => "ALLOWED",
261 Required => "REQUIRED",
262 }
263}
264
265string_enum! {
266 pub enum AccountFinancingMode {
268 NoFinancing => "NO_FINANCING",
269 SecondBySecond => "SECOND_BY_SECOND",
270 Daily => "DAILY",
271 DailyInstrument => "DAILY_INSTRUMENT",
272 SecondBySecondInstrument => "SECOND_BY_SECOND_INSTRUMENT",
273 }
274}
275
276#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
279#[non_exhaustive]
280pub struct DividendAdjustmentTimestamp {
281 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
283 pub instrument: Option<InstrumentName>,
284
285 #[serde(rename = "timestamp", skip_serializing_if = "Option::is_none")]
287 pub timestamp: Option<DateTime>,
288}
289
290#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
293#[non_exhaustive]
294pub struct Account {
295 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
297 pub id: Option<AccountId>,
298
299 #[serde(rename = "alias", skip_serializing_if = "Option::is_none")]
302 pub alias: Option<String>,
303
304 #[serde(rename = "currency", skip_serializing_if = "Option::is_none")]
306 pub currency: Option<Currency>,
307
308 #[serde(rename = "balance", skip_serializing_if = "Option::is_none")]
310 pub balance: Option<AccountUnits>,
311
312 #[serde(rename = "createdByUserID", skip_serializing_if = "Option::is_none")]
314 pub created_by_user_id: Option<i64>,
315
316 #[serde(rename = "createdTime", skip_serializing_if = "Option::is_none")]
318 pub created_time: Option<DateTime>,
319
320 #[serde(
322 rename = "guaranteedStopLossOrderMode",
323 skip_serializing_if = "Option::is_none"
324 )]
325 pub guaranteed_stop_loss_order_mode: Option<GuaranteedStopLossOrderMode>,
326
327 #[serde(rename = "pl", skip_serializing_if = "Option::is_none")]
329 pub pl: Option<AccountUnits>,
330
331 #[serde(rename = "resettablePL", skip_serializing_if = "Option::is_none")]
334 pub resettable_pl: Option<AccountUnits>,
335
336 #[serde(rename = "resettablePLTime", skip_serializing_if = "Option::is_none")]
338 pub resettable_pl_time: Option<DateTime>,
339
340 #[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
343 pub financing: Option<AccountUnits>,
344
345 #[serde(rename = "commission", skip_serializing_if = "Option::is_none")]
347 pub commission: Option<AccountUnits>,
348
349 #[serde(
352 rename = "guaranteedExecutionFees",
353 skip_serializing_if = "Option::is_none"
354 )]
355 pub guaranteed_execution_fees: Option<AccountUnits>,
356
357 #[serde(rename = "marginRate", skip_serializing_if = "Option::is_none")]
362 pub margin_rate: Option<DecimalNumber>,
363
364 #[serde(
367 rename = "marginCallEnterTime",
368 skip_serializing_if = "Option::is_none"
369 )]
370 pub margin_call_enter_time: Option<DateTime>,
371
372 #[serde(
374 rename = "marginCallExtensionCount",
375 skip_serializing_if = "Option::is_none"
376 )]
377 pub margin_call_extension_count: Option<i64>,
378
379 #[serde(
381 rename = "lastMarginCallExtensionTime",
382 skip_serializing_if = "Option::is_none"
383 )]
384 pub last_margin_call_extension_time: Option<DateTime>,
385
386 #[serde(rename = "openTradeCount", skip_serializing_if = "Option::is_none")]
388 pub open_trade_count: Option<i64>,
389
390 #[serde(rename = "openPositionCount", skip_serializing_if = "Option::is_none")]
392 pub open_position_count: Option<i64>,
393
394 #[serde(rename = "pendingOrderCount", skip_serializing_if = "Option::is_none")]
396 pub pending_order_count: Option<i64>,
397
398 #[serde(rename = "hedgingEnabled", skip_serializing_if = "Option::is_none")]
400 pub hedging_enabled: Option<bool>,
401
402 #[serde(
404 rename = "lastOrderFillTimestamp",
405 skip_serializing_if = "Option::is_none"
406 )]
407 pub last_order_fill_timestamp: Option<DateTime>,
408
409 #[serde(rename = "unrealizedPL", skip_serializing_if = "Option::is_none")]
412 pub unrealized_pl: Option<AccountUnits>,
413
414 #[serde(rename = "NAV", skip_serializing_if = "Option::is_none")]
417 pub nav: Option<AccountUnits>,
418
419 #[serde(rename = "marginUsed", skip_serializing_if = "Option::is_none")]
421 pub margin_used: Option<AccountUnits>,
422
423 #[serde(rename = "marginAvailable", skip_serializing_if = "Option::is_none")]
425 pub margin_available: Option<AccountUnits>,
426
427 #[serde(rename = "positionValue", skip_serializing_if = "Option::is_none")]
430 pub position_value: Option<AccountUnits>,
431
432 #[serde(
434 rename = "marginCloseoutUnrealizedPL",
435 skip_serializing_if = "Option::is_none"
436 )]
437 pub margin_closeout_unrealized_pl: Option<AccountUnits>,
438
439 #[serde(rename = "marginCloseoutNAV", skip_serializing_if = "Option::is_none")]
441 pub margin_closeout_nav: Option<AccountUnits>,
442
443 #[serde(
445 rename = "marginCloseoutMarginUsed",
446 skip_serializing_if = "Option::is_none"
447 )]
448 pub margin_closeout_margin_used: Option<AccountUnits>,
449
450 #[serde(
453 rename = "marginCloseoutPercent",
454 skip_serializing_if = "Option::is_none"
455 )]
456 pub margin_closeout_percent: Option<DecimalNumber>,
457
458 #[serde(
461 rename = "marginCloseoutPositionValue",
462 skip_serializing_if = "Option::is_none"
463 )]
464 pub margin_closeout_position_value: Option<DecimalNumber>,
465
466 #[serde(rename = "withdrawalLimit", skip_serializing_if = "Option::is_none")]
469 pub withdrawal_limit: Option<AccountUnits>,
470
471 #[serde(
473 rename = "marginCallMarginUsed",
474 skip_serializing_if = "Option::is_none"
475 )]
476 pub margin_call_margin_used: Option<AccountUnits>,
477
478 #[serde(rename = "marginCallPercent", skip_serializing_if = "Option::is_none")]
481 pub margin_call_percent: Option<DecimalNumber>,
482
483 #[serde(rename = "lastTransactionID", skip_serializing_if = "Option::is_none")]
485 pub last_transaction_id: Option<TransactionId>,
486
487 #[serde(rename = "trades", default, skip_serializing_if = "Vec::is_empty")]
489 pub trades: Vec<TradeSummary>,
490
491 #[serde(rename = "positions", default, skip_serializing_if = "Vec::is_empty")]
493 pub positions: Vec<Position>,
494
495 #[serde(rename = "orders", default, skip_serializing_if = "Vec::is_empty")]
497 pub orders: Vec<Order>,
498
499 #[serde(rename = "dividendAdjustment", skip_serializing_if = "Option::is_none")]
502 pub dividend_adjustment: Option<DecimalNumber>,
503
504 #[serde(rename = "trueNAV", skip_serializing_if = "Option::is_none")]
508 pub true_nav: Option<DecimalNumber>,
509
510 #[serde(rename = "trueUnrealizedPL", skip_serializing_if = "Option::is_none")]
514 pub true_unrealized_pl: Option<DecimalNumber>,
515
516 #[serde(
520 rename = "lastDividendAdjustmentTimestamps",
521 default,
522 skip_serializing_if = "Vec::is_empty"
523 )]
524 pub last_dividend_adjustment_timestamps: Vec<DividendAdjustmentTimestamp>,
525}
526
527#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
531#[non_exhaustive]
532pub struct AccountChanges {
533 #[serde(
536 rename = "ordersCreated",
537 default,
538 skip_serializing_if = "Vec::is_empty"
539 )]
540 pub orders_created: Vec<Order>,
541
542 #[serde(
544 rename = "ordersCancelled",
545 default,
546 skip_serializing_if = "Vec::is_empty"
547 )]
548 pub orders_cancelled: Vec<Order>,
549
550 #[serde(
552 rename = "ordersFilled",
553 default,
554 skip_serializing_if = "Vec::is_empty"
555 )]
556 pub orders_filled: Vec<Order>,
557
558 #[serde(
560 rename = "ordersTriggered",
561 default,
562 skip_serializing_if = "Vec::is_empty"
563 )]
564 pub orders_triggered: Vec<Order>,
565
566 #[serde(
568 rename = "tradesOpened",
569 default,
570 skip_serializing_if = "Vec::is_empty"
571 )]
572 pub trades_opened: Vec<TradeSummary>,
573
574 #[serde(
576 rename = "tradesReduced",
577 default,
578 skip_serializing_if = "Vec::is_empty"
579 )]
580 pub trades_reduced: Vec<TradeSummary>,
581
582 #[serde(
584 rename = "tradesClosed",
585 default,
586 skip_serializing_if = "Vec::is_empty"
587 )]
588 pub trades_closed: Vec<TradeSummary>,
589
590 #[serde(rename = "positions", default, skip_serializing_if = "Vec::is_empty")]
592 pub positions: Vec<Position>,
593
594 #[serde(
596 rename = "transactions",
597 default,
598 skip_serializing_if = "Vec::is_empty"
599 )]
600 pub transactions: Vec<Transaction>,
601}
602
603#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
608#[non_exhaustive]
609pub struct AccountChangesState {
610 #[serde(rename = "unrealizedPL", skip_serializing_if = "Option::is_none")]
613 pub unrealized_pl: Option<AccountUnits>,
614
615 #[serde(rename = "NAV", skip_serializing_if = "Option::is_none")]
618 pub nav: Option<AccountUnits>,
619
620 #[serde(rename = "marginUsed", skip_serializing_if = "Option::is_none")]
622 pub margin_used: Option<AccountUnits>,
623
624 #[serde(rename = "marginAvailable", skip_serializing_if = "Option::is_none")]
626 pub margin_available: Option<AccountUnits>,
627
628 #[serde(rename = "positionValue", skip_serializing_if = "Option::is_none")]
631 pub position_value: Option<AccountUnits>,
632
633 #[serde(
635 rename = "marginCloseoutUnrealizedPL",
636 skip_serializing_if = "Option::is_none"
637 )]
638 pub margin_closeout_unrealized_pl: Option<AccountUnits>,
639
640 #[serde(rename = "marginCloseoutNAV", skip_serializing_if = "Option::is_none")]
642 pub margin_closeout_nav: Option<AccountUnits>,
643
644 #[serde(
646 rename = "marginCloseoutMarginUsed",
647 skip_serializing_if = "Option::is_none"
648 )]
649 pub margin_closeout_margin_used: Option<AccountUnits>,
650
651 #[serde(
654 rename = "marginCloseoutPercent",
655 skip_serializing_if = "Option::is_none"
656 )]
657 pub margin_closeout_percent: Option<DecimalNumber>,
658
659 #[serde(
662 rename = "marginCloseoutPositionValue",
663 skip_serializing_if = "Option::is_none"
664 )]
665 pub margin_closeout_position_value: Option<DecimalNumber>,
666
667 #[serde(rename = "withdrawalLimit", skip_serializing_if = "Option::is_none")]
670 pub withdrawal_limit: Option<AccountUnits>,
671
672 #[serde(
674 rename = "marginCallMarginUsed",
675 skip_serializing_if = "Option::is_none"
676 )]
677 pub margin_call_margin_used: Option<AccountUnits>,
678
679 #[serde(rename = "marginCallPercent", skip_serializing_if = "Option::is_none")]
682 pub margin_call_percent: Option<DecimalNumber>,
683
684 #[serde(rename = "orders", default, skip_serializing_if = "Vec::is_empty")]
686 pub orders: Vec<DynamicOrderState>,
687
688 #[serde(rename = "trades", default, skip_serializing_if = "Vec::is_empty")]
690 pub trades: Vec<CalculatedTradeState>,
691
692 #[serde(rename = "positions", default, skip_serializing_if = "Vec::is_empty")]
694 pub positions: Vec<CalculatedPositionState>,
695
696 #[serde(rename = "trueNAV", skip_serializing_if = "Option::is_none")]
700 pub true_nav: Option<DecimalNumber>,
701
702 #[serde(rename = "trueUnrealizedPL", skip_serializing_if = "Option::is_none")]
706 pub true_unrealized_pl: Option<DecimalNumber>,
707}
708
709#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
711#[non_exhaustive]
712pub struct CalculatedAccountState {
713 #[serde(rename = "unrealizedPL", skip_serializing_if = "Option::is_none")]
716 pub unrealized_pl: Option<AccountUnits>,
717
718 #[serde(rename = "NAV", skip_serializing_if = "Option::is_none")]
721 pub nav: Option<AccountUnits>,
722
723 #[serde(rename = "marginUsed", skip_serializing_if = "Option::is_none")]
725 pub margin_used: Option<AccountUnits>,
726
727 #[serde(rename = "marginAvailable", skip_serializing_if = "Option::is_none")]
729 pub margin_available: Option<AccountUnits>,
730
731 #[serde(rename = "positionValue", skip_serializing_if = "Option::is_none")]
734 pub position_value: Option<AccountUnits>,
735
736 #[serde(
738 rename = "marginCloseoutUnrealizedPL",
739 skip_serializing_if = "Option::is_none"
740 )]
741 pub margin_closeout_unrealized_pl: Option<AccountUnits>,
742
743 #[serde(rename = "marginCloseoutNAV", skip_serializing_if = "Option::is_none")]
745 pub margin_closeout_nav: Option<AccountUnits>,
746
747 #[serde(
749 rename = "marginCloseoutMarginUsed",
750 skip_serializing_if = "Option::is_none"
751 )]
752 pub margin_closeout_margin_used: Option<AccountUnits>,
753
754 #[serde(
757 rename = "marginCloseoutPercent",
758 skip_serializing_if = "Option::is_none"
759 )]
760 pub margin_closeout_percent: Option<DecimalNumber>,
761
762 #[serde(
765 rename = "marginCloseoutPositionValue",
766 skip_serializing_if = "Option::is_none"
767 )]
768 pub margin_closeout_position_value: Option<DecimalNumber>,
769
770 #[serde(rename = "withdrawalLimit", skip_serializing_if = "Option::is_none")]
773 pub withdrawal_limit: Option<AccountUnits>,
774
775 #[serde(
777 rename = "marginCallMarginUsed",
778 skip_serializing_if = "Option::is_none"
779 )]
780 pub margin_call_margin_used: Option<AccountUnits>,
781
782 #[serde(rename = "marginCallPercent", skip_serializing_if = "Option::is_none")]
785 pub margin_call_percent: Option<DecimalNumber>,
786
787 #[serde(rename = "dividendAdjustment", skip_serializing_if = "Option::is_none")]
790 pub dividend_adjustment: Option<DecimalNumber>,
791
792 #[serde(rename = "trueNAV", skip_serializing_if = "Option::is_none")]
796 pub true_nav: Option<DecimalNumber>,
797
798 #[serde(rename = "trueUnrealizedPL", skip_serializing_if = "Option::is_none")]
802 pub true_unrealized_pl: Option<DecimalNumber>,
803
804 #[serde(
808 rename = "lastDividendAdjustmentTimestamps",
809 default,
810 skip_serializing_if = "Vec::is_empty"
811 )]
812 pub last_dividend_adjustment_timestamps: Vec<DividendAdjustmentTimestamp>,
813}