1use serde::{Deserialize, Serialize};
5
6use crate::models::macros::string_enum;
7use crate::models::transaction::MarketOrderReason;
8use crate::models::{
9 AccountFinancingMode, AccountId, AccountUnits, DateTime, DecimalNumber, HomeConversionFactors,
10 InstrumentName, OpenTradeDividendAdjustment, PositionFinancing, RequestId, TradeId,
11 TransactionId,
12};
13
14#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
17#[non_exhaustive]
18pub struct MarginCallEnterTransaction {
19 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
21 pub id: Option<TransactionId>,
22
23 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
25 pub time: Option<DateTime>,
26
27 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
29 pub user_id: Option<i64>,
30
31 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
33 pub account_id: Option<AccountId>,
34
35 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
38 pub batch_id: Option<TransactionId>,
39
40 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
42 pub request_id: Option<RequestId>,
43 }
45
46#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
49#[non_exhaustive]
50pub struct MarginCallExtendTransaction {
51 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
53 pub id: Option<TransactionId>,
54
55 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
57 pub time: Option<DateTime>,
58
59 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
61 pub user_id: Option<i64>,
62
63 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
65 pub account_id: Option<AccountId>,
66
67 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
70 pub batch_id: Option<TransactionId>,
71
72 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
74 pub request_id: Option<RequestId>,
75
76 #[serde(rename = "extensionNumber", skip_serializing_if = "Option::is_none")]
81 pub extension_number: Option<i64>,
82}
83
84#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
87#[non_exhaustive]
88pub struct MarginCallExitTransaction {
89 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
91 pub id: Option<TransactionId>,
92
93 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
95 pub time: Option<DateTime>,
96
97 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
99 pub user_id: Option<i64>,
100
101 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
103 pub account_id: Option<AccountId>,
104
105 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
108 pub batch_id: Option<TransactionId>,
109
110 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
112 pub request_id: Option<RequestId>,
113
114 #[serde(rename = "reason", skip_serializing_if = "Option::is_none")]
118 pub reason: Option<String>,
119}
120
121#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
127#[non_exhaustive]
128pub struct DelayedTradeClosureTransaction {
129 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
131 pub id: Option<TransactionId>,
132
133 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
135 pub time: Option<DateTime>,
136
137 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
139 pub user_id: Option<i64>,
140
141 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
143 pub account_id: Option<AccountId>,
144
145 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
148 pub batch_id: Option<TransactionId>,
149
150 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
152 pub request_id: Option<RequestId>,
153
154 #[serde(rename = "reason", skip_serializing_if = "Option::is_none")]
157 pub reason: Option<MarketOrderReason>,
158
159 #[serde(rename = "tradeIDs", skip_serializing_if = "Option::is_none")]
162 pub trade_ids: Option<TradeId>,
163}
164
165#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
168#[non_exhaustive]
169pub struct DailyFinancingTransaction {
170 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
172 pub id: Option<TransactionId>,
173
174 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
176 pub time: Option<DateTime>,
177
178 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
180 pub user_id: Option<i64>,
181
182 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
184 pub account_id: Option<AccountId>,
185
186 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
189 pub batch_id: Option<TransactionId>,
190
191 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
193 pub request_id: Option<RequestId>,
194
195 #[serde(rename = "financing", skip_serializing_if = "Option::is_none")]
198 pub financing: Option<AccountUnits>,
199
200 #[serde(rename = "accountBalance", skip_serializing_if = "Option::is_none")]
202 pub account_balance: Option<AccountUnits>,
203
204 #[serde(
206 rename = "accountFinancingMode",
207 skip_serializing_if = "Option::is_none"
208 )]
209 pub account_financing_mode: Option<AccountFinancingMode>,
210
211 #[serde(
213 rename = "positionFinancings",
214 default,
215 skip_serializing_if = "Vec::is_empty"
216 )]
217 pub position_financings: Vec<PositionFinancing>,
218
219 #[serde(rename = "homeConversionCost", skip_serializing_if = "Option::is_none")]
223 pub home_conversion_cost: Option<DecimalNumber>,
224
225 #[serde(
229 rename = "baseHomeConversionCost",
230 skip_serializing_if = "Option::is_none"
231 )]
232 pub base_home_conversion_cost: Option<DecimalNumber>,
233}
234
235#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
238#[non_exhaustive]
239pub struct DividendAdjustmentTransaction {
240 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
242 pub id: Option<TransactionId>,
243
244 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
246 pub time: Option<DateTime>,
247
248 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
250 pub user_id: Option<i64>,
251
252 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
254 pub account_id: Option<AccountId>,
255
256 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
259 pub batch_id: Option<TransactionId>,
260
261 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
263 pub request_id: Option<RequestId>,
264
265 #[serde(rename = "instrument", skip_serializing_if = "Option::is_none")]
268 pub instrument: Option<InstrumentName>,
269
270 #[serde(rename = "dividendAdjustment", skip_serializing_if = "Option::is_none")]
274 pub dividend_adjustment: Option<DecimalNumber>,
275
276 #[serde(
279 rename = "quoteDividendAdjustment",
280 skip_serializing_if = "Option::is_none"
281 )]
282 pub quote_dividend_adjustment: Option<DecimalNumber>,
283
284 #[serde(
286 rename = "homeConversionFactors",
287 skip_serializing_if = "Option::is_none"
288 )]
289 pub home_conversion_factors: Option<HomeConversionFactors>,
290
291 #[serde(rename = "accountBalance", skip_serializing_if = "Option::is_none")]
293 pub account_balance: Option<DecimalNumber>,
294
295 #[serde(
297 rename = "openTradeDividendAdjustments",
298 default,
299 skip_serializing_if = "Vec::is_empty"
300 )]
301 pub open_trade_dividend_adjustments: Vec<OpenTradeDividendAdjustment>,
302
303 #[serde(rename = "homeConversionCost", skip_serializing_if = "Option::is_none")]
307 pub home_conversion_cost: Option<DecimalNumber>,
308}
309
310#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
313#[non_exhaustive]
314pub struct ResetResettablePLTransaction {
315 #[serde(rename = "id", skip_serializing_if = "Option::is_none")]
317 pub id: Option<TransactionId>,
318
319 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
321 pub time: Option<DateTime>,
322
323 #[serde(rename = "userID", skip_serializing_if = "Option::is_none")]
325 pub user_id: Option<i64>,
326
327 #[serde(rename = "accountID", skip_serializing_if = "Option::is_none")]
329 pub account_id: Option<AccountId>,
330
331 #[serde(rename = "batchID", skip_serializing_if = "Option::is_none")]
334 pub batch_id: Option<TransactionId>,
335
336 #[serde(rename = "requestID", skip_serializing_if = "Option::is_none")]
338 pub request_id: Option<RequestId>,
339 }
341
342#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
348#[non_exhaustive]
349pub struct LiquidityRegenerationSchedule {
350 #[serde(rename = "steps", default, skip_serializing_if = "Vec::is_empty")]
352 pub steps: Vec<LiquidityRegenerationScheduleStep>,
353}
354
355#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
359#[non_exhaustive]
360pub struct LiquidityRegenerationScheduleStep {
361 #[serde(rename = "timestamp", skip_serializing_if = "Option::is_none")]
363 pub timestamp: Option<DateTime>,
364
365 #[serde(rename = "bidLiquidityUsed", skip_serializing_if = "Option::is_none")]
367 pub bid_liquidity_used: Option<DecimalNumber>,
368
369 #[serde(rename = "askLiquidityUsed", skip_serializing_if = "Option::is_none")]
371 pub ask_liquidity_used: Option<DecimalNumber>,
372}
373
374string_enum! {
375 pub enum TransactionType {
377 Create => "CREATE",
378 Close => "CLOSE",
379 Reopen => "REOPEN",
380 ClientConfigure => "CLIENT_CONFIGURE",
381 ClientConfigureReject => "CLIENT_CONFIGURE_REJECT",
382 TransferFunds => "TRANSFER_FUNDS",
383 TransferFundsReject => "TRANSFER_FUNDS_REJECT",
384 MarketOrder => "MARKET_ORDER",
385 MarketOrderReject => "MARKET_ORDER_REJECT",
386 FixedPriceOrder => "FIXED_PRICE_ORDER",
387 LimitOrder => "LIMIT_ORDER",
388 LimitOrderReject => "LIMIT_ORDER_REJECT",
389 StopOrder => "STOP_ORDER",
390 StopOrderReject => "STOP_ORDER_REJECT",
391 MarketIfTouchedOrder => "MARKET_IF_TOUCHED_ORDER",
392 MarketIfTouchedOrderReject => "MARKET_IF_TOUCHED_ORDER_REJECT",
393 TakeProfitOrder => "TAKE_PROFIT_ORDER",
394 TakeProfitOrderReject => "TAKE_PROFIT_ORDER_REJECT",
395 StopLossOrder => "STOP_LOSS_ORDER",
396 StopLossOrderReject => "STOP_LOSS_ORDER_REJECT",
397 TrailingStopLossOrder => "TRAILING_STOP_LOSS_ORDER",
398 TrailingStopLossOrderReject => "TRAILING_STOP_LOSS_ORDER_REJECT",
399 OrderFill => "ORDER_FILL",
400 OrderCancel => "ORDER_CANCEL",
401 OrderCancelReject => "ORDER_CANCEL_REJECT",
402 OrderClientExtensionsModify => "ORDER_CLIENT_EXTENSIONS_MODIFY",
403 OrderClientExtensionsModifyReject => "ORDER_CLIENT_EXTENSIONS_MODIFY_REJECT",
404 TradeClientExtensionsModify => "TRADE_CLIENT_EXTENSIONS_MODIFY",
405 TradeClientExtensionsModifyReject => "TRADE_CLIENT_EXTENSIONS_MODIFY_REJECT",
406 MarginCallEnter => "MARGIN_CALL_ENTER",
407 MarginCallExtend => "MARGIN_CALL_EXTEND",
408 MarginCallExit => "MARGIN_CALL_EXIT",
409 DelayedTradeClosure => "DELAYED_TRADE_CLOSURE",
410 DailyFinancing => "DAILY_FINANCING",
411 ResetResettablePl => "RESET_RESETTABLE_PL",
412 DividendAdjustment => "DIVIDEND_ADJUSTMENT",
413 }
414}
415
416string_enum! {
417 pub enum TransactionFilter {
419 Order => "ORDER",
420 Funding => "FUNDING",
421 Admin => "ADMIN",
422 Create => "CREATE",
423 Close => "CLOSE",
424 Reopen => "REOPEN",
425 ClientConfigure => "CLIENT_CONFIGURE",
426 ClientConfigureReject => "CLIENT_CONFIGURE_REJECT",
427 TransferFunds => "TRANSFER_FUNDS",
428 TransferFundsReject => "TRANSFER_FUNDS_REJECT",
429 MarketOrder => "MARKET_ORDER",
430 MarketOrderReject => "MARKET_ORDER_REJECT",
431 LimitOrder => "LIMIT_ORDER",
432 LimitOrderReject => "LIMIT_ORDER_REJECT",
433 StopOrder => "STOP_ORDER",
434 StopOrderReject => "STOP_ORDER_REJECT",
435 MarketIfTouchedOrder => "MARKET_IF_TOUCHED_ORDER",
436 MarketIfTouchedOrderReject => "MARKET_IF_TOUCHED_ORDER_REJECT",
437 TakeProfitOrder => "TAKE_PROFIT_ORDER",
438 TakeProfitOrderReject => "TAKE_PROFIT_ORDER_REJECT",
439 StopLossOrder => "STOP_LOSS_ORDER",
440 StopLossOrderReject => "STOP_LOSS_ORDER_REJECT",
441 TrailingStopLossOrder => "TRAILING_STOP_LOSS_ORDER",
442 TrailingStopLossOrderReject => "TRAILING_STOP_LOSS_ORDER_REJECT",
443 OneCancelsAllOrder => "ONE_CANCELS_ALL_ORDER",
444 OneCancelsAllOrderReject => "ONE_CANCELS_ALL_ORDER_REJECT",
445 OneCancelsAllOrderTriggered => "ONE_CANCELS_ALL_ORDER_TRIGGERED",
446 OrderFill => "ORDER_FILL",
447 OrderCancel => "ORDER_CANCEL",
448 OrderCancelReject => "ORDER_CANCEL_REJECT",
449 OrderClientExtensionsModify => "ORDER_CLIENT_EXTENSIONS_MODIFY",
450 OrderClientExtensionsModifyReject => "ORDER_CLIENT_EXTENSIONS_MODIFY_REJECT",
451 TradeClientExtensionsModify => "TRADE_CLIENT_EXTENSIONS_MODIFY",
452 TradeClientExtensionsModifyReject => "TRADE_CLIENT_EXTENSIONS_MODIFY_REJECT",
453 MarginCallEnter => "MARGIN_CALL_ENTER",
454 MarginCallExtend => "MARGIN_CALL_EXTEND",
455 MarginCallExit => "MARGIN_CALL_EXIT",
456 DelayedTradeClosure => "DELAYED_TRADE_CLOSURE",
457 DailyFinancing => "DAILY_FINANCING",
458 ResetResettablePl => "RESET_RESETTABLE_PL",
459 }
460}
461
462#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
465#[non_exhaustive]
466pub struct TransactionHeartbeat {
467 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
469 pub r#type: Option<String>,
470
471 #[serde(rename = "lastTransactionID", skip_serializing_if = "Option::is_none")]
473 pub last_transaction_id: Option<TransactionId>,
474
475 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
477 pub time: Option<DateTime>,
478}
479
480#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
483#[non_exhaustive]
484pub struct MT4TransactionHeartbeat {
485 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
487 pub r#type: Option<String>,
488
489 #[serde(rename = "time", skip_serializing_if = "Option::is_none")]
491 pub time: Option<DateTime>,
492}