1#[allow(unused_imports)]
4use crate::Timestamp;
5#[allow(unused_imports)]
6use crate::ids::*;
7#[allow(unused_imports)]
8use crate::models::*;
9#[allow(unused_imports)]
10use crate::{Client, Result};
11#[allow(unused_imports)]
12use reqwest::Method;
13#[allow(unused_imports)]
14use rust_decimal::Decimal;
15#[allow(unused_imports)]
16use serde::{Deserialize, Serialize};
17
18#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
20#[serde(rename_all = "camelCase")]
21pub struct ListTradesQuery {
22 #[serde(rename = "ids", default, skip_serializing_if = "Option::is_none")]
24 pub ids: Option<Vec<TradeID>>,
25 #[serde(rename = "state", default, skip_serializing_if = "Option::is_none")]
27 pub state: Option<TradeStateFilter>,
28 #[serde(
30 rename = "instrument",
31 default,
32 skip_serializing_if = "Option::is_none"
33 )]
34 pub instrument: Option<InstrumentName>,
35 #[serde(rename = "count", default, skip_serializing_if = "Option::is_none")]
37 pub count: Option<i64>,
38 #[serde(rename = "beforeID", default, skip_serializing_if = "Option::is_none")]
40 pub before_id: Option<TradeID>,
41}
42
43#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
45#[serde(rename_all = "camelCase")]
46pub struct ListTradesResponse {
47 #[serde(rename = "trades", default, skip_serializing_if = "Option::is_none")]
49 pub trades: Option<Vec<Trade>>,
50 #[serde(
52 rename = "lastTransactionID",
53 default,
54 skip_serializing_if = "Option::is_none"
55 )]
56 pub last_transaction_id: Option<TransactionID>,
57}
58
59impl Client {
60 pub async fn list_trades(
62 &self,
63 account_id: &AccountID,
64 query: Option<&ListTradesQuery>,
65 ) -> std::result::Result<
66 crate::ApiResponse<ListTradesResponse>,
67 crate::OperationError<crate::GenericRejection>,
68 > {
69 let account_id_encoded = crate::client::segment(account_id.as_str());
70 let path = format!("/v3/accounts/{account_id_encoded}/trades");
71 self.execute(Method::GET, &path, query, None::<&()>, None, None)
72 .await
73 }
74}
75
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
78#[serde(rename_all = "camelCase")]
79pub struct ListOpenTradesResponse {
80 #[serde(rename = "trades", default, skip_serializing_if = "Option::is_none")]
82 pub trades: Option<Vec<Trade>>,
83 #[serde(
85 rename = "lastTransactionID",
86 default,
87 skip_serializing_if = "Option::is_none"
88 )]
89 pub last_transaction_id: Option<TransactionID>,
90}
91
92impl Client {
93 pub async fn list_open_trades(
95 &self,
96 account_id: &AccountID,
97 ) -> std::result::Result<
98 crate::ApiResponse<ListOpenTradesResponse>,
99 crate::OperationError<crate::GenericRejection>,
100 > {
101 let account_id_encoded = crate::client::segment(account_id.as_str());
102 let path = format!("/v3/accounts/{account_id_encoded}/openTrades");
103 self.execute(Method::GET, &path, None::<&()>, None::<&()>, None, None)
104 .await
105 }
106}
107
108#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
110#[serde(rename_all = "camelCase")]
111pub struct TradeDetailsResponse {
112 #[serde(rename = "trade", default, skip_serializing_if = "Option::is_none")]
114 pub trade: Option<Trade>,
115 #[serde(
117 rename = "lastTransactionID",
118 default,
119 skip_serializing_if = "Option::is_none"
120 )]
121 pub last_transaction_id: Option<TransactionID>,
122}
123
124impl Client {
125 pub async fn trade_details(
127 &self,
128 account_id: &AccountID,
129 trade_specifier: &TradeSpecifier,
130 ) -> std::result::Result<
131 crate::ApiResponse<TradeDetailsResponse>,
132 crate::OperationError<crate::GenericRejection>,
133 > {
134 let account_id_encoded = crate::client::segment(account_id.as_str());
135 let trade_specifier_encoded = crate::client::segment(trade_specifier.as_str());
136 let path = format!("/v3/accounts/{account_id_encoded}/trades/{trade_specifier_encoded}");
137 self.execute(Method::GET, &path, None::<&()>, None::<&()>, None, None)
138 .await
139 }
140}
141
142#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
144#[serde(rename_all = "camelCase")]
145pub struct CloseTradeBody {
146 #[serde(rename = "units", default, skip_serializing_if = "Option::is_none")]
151 pub units: Option<String>,
152}
153
154#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
156#[serde(rename_all = "camelCase")]
157pub struct CloseTradeResponse {
158 #[serde(
160 rename = "orderCreateTransaction",
161 default,
162 skip_serializing_if = "Option::is_none"
163 )]
164 pub order_create_transaction: Option<MarketOrderTransaction>,
165 #[serde(
167 rename = "orderFillTransaction",
168 default,
169 skip_serializing_if = "Option::is_none"
170 )]
171 pub order_fill_transaction: Option<OrderFillTransaction>,
172 #[serde(
174 rename = "orderCancelTransaction",
175 default,
176 skip_serializing_if = "Option::is_none"
177 )]
178 pub order_cancel_transaction: Option<OrderCancelTransaction>,
179 #[serde(
181 rename = "relatedTransactionIDs",
182 default,
183 skip_serializing_if = "Option::is_none"
184 )]
185 pub related_transaction_ids: Option<Vec<TransactionID>>,
186 #[serde(
188 rename = "lastTransactionID",
189 default,
190 skip_serializing_if = "Option::is_none"
191 )]
192 pub last_transaction_id: Option<TransactionID>,
193}
194
195#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
197#[serde(rename_all = "camelCase")]
198pub struct CloseTradeRejection {
199 #[serde(
201 rename = "orderRejectTransaction",
202 default,
203 skip_serializing_if = "Option::is_none"
204 )]
205 pub order_reject_transaction: Option<MarketOrderRejectTransaction>,
206 #[serde(rename = "errorCode", default, skip_serializing_if = "Option::is_none")]
208 pub error_code: Option<String>,
209 #[serde(
211 rename = "errorMessage",
212 default,
213 skip_serializing_if = "Option::is_none"
214 )]
215 pub error_message: Option<String>,
216 #[serde(
218 rename = "lastTransactionID",
219 default,
220 skip_serializing_if = "Option::is_none"
221 )]
222 pub last_transaction_id: Option<TransactionID>,
223 #[serde(
226 rename = "relatedTransactionIDs",
227 default,
228 skip_serializing_if = "Option::is_none"
229 )]
230 pub related_transaction_ids: Option<Vec<TransactionID>>,
231}
232
233impl Client {
234 pub async fn close_trade(
236 &self,
237 account_id: &AccountID,
238 trade_specifier: &TradeSpecifier,
239 body: &CloseTradeBody,
240 ) -> std::result::Result<
241 crate::ApiResponse<CloseTradeResponse>,
242 crate::OperationError<CloseTradeRejection>,
243 > {
244 let account_id_encoded = crate::client::segment(account_id.as_str());
245 let trade_specifier_encoded = crate::client::segment(trade_specifier.as_str());
246 let path =
247 format!("/v3/accounts/{account_id_encoded}/trades/{trade_specifier_encoded}/close");
248 self.execute(
249 Method::PUT,
250 &path,
251 None::<&()>,
252 Some(body),
253 Some(crate::client::MutationAdmission::Exit(account_id)),
254 None,
255 )
256 .await
257 }
258}
259
260#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
262#[serde(rename_all = "camelCase")]
263pub struct UpdateTradeClientExtensionsBody {
264 #[serde(
267 rename = "clientExtensions",
268 default,
269 skip_serializing_if = "Option::is_none"
270 )]
271 pub client_extensions: Option<ClientExtensions>,
272}
273
274#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
276#[serde(rename_all = "camelCase")]
277pub struct UpdateTradeClientExtensionsResponse {
278 #[serde(
280 rename = "tradeClientExtensionsModifyTransaction",
281 default,
282 skip_serializing_if = "Option::is_none"
283 )]
284 pub trade_client_extensions_modify_transaction: Option<TradeClientExtensionsModifyTransaction>,
285 #[serde(
287 rename = "relatedTransactionIDs",
288 default,
289 skip_serializing_if = "Option::is_none"
290 )]
291 pub related_transaction_ids: Option<Vec<TransactionID>>,
292 #[serde(
294 rename = "lastTransactionID",
295 default,
296 skip_serializing_if = "Option::is_none"
297 )]
298 pub last_transaction_id: Option<TransactionID>,
299}
300
301#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
303#[serde(rename_all = "camelCase")]
304pub struct UpdateTradeClientExtensionsRejection {
305 #[serde(
307 rename = "tradeClientExtensionsModifyRejectTransaction",
308 default,
309 skip_serializing_if = "Option::is_none"
310 )]
311 pub trade_client_extensions_modify_reject_transaction:
312 Option<TradeClientExtensionsModifyRejectTransaction>,
313 #[serde(
315 rename = "lastTransactionID",
316 default,
317 skip_serializing_if = "Option::is_none"
318 )]
319 pub last_transaction_id: Option<TransactionID>,
320 #[serde(
322 rename = "relatedTransactionIDs",
323 default,
324 skip_serializing_if = "Option::is_none"
325 )]
326 pub related_transaction_ids: Option<Vec<TransactionID>>,
327 #[serde(rename = "errorCode", default, skip_serializing_if = "Option::is_none")]
329 pub error_code: Option<String>,
330 #[serde(
332 rename = "errorMessage",
333 default,
334 skip_serializing_if = "Option::is_none"
335 )]
336 pub error_message: Option<String>,
337}
338
339impl Client {
340 pub async fn update_trade_client_extensions(
342 &self,
343 account_id: &AccountID,
344 trade_specifier: &TradeSpecifier,
345 body: &UpdateTradeClientExtensionsBody,
346 ) -> std::result::Result<
347 crate::ApiResponse<UpdateTradeClientExtensionsResponse>,
348 crate::OperationError<UpdateTradeClientExtensionsRejection>,
349 > {
350 let account_id_encoded = crate::client::segment(account_id.as_str());
351 let trade_specifier_encoded = crate::client::segment(trade_specifier.as_str());
352 let path = format!(
353 "/v3/accounts/{account_id_encoded}/trades/{trade_specifier_encoded}/clientExtensions"
354 );
355 self.execute(
356 Method::PUT,
357 &path,
358 None::<&()>,
359 Some(body),
360 Some(crate::client::MutationAdmission::Ordinary(account_id)),
361 None,
362 )
363 .await
364 }
365}
366
367#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
369#[serde(rename_all = "camelCase")]
370pub struct SetTradeDependentOrdersBody {
371 #[serde(
376 rename = "takeProfit",
377 default,
378 skip_serializing_if = "crate::Patch::is_unchanged"
379 )]
380 pub take_profit: crate::Patch<TakeProfitDetails>,
381 #[serde(
386 rename = "stopLoss",
387 default,
388 skip_serializing_if = "crate::Patch::is_unchanged"
389 )]
390 pub stop_loss: crate::Patch<StopLossDetails>,
391 #[serde(
397 rename = "trailingStopLoss",
398 default,
399 skip_serializing_if = "crate::Patch::is_unchanged"
400 )]
401 pub trailing_stop_loss: crate::Patch<TrailingStopLossDetails>,
402 #[serde(
408 rename = "guaranteedStopLoss",
409 default,
410 skip_serializing_if = "crate::Patch::is_unchanged"
411 )]
412 pub guaranteed_stop_loss: crate::Patch<GuaranteedStopLossDetails>,
413}
414
415#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
417#[serde(rename_all = "camelCase")]
418pub struct SetTradeDependentOrdersResponse {
419 #[serde(
421 rename = "takeProfitOrderCancelTransaction",
422 default,
423 skip_serializing_if = "Option::is_none"
424 )]
425 pub take_profit_order_cancel_transaction: Option<OrderCancelTransaction>,
426 #[serde(
428 rename = "takeProfitOrderTransaction",
429 default,
430 skip_serializing_if = "Option::is_none"
431 )]
432 pub take_profit_order_transaction: Option<TakeProfitOrderTransaction>,
433 #[serde(
436 rename = "takeProfitOrderFillTransaction",
437 default,
438 skip_serializing_if = "Option::is_none"
439 )]
440 pub take_profit_order_fill_transaction: Option<OrderFillTransaction>,
441 #[serde(
444 rename = "takeProfitOrderCreatedCancelTransaction",
445 default,
446 skip_serializing_if = "Option::is_none"
447 )]
448 pub take_profit_order_created_cancel_transaction: Option<OrderCancelTransaction>,
449 #[serde(
451 rename = "stopLossOrderCancelTransaction",
452 default,
453 skip_serializing_if = "Option::is_none"
454 )]
455 pub stop_loss_order_cancel_transaction: Option<OrderCancelTransaction>,
456 #[serde(
458 rename = "stopLossOrderTransaction",
459 default,
460 skip_serializing_if = "Option::is_none"
461 )]
462 pub stop_loss_order_transaction: Option<StopLossOrderTransaction>,
463 #[serde(
466 rename = "stopLossOrderFillTransaction",
467 default,
468 skip_serializing_if = "Option::is_none"
469 )]
470 pub stop_loss_order_fill_transaction: Option<OrderFillTransaction>,
471 #[serde(
474 rename = "stopLossOrderCreatedCancelTransaction",
475 default,
476 skip_serializing_if = "Option::is_none"
477 )]
478 pub stop_loss_order_created_cancel_transaction: Option<OrderCancelTransaction>,
479 #[serde(
481 rename = "trailingStopLossOrderCancelTransaction",
482 default,
483 skip_serializing_if = "Option::is_none"
484 )]
485 pub trailing_stop_loss_order_cancel_transaction: Option<OrderCancelTransaction>,
486 #[serde(
488 rename = "trailingStopLossOrderTransaction",
489 default,
490 skip_serializing_if = "Option::is_none"
491 )]
492 pub trailing_stop_loss_order_transaction: Option<TrailingStopLossOrderTransaction>,
493 #[serde(
495 rename = "guaranteedStopLossOrderCancelTransaction",
496 default,
497 skip_serializing_if = "Option::is_none"
498 )]
499 pub guaranteed_stop_loss_order_cancel_transaction: Option<OrderCancelTransaction>,
500 #[serde(
502 rename = "guaranteedStopLossOrderTransaction",
503 default,
504 skip_serializing_if = "Option::is_none"
505 )]
506 pub guaranteed_stop_loss_order_transaction: Option<GuaranteedStopLossOrderTransaction>,
507 #[serde(
509 rename = "relatedTransactionIDs",
510 default,
511 skip_serializing_if = "Option::is_none"
512 )]
513 pub related_transaction_ids: Option<Vec<TransactionID>>,
514 #[serde(
516 rename = "lastTransactionID",
517 default,
518 skip_serializing_if = "Option::is_none"
519 )]
520 pub last_transaction_id: Option<TransactionID>,
521}
522
523#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
525#[serde(rename_all = "camelCase")]
526pub struct SetTradeDependentOrdersRejection {
527 #[serde(
530 rename = "takeProfitOrderCancelRejectTransaction",
531 default,
532 skip_serializing_if = "Option::is_none"
533 )]
534 pub take_profit_order_cancel_reject_transaction: Option<OrderCancelRejectTransaction>,
535 #[serde(
537 rename = "takeProfitOrderRejectTransaction",
538 default,
539 skip_serializing_if = "Option::is_none"
540 )]
541 pub take_profit_order_reject_transaction: Option<TakeProfitOrderRejectTransaction>,
542 #[serde(
545 rename = "stopLossOrderCancelRejectTransaction",
546 default,
547 skip_serializing_if = "Option::is_none"
548 )]
549 pub stop_loss_order_cancel_reject_transaction: Option<OrderCancelRejectTransaction>,
550 #[serde(
552 rename = "stopLossOrderRejectTransaction",
553 default,
554 skip_serializing_if = "Option::is_none"
555 )]
556 pub stop_loss_order_reject_transaction: Option<StopLossOrderRejectTransaction>,
557 #[serde(
560 rename = "trailingStopLossOrderCancelRejectTransaction",
561 default,
562 skip_serializing_if = "Option::is_none"
563 )]
564 pub trailing_stop_loss_order_cancel_reject_transaction: Option<OrderCancelRejectTransaction>,
565 #[serde(
568 rename = "trailingStopLossOrderRejectTransaction",
569 default,
570 skip_serializing_if = "Option::is_none"
571 )]
572 pub trailing_stop_loss_order_reject_transaction: Option<TrailingStopLossOrderRejectTransaction>,
573 #[serde(
576 rename = "guaranteedStopLossOrderCancelRejectTransaction",
577 default,
578 skip_serializing_if = "Option::is_none"
579 )]
580 pub guaranteed_stop_loss_order_cancel_reject_transaction: Option<OrderCancelRejectTransaction>,
581 #[serde(
584 rename = "guaranteedStopLossOrderRejectTransaction",
585 default,
586 skip_serializing_if = "Option::is_none"
587 )]
588 pub guaranteed_stop_loss_order_reject_transaction:
589 Option<GuaranteedStopLossOrderRejectTransaction>,
590 #[serde(
592 rename = "lastTransactionID",
593 default,
594 skip_serializing_if = "Option::is_none"
595 )]
596 pub last_transaction_id: Option<TransactionID>,
597 #[serde(
599 rename = "relatedTransactionIDs",
600 default,
601 skip_serializing_if = "Option::is_none"
602 )]
603 pub related_transaction_ids: Option<Vec<TransactionID>>,
604 #[serde(rename = "errorCode", default, skip_serializing_if = "Option::is_none")]
606 pub error_code: Option<String>,
607 #[serde(
609 rename = "errorMessage",
610 default,
611 skip_serializing_if = "Option::is_none"
612 )]
613 pub error_message: Option<String>,
614}
615
616impl Client {
617 pub async fn set_trade_dependent_orders(
619 &self,
620 account_id: &AccountID,
621 trade_specifier: &TradeSpecifier,
622 body: &SetTradeDependentOrdersBody,
623 ) -> std::result::Result<
624 crate::ApiResponse<SetTradeDependentOrdersResponse>,
625 crate::OperationError<SetTradeDependentOrdersRejection>,
626 > {
627 let account_id_encoded = crate::client::segment(account_id.as_str());
628 let trade_specifier_encoded = crate::client::segment(trade_specifier.as_str());
629 let path =
630 format!("/v3/accounts/{account_id_encoded}/trades/{trade_specifier_encoded}/orders");
631 self.execute(
632 Method::PUT,
633 &path,
634 None::<&()>,
635 Some(body),
636 Some(crate::client::MutationAdmission::Ordinary(account_id)),
637 None,
638 )
639 .await
640 }
641}