1use super::order::{Direction, OrderType, Status, TimeInForce};
7use crate::application::models::market::InstrumentType;
8use crate::impl_json_display;
9use crate::presentation::MarketState;
10use serde::{Deserialize, Serialize};
11
12#[derive(Debug, Clone, Deserialize)]
14pub struct AccountInfo {
15 pub accounts: Vec<Account>,
17}
18
19#[derive(Debug, Clone, Deserialize)]
21pub struct Account {
22 #[serde(rename = "accountId")]
24 pub account_id: String,
25 #[serde(rename = "accountName")]
27 pub account_name: String,
28 #[serde(rename = "accountType")]
30 pub account_type: String,
31 pub balance: AccountBalance,
33 pub currency: String,
35 pub status: String,
37 pub preferred: bool,
39}
40
41#[derive(Debug, Clone, Deserialize)]
43pub struct AccountBalance {
44 pub balance: f64,
46 pub deposit: f64,
48 #[serde(rename = "profitLoss")]
50 pub profit_loss: f64,
51 pub available: f64,
53}
54
55#[derive(Debug, Clone, Deserialize)]
57pub struct AccountActivity {
58 pub activities: Vec<Activity>,
60 pub metadata: Option<ActivityMetadata>,
62}
63
64#[derive(Debug, Clone, Deserialize)]
66pub struct ActivityMetadata {
67 pub paging: Option<ActivityPaging>,
69}
70
71#[derive(Debug, Clone, Deserialize)]
73pub struct ActivityPaging {
74 pub size: Option<i32>,
76 pub next: Option<String>,
78}
79
80#[derive(Debug, Copy, Clone, Deserialize, Serialize)]
81pub enum ActivityType {
83 #[serde(rename = "EDIT_STOP_AND_LIMIT")]
85 EditStopAndLimit,
86 #[serde(rename = "POSITION")]
88 Position,
89 #[serde(rename = "SYSTEM")]
91 System,
92 #[serde(rename = "WORKING_ORDER")]
94 WorkingOrder,
95}
96
97#[derive(Debug, Clone, Deserialize, Serialize)]
99pub struct Activity {
100 pub date: String,
102 #[serde(rename = "dealId", default)]
104 pub deal_id: Option<String>,
105 #[serde(default)]
107 pub epic: Option<String>,
108 #[serde(default)]
110 pub period: Option<String>,
111 #[serde(rename = "dealReference", default)]
113 pub deal_reference: Option<String>,
114 #[serde(rename = "type")]
116 pub activity_type: ActivityType,
117 #[serde(default)]
119 pub status: Option<Status>,
120 #[serde(default)]
122 pub description: Option<String>,
123 #[serde(default)]
126 pub details: Option<ActivityDetails>,
127 #[serde(default)]
129 pub channel: Option<String>,
130 #[serde(default)]
132 pub currency: Option<String>,
133 #[serde(default)]
135 pub level: Option<String>,
136}
137
138#[derive(Debug, Clone, Deserialize, Serialize)]
141pub struct ActivityDetails {
142 #[serde(rename = "dealReference", default)]
144 pub deal_reference: Option<String>,
145 #[serde(default)]
147 pub actions: Vec<ActivityAction>,
148 #[serde(rename = "marketName", default)]
150 pub market_name: Option<String>,
151 #[serde(rename = "goodTillDate", default)]
153 pub good_till_date: Option<String>,
154 #[serde(default)]
156 pub currency: Option<String>,
157 #[serde(default)]
159 pub size: Option<f64>,
160 #[serde(default)]
162 pub direction: Option<Direction>,
163 #[serde(default)]
165 pub level: Option<f64>,
166 #[serde(rename = "stopLevel", default)]
168 pub stop_level: Option<f64>,
169 #[serde(rename = "stopDistance", default)]
171 pub stop_distance: Option<f64>,
172 #[serde(rename = "guaranteedStop", default)]
174 pub guaranteed_stop: Option<bool>,
175 #[serde(rename = "trailingStopDistance", default)]
177 pub trailing_stop_distance: Option<f64>,
178 #[serde(rename = "trailingStep", default)]
180 pub trailing_step: Option<f64>,
181 #[serde(rename = "limitLevel", default)]
183 pub limit_level: Option<f64>,
184 #[serde(rename = "limitDistance", default)]
186 pub limit_distance: Option<f64>,
187}
188
189#[derive(Debug, Copy, Clone, Deserialize, Serialize)]
191pub enum ActionType {
192 #[serde(rename = "LIMIT_ORDER_DELETED")]
194 LimitOrderDeleted,
195 #[serde(rename = "LIMIT_ORDER_FILLED")]
197 LimitOrderFilled,
198 #[serde(rename = "LIMIT_ORDER_OPENED")]
200 LimitOrderOpened,
201 #[serde(rename = "LIMIT_ORDER_ROLLED")]
203 LimitOrderRolled,
204 #[serde(rename = "POSITION_CLOSED")]
206 PositionClosed,
207 #[serde(rename = "POSITION_DELETED")]
209 PositionDeleted,
210 #[serde(rename = "POSITION_OPENED")]
212 PositionOpened,
213 #[serde(rename = "POSITION_PARTIALLY_CLOSED")]
215 PositionPartiallyClosed,
216 #[serde(rename = "POSITION_ROLLED")]
218 PositionRolled,
219 #[serde(rename = "STOP_LIMIT_AMENDED")]
221 StopLimitAmended,
222 #[serde(rename = "STOP_ORDER_AMENDED")]
224 StopOrderAmended,
225 #[serde(rename = "STOP_ORDER_DELETED")]
227 StopOrderDeleted,
228 #[serde(rename = "STOP_ORDER_FILLED")]
230 StopOrderFilled,
231 #[serde(rename = "STOP_ORDER_OPENED")]
233 StopOrderOpened,
234 #[serde(rename = "STOP_ORDER_ROLLED")]
236 StopOrderRolled,
237 #[serde(rename = "UNKNOWN")]
239 Unknown,
240 #[serde(rename = "WORKING_ORDER_DELETED")]
242 WorkingOrderDeleted,
243}
244
245impl_json_display!(ActionType);
246
247#[derive(Debug, Clone, Deserialize, Serialize)]
249pub struct ActivityAction {
250 #[serde(rename = "actionType")]
252 pub action_type: ActionType,
253 #[serde(rename = "affectedDealId", default)]
255 pub affected_deal_id: Option<String>,
256}
257
258#[derive(Debug, Clone, Deserialize, Serialize)]
260pub struct Positions {
261 pub positions: Vec<Position>,
263}
264
265#[derive(Debug, Clone, Serialize, Deserialize)]
267pub struct Position {
268 pub position: PositionDetails,
270 pub market: PositionMarket,
272 pub pnl: Option<f64>,
274}
275
276#[derive(Debug, Clone, Deserialize, Serialize)]
278pub struct PositionDetails {
279 #[serde(rename = "contractSize")]
281 pub contract_size: f64,
282 #[serde(rename = "createdDate")]
284 pub created_date: String,
285 #[serde(rename = "createdDateUTC")]
287 pub created_date_utc: String,
288 #[serde(rename = "dealId")]
290 pub deal_id: String,
291 #[serde(rename = "dealReference")]
293 pub deal_reference: String,
294 pub direction: Direction,
296 #[serde(rename = "limitLevel")]
298 pub limit_level: Option<f64>,
299 pub level: f64,
301 pub size: f64,
303 #[serde(rename = "stopLevel")]
305 pub stop_level: Option<f64>,
306 #[serde(rename = "trailingStep")]
308 pub trailing_step: Option<f64>,
309 #[serde(rename = "trailingStopDistance")]
311 pub trailing_stop_distance: Option<f64>,
312 pub currency: String,
314 #[serde(rename = "controlledRisk")]
316 pub controlled_risk: bool,
317 #[serde(rename = "limitedRiskPremium")]
319 pub limited_risk_premium: Option<f64>,
320}
321
322#[derive(Debug, Clone, Deserialize, Serialize)]
324pub struct PositionMarket {
325 #[serde(rename = "instrumentName")]
327 pub instrument_name: String,
328 pub expiry: String,
330 pub epic: String,
332 #[serde(rename = "instrumentType")]
334 pub instrument_type: String,
335 #[serde(rename = "lotSize")]
337 pub lot_size: f64,
338 pub high: f64,
340 pub low: f64,
342 #[serde(rename = "percentageChange")]
344 pub percentage_change: f64,
345 #[serde(rename = "netChange")]
347 pub net_change: f64,
348 pub bid: f64,
350 pub offer: f64,
352 #[serde(rename = "updateTime")]
354 pub update_time: String,
355 #[serde(rename = "updateTimeUTC")]
357 pub update_time_utc: String,
358 #[serde(rename = "delayTime")]
360 pub delay_time: i64,
361 #[serde(rename = "streamingPricesAvailable")]
363 pub streaming_prices_available: bool,
364 #[serde(rename = "marketStatus")]
366 pub market_status: String,
367 #[serde(rename = "scalingFactor")]
369 pub scaling_factor: i64,
370}
371
372#[derive(Debug, Clone, Deserialize, Serialize)]
374pub struct WorkingOrders {
375 #[serde(rename = "workingOrders")]
377 pub working_orders: Vec<WorkingOrder>,
378}
379
380#[derive(Debug, Clone, Deserialize, Serialize)]
382pub struct WorkingOrder {
383 #[serde(rename = "workingOrderData")]
385 pub working_order_data: WorkingOrderData,
386 #[serde(rename = "marketData")]
388 pub market_data: MarketData,
389}
390
391#[derive(Debug, Clone, Deserialize, Serialize)]
393pub struct WorkingOrderData {
394 #[serde(rename = "dealId")]
396 pub deal_id: String,
397 pub direction: Direction,
399 pub epic: String,
401 #[serde(rename = "orderSize")]
403 pub order_size: f64,
404 #[serde(rename = "orderLevel")]
406 pub order_level: f64,
407 #[serde(rename = "timeInForce")]
409 pub time_in_force: TimeInForce,
410 #[serde(rename = "goodTillDate")]
412 pub good_till_date: Option<String>,
413 #[serde(rename = "goodTillDateISO")]
415 pub good_till_date_iso: Option<String>,
416 #[serde(rename = "createdDate")]
418 pub created_date: String,
419 #[serde(rename = "createdDateUTC")]
421 pub created_date_utc: String,
422 #[serde(rename = "guaranteedStop")]
424 pub guaranteed_stop: bool,
425 #[serde(rename = "orderType")]
427 pub order_type: OrderType,
428 #[serde(rename = "stopDistance")]
430 pub stop_distance: Option<f64>,
431 #[serde(rename = "limitDistance")]
433 pub limit_distance: Option<f64>,
434 #[serde(rename = "currencyCode")]
436 pub currency_code: String,
437 pub dma: bool,
439 #[serde(rename = "limitedRiskPremium")]
441 pub limited_risk_premium: Option<f64>,
442 #[serde(rename = "limitLevel", default)]
444 pub limit_level: Option<f64>,
445 #[serde(rename = "stopLevel", default)]
447 pub stop_level: Option<f64>,
448 #[serde(rename = "dealReference", default)]
450 pub deal_reference: Option<String>,
451}
452
453#[derive(Debug, Clone, Deserialize, Serialize)]
455pub struct MarketData {
456 #[serde(rename = "instrumentName")]
458 pub instrument_name: String,
459 #[serde(rename = "exchangeId")]
461 pub exchange_id: String,
462 pub expiry: String,
464 #[serde(rename = "marketStatus")]
466 pub market_status: MarketState,
467 pub epic: String,
469 #[serde(rename = "instrumentType")]
471 pub instrument_type: InstrumentType,
472 #[serde(rename = "lotSize")]
474 pub lot_size: f64,
475 pub high: f64,
477 pub low: f64,
479 #[serde(rename = "percentageChange")]
481 pub percentage_change: f64,
482 #[serde(rename = "netChange")]
484 pub net_change: f64,
485 pub bid: f64,
487 pub offer: f64,
489 #[serde(rename = "updateTime")]
491 pub update_time: String,
492 #[serde(rename = "updateTimeUTC")]
494 pub update_time_utc: String,
495 #[serde(rename = "delayTime")]
497 pub delay_time: i64,
498 #[serde(rename = "streamingPricesAvailable")]
500 pub streaming_prices_available: bool,
501 #[serde(rename = "scalingFactor")]
503 pub scaling_factor: i64,
504}
505
506#[derive(Debug, Clone, Deserialize, Serialize)]
508pub struct TransactionHistory {
509 pub transactions: Vec<AccountTransaction>,
511 pub metadata: TransactionMetadata,
513}
514
515#[derive(Debug, Clone, Deserialize, Serialize)]
517pub struct TransactionMetadata {
518 #[serde(rename = "pageData")]
520 pub page_data: PageData,
521 pub size: i32,
523}
524
525#[derive(Debug, Clone, Deserialize, Serialize)]
527pub struct PageData {
528 #[serde(rename = "pageNumber")]
530 pub page_number: i32,
531 #[serde(rename = "pageSize")]
533 pub page_size: i32,
534 #[serde(rename = "totalPages")]
536 pub total_pages: i32,
537}
538
539#[derive(Debug, Clone, Deserialize, Serialize)]
541pub struct AccountTransaction {
542 pub date: String,
544 #[serde(rename = "dateUtc")]
546 pub date_utc: String,
547 #[serde(rename = "openDateUtc")]
549 pub open_date_utc: String,
550 #[serde(rename = "instrumentName")]
552 pub instrument_name: String,
553 pub period: String,
555 #[serde(rename = "profitAndLoss")]
557 pub profit_and_loss: String,
558 #[serde(rename = "transactionType")]
560 pub transaction_type: String,
561 pub reference: String,
563 #[serde(rename = "openLevel")]
565 pub open_level: String,
566 #[serde(rename = "closeLevel")]
568 pub close_level: String,
569 pub size: String,
571 pub currency: String,
573 #[serde(rename = "cashTransaction")]
575 pub cash_transaction: bool,
576}
577
578impl_json_display!(AccountTransaction);